在初学这个Unity的时候大家往往喜欢自己去写脚本让物体做简单的移动旋转和抬头低头,但是往往会出现抬头和低头的时候再去左右旋转会出现身体侧偏的现象,那么这个原因是因为没有处理好物体的父子关系和坐标系。
出现上种现象是里大家都是把抬头低头和旋转移动的代码写在了一个物体上面,但是事实上,抬头低头是头的事情,而左右旋转和前后左右移动往往是身体的事情,这就牵扯到了父子关系(父动子动,子动父不动)。身体我们一般用一个胶囊体(Capsule)来代替如图:
(身体作为父物体,相机作为子物体)
如此设置好之后,我们需要将移动和旋转的代码给身体(这里的Capsule001)而把抬头和低头的代码给相机
身体的移动和旋转:
void Update () {
Move();
}
private void Move() //通过控制键盘wasd和上下左右控制相机身体的位移和左右旋转
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
transform.position += transform.forward * Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
transform.position += transform.forward * Time.deltaTime * -5;
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{
transform.position += transform.right * Time.deltaTime * -5;
}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{
transform.position += transform.right * Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.Q))
{
transform.Rotate(Vector3.up * Time.deltaTime * -45);
}
if (Input.GetKey(KeyCode.E))
{
transform.Rotate(Vector3.up * Time.deltaTime * 45);
}
}
这里一定要留意的是旋转时的坐标系:Vectory是世界坐标系,而transform是自身坐标
相机的抬头和低头:
void Update () {
Move();
}
private void Move() //控制俯视和仰视
{
if (Input.GetKey(KeyCode.R)){
transform.Rotate(Vector3.right * Time.deltaTime * -45);
}
else if (Input.GetKey(KeyCode.F))
{
transform.Rotate(Vector3.right * Time.deltaTime * 45);
}
}
这就是最开始遇到的一个小问题,这里做个总结,希望能帮到大家!