在非正交的摄像机旋转时,而我们又需要通过键盘或鼠标控制摄像机的移动
在这里就需要写一个函数来根据参数返回正确的方向
我这里是将一个空对象设为主摄像机的父对象
空对象进行坐标移动,摄像机进行旋转
int cameraMoveDistanceRotate;//定义当前旋转方向
//定义枚举:上下左右
enum direction
{
up,
down,
left,
right
}
屏幕空间可以看为二维坐标,当我们想要通过代码使屏幕空间移动时,控制相应的坐标移动即可。
在我的项目中,我采用的是空对象X-Z平面进行移动。
控制屏幕移动时,采用Vector3.forward*cameraSpeed*Time.delTime的向上移动。
而旋转相机后,由于相机控制着屏幕空间的显示
如果继续使用以前的Vector3.forward来向上移动则会导致移动的混乱
所以就不能继续使用Vector3.forward了,需要根据旋转的方向来相应改变需要乘以的方向。而为了方便,我使用的为按下只旋转90度,就不用进行复杂的角度变换,定义函数更换相应方向即可
void Start () {
//初始化当前旋转方向,初始化值为空对象与摄像机方向控制
//我的摄像机Y轴初始旋转180度,所以向上需反过来所以初始化为down
cameraMoveDistanceRotate = (int)direction.down;
}
Vector3 cameraDirect(direction direct)
{
switch (direct)
{
case direction.up:
{
switch (cameraMoveDistanceRotate)
{
case (int)direction.up:
return Vector3.right;
case (int)direction.down:
return Vector3.back;
case (int)direction.left:
return Vector3.left;
case (int)direction.right:
return Vector3.forward;
}
}
break;
case direction.down:
{
switch (cameraMoveDistanceRotate)
{
case (int)direction.up:
return Vector3.left;
case (int)direction.down:
return Vector3.forward;
case (int)direction.left:
return Vector3.right;
case 3:
return Vector3.back;
}
}
break;
case direction.right:
{
switch (cameraMoveDistanceRotate)
{
case (int)direction.up:
return Vector3.back;
case (int)direction.down:
return Vector3.left;
case (int)direction.left:
return Vector3.forward;
case (int)direction.right:
return Vector3.right;
}
}
break;
case direction.left:
{
switch (cameraMoveDistanceRotate)
{
case (int)direction.up:
return Vector3.forward;
case (int)direction.down:
return Vector3.right;
case (int)direction.left:
return Vector3.back;
case (int)direction.right:
return Vector3.left;
}
}
break;
}
return Vector3.zero;
}