首页 > 解决方案 > 无论局部角度如何,在全局 XZ 平面上移动相机(Unity)

问题描述

我正在编写主摄像机在 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#unity3dgame-physics

解决方案


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

就像是:

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

它也可以在 localPosition 上完成,例如

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;
}

推荐阅读