我正在尝试使用Unity引擎从头开始创建RTS游戏。我从这个Unity RTS game tutorial开始,我正在设置相机。基本上我所做的是,我生成[x,0,z]
向量用于移动。然后我需要在相机上应用它。
如果相机没有旋转,它可以很好地工作 - 但它通常是旋转的,必须可以旋转。
根据教程and the docs,我可以使用Camera.main.transform.TransformDirection(MyVector)
将矢量转换为相机的视角。我在做什么:
//Get mouse position
float xpos = Input.mousePosition.x;
float ypos = Input.mousePosition.y;
//Create vector for movement
Vector3 movement = new Vector3(0, 0, 0);
//horizontal camera movement
if (xpos >= 0 && xpos < ResourceManager.ScrollWidth)
{
movement.x -= ResourceManager.ScrollSpeed;
}
else if (xpos <= Screen.width && xpos > Screen.width - ResourceManager.ScrollWidth)
{
movement.x += ResourceManager.ScrollSpeed;
}
//vertical camera movement
if (ypos >= 0 && ypos < ResourceManager.ScrollWidth)
{
movement.z -= ResourceManager.ScrollSpeed;
}
else if (ypos <= Screen.height && ypos > (Screen.height - ResourceManager.ScrollWidth))
{
movement.z += ResourceManager.ScrollSpeed;
}
//make sure movement is in the direction the camera is pointing
//but ignore the vertical tilt of the camera to get sensible scrolling
movement = Camera.main.transform.TransformDirection(movement);
//Up/down movement will be calculated diferently
movement.y = 0;
但是,如果我这样做,垂直移动对于初始相机旋转不起作用,当我旋转相机时,移动以奇怪的速度发生。
如何在相机上正确应用运动矢量?
答案 0 :(得分:2)
嗯,这里的问题是TransformDirection将保留向量的长度。因此,如果向下倾斜相机,则整个长度将分布在y,x和z轴之间。由于您只是消除了y部分,因此矢量会变短。相机倾斜的越多,其他两个轴的损失就越多。
通常更容易旋转单位矢量,根据需要进行修改,并在完成后将其标准化。然后可以通过实际运动矢量来缩放此单位矢量。这样的事情:
// [...]
Vector3 forward = Camera.main.transform.forward;
Vector3 right = Camera.main.transform.right;
forward.y = 0f;
right.y = 0f; // not needed unless your camera is also rotated around z
movement = forward.normalized * movement.z + right.normalized * movement.x;
// [...]
另一种方法是分离你的两个旋转。因此,通过使用仅围绕y旋转并且使相机成为该游戏对象的孩子的空GameObject。现在,相机只会围绕局部x轴旋转,以便按照您想要的方式倾斜。要将摄像机视线调整到不同的方向,您可以围绕y旋转空的GameObject。这样你就可以使用空GameObject的变换来改变你在代码中的方向,因为相机的倾斜并不重要。