Unity 控制物体旋转、朝向的一些方法

时间:2024-10-22 07:11:35

Unity 控制物体旋转、朝向的一些方法

1,transform. Lookat( )

transform.Lookat(target.position);

立即看向target的位置, 很生硬.

2,( )

transform.rotation = Quaternion.LookRotation(target.position - self.position);

也是,立即看向target的位置。

3,( )

Quaternion q = Quaternion.LookRotation(target.position - self.position);
Quaternion.RotateTowards(self.rotation, q, turnSpeed * Time.deltaTime);

匀速转向target的位置。(匀速转过去, 虽然不那么生硬了, 但是还不够自然)

4,( )

Quaternion q = Quaternion.LookRotation(target.position - self.position);
Quaternion.Slerp(self.rotation, q, turnSpeed * Time.deltaTime);

非匀速转向target的位置。(人物转向看起来比较合理, 比较自然了)
Lerp()方法是平分长度, Slerp()方法是平分弧度

5, ( )

transform.rotate(Vector3.up, Space.Self);

地球自转。

6,( )

transform.rotateAround(sun.position, Vector3.up, turnSpeed * Time.deltaTime);

绕太阳公转。

7, 四元数*向量

将 饶Z轴 旋转angle度

Vector3 dir = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right;

以下是DOTween的方法

1, ()

transform.DORotate(new Vector3(0, 60, 0), 0.3f);

0.3秒转到(0, 60, 0); Rotation
DOTween的, 注意他的参数是个三元数, 要是想与另一个物体的朝向一致, 就:

transform.DORotate(other.transform.eulerAngles, 0.3f);

2, ()

transform.DOLookAt(other.transform, 0.3f)

还是DOTween的, 和差不多, 设置个时间, 能达到lerp的效果, 还能在后面.SetEase();
加一些运动曲线


综合例子:

项目需求: 玩家尽量看向敌人的方向(远离敌人移动时也看向敌人), WASD控制移动和转向

public class PlayerControl : MonoBehaviour
{
    //规定以为正方向, 而不是世界坐标的正方向
    public Transform towards;

    public float moveSpeed;
    public float turnSpeed;

    private void Update()
    {
        Move();
    }

    private void Move()
    {
        float v = Input.GetAxis("Vertical");
        float h = Input.GetAxis("Horizontal");

        //移动
        transform.Translate(new Vector3(h, 0, v) * Time.deltaTime * moveSpeed, towards);//正方向为

        //玩家操作转向
        if (v != 0 || h != 0)
        {
            Vector3 tempTowards;
            if (v < 0)
            {
                //abs是为了禁止玩家人物朝后
                //人物 倒退时和前进时的左右转向是相反的,所以是-h
                tempTowards = towards.forward * Mathf.Abs(v) + towards.right * -h;
            }
            else
            {
                tempTowards = towards.forward * v + towards.right * h;
            }
            Quaternion q = Quaternion.LookRotation(tempTowards);
            //平滑转向
            transform.rotation = Quaternion.Slerp(transform.rotation, q, turnSpeed * Time.deltaTime);
        }
        //玩家没操作的时候, 就看向正方向
        else
        {
            Quaternion q = Quaternion.LookRotation(towards.forward);
            transform.rotation = Quaternion.Slerp(transform.rotation, q, turnSpeed * Time.deltaTime);
        }
    }
}