一个第一人称移动+旋转视角的实例:
1.控制前后左右走的方法move()
void Move()
{
float x=Input.GetAxis("Horizontal");
float z=Input.GetAxis("Vertical");
Vector3 fwd=transform.forward;
Vector3 f=new Vector3(fwd.x,0,fwd.z).normalized;
Vector3 r=transform.right;//forward的右边就是物体的右边
Vector3 move=f*z+r*x;
transform.position+=move*speed*Time.deltaTime;
}
其中再次创建f变量的目的(为什么不直接把Vector3 fwd=transform.forward标准化):
因为这个实例可以通过鼠标来实现视角旋转的效果,所以物体可以抬头低头,所以forward获取出来的向量是有y值的,如果直接作为前面的向量进行物体的移动,物体就可以飞上天了:)
2.让鼠标控制镜头旋转的MouseLook
void MouseLook()
{
float mx=Input.GetAxis("Mouse X");
float my=Input.GetAxis("Mouse Y");
Quaternion qx=Quaternion.Euler(0,mx,0);//左右转是绕着y轴的
Quaternion qy=Quaternion.Euler(my,0,0);
transform.rotation=qx*transform.rotation;
transform.rotation=transform.rotation*qy;
//没懂
float angle=transform.eulerAngles.x;
if(angle>180) { angle-=360;}
if(angle<-180){ angle+=360; }
//为了对俯仰角做出限制,使超过80度或小于-80度的强制设置成80或-80
if(angle>80)
{
Debug.Log("A"+transform.eulerAngles.x);
transform.eulerAngles=new Vector3(80,transform.eulerAngles.y,0);
}
if(angle<-80)
{
Debug.Log("B"+transform.eulerAngles.x);
transform.eulerAngles=new Vector3(-80,transform.eulerAngles.y,0);
}
}