【问题标题】:Move camera on global XZ plane regardless of local angle (Unity)无论局部角度如何,在全局 XZ 平面上移动相机(Unity)
【发布时间】:2020-05-19 14:23:36
【问题描述】:

我正在编写主摄像机在 XZ 轴上的移动脚本。当光标接近相应的屏幕边缘之一时,相机应水平移动(向前、向后、向右、向左)。 左右运动完美无缺;

To the left

To the right

另一方面,在其 z 轴上向后移动相机不起作用,因为相机略微旋转。

Camera tilt

因此,当您尝试将其水平向前移动时,它反而会更靠近对象。

Closer when it should move forward

Away when it should move back

      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 平面上移动。我可以用什么替换注释行,以便相机执行所需的运动?

【问题讨论】:

  • 请查看统一文档中transform.translate的重载方法。

标签: c# unity3d game-physics


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2023-03-27
  • 2012-08-28
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
相关资源
最近更新 更多