在全局XZ平面上移动摄像机,而不考虑局部角度(Unity)

问题描述 投票:-1回答:1

我正在编写主摄像头在XZ轴上移动的脚本。当光标接近相应的屏幕边缘时,摄像机应该水平移动(前、后、右、左)。左右移动的效果很好。

向左

向右

另一方面,在z轴上向后移动摄像机并不可行,因为摄像机是微微旋转的。

摄像机倾斜度

因此,当你试图将它水平向前移动时,它反而会离物体越来越近。

当它应该向前移动的时候,却越来越近

该走的时候走,该回的时候回

      if (Input.mousePosition.y >= Screen.height - brdThcknss)
            { //this line is to be replaced
                //transform.Translate(Vector3.forward * Time.deltaTime * panSpeed);
            }
            if (Input.mousePosition.y <= brdThcknss)
            {//this line is to be replaced
                //transform.Translate(Vector3.back * Time.deltaTime * panSpeed);
            }
            if (Input.mousePosition.x >= Screen.width - brdThcknss)
            {
                transform.Translate(Vector3.right * Time.deltaTime * panSpeed);
            }
            if (Input.mousePosition.x <= brdThcknss)
            {
                transform.Translate(Vector3.left * Time.deltaTime * panSpeed);
            }

还有必要提及的是,无论摄像机的角度如何(摄像机的轨道),摄像机都应该在世界的XZ平面上移动。我可以用什么来替换这些注释行,使摄像机执行所需的运动?

c# unity3d game-physics
1个回答
0
投票

AresCaelum的评论很可能是正确的,但如果你想完全避免Translate功能,你可以简单地给对象的位置分配一个新的Vector3。

就像这样。

transform.position = new Vector3(newX, transform.position.y, newZ);

也可以在局部位置上做这样的操作,比如

transform.localposition = new Vector3(x,y,z);

如果你想避免每次运行这段代码时都创建一个新的Vector3,你可以简单地设置一个Vector3变量(我们称它为 "pos"),然后执行以下操作。

Vector3 pos = Vector3.zero;

void Start()
{
   pos.y = whateverYValueYouWant;
}

void Update()
{
    pos.x = newX;
    pos.z = newZ;
    transform.position = pos;
}
© www.soinside.com 2019 - 2024. All rights reserved.