Unity LookAt 之 获得转向角度并平滑旋转角度

2025-10-23 02:34:30

1、打开Unity,新建一个空工程,具体如下图

Unity LookAt 之 获得转向角度并平滑旋转角度

2、在场景中添加两个Cube,作为父子物体,然后再添加一个Sphere 作为要望向 的目标,具体如下图

Unity LookAt 之 获得转向角度并平滑旋转角度

3、在工程中,添加一个脚本 LookAtSmooth,双击打开脚本进行编辑,具体如下图

Unity LookAt 之 获得转向角度并平滑旋转角度

4、LookAtSmooth 脚本的具体代码和代码说明如下图

Unity LookAt 之 获得转向角度并平滑旋转角度

Unity LookAt 之 获得转向角度并平滑旋转角度

Unity LookAt 之 获得转向角度并平滑旋转角度

5、LookAtSmooth 脚本的具体内容如下:

using UnityEngine;

public class LookAtSmooth : MonoBehaviour

{

        public Transform player_Transform;      // 旋转的物体参数

    public Transform target_Transform;      // 目标目标参数

    // Use this for initialization

    void Start()

    {

        // 初始化旋转数据

        Init_LookAtRotate(player_Transform, target_Transform);

    }

    // Update is called once per frame

    void Update()

    {

        // 开始旋转

        Rotate_Func(player_Transform);

    }

    /// <summary>

    /// 使用LookAt获得角度,并计算出旋转速度

    /// </summary>

    /// <param name="raw_Transform">需要转的物体</param>

    /// <param name="target_Transform">转向面对的物体</param>

    void Init_LookAtRotate(Transform raw_Transform, Transform target_Transform)

    {

        // 保存转身前的角度   

        raw_rotation = raw_Transform.rotation;

        // 获得并保存目标角度   

        raw_Transform.LookAt(target_Transform.position);

        lookat_rotation = raw_Transform.rotation;

        // 恢复到原来的角度  

         raw_Transform.rotation = raw_rotation;

        // 计算出需要的旋转角度   

        float rotate_angle = Quaternion.Angle(raw_rotation, lookat_rotation);

        // 获得lerp速度  

         lerp_speed = per_second_rotate / rotate_angle;

        lerp_tm = 0.0f;

    }

    /// <summary>

    /// 使用 Quaternion.Lerp 进行旋转

    /// </summary>

    /// <param name="raw_Transform">需要转的物体</param>

    void Rotate_Func(Transform raw_Transform)

    {

        // 旋转完成

        if (lerp_tm >= 1)

        {

            raw_Transform.rotation = lookat_rotation;

            return;

        }

        // 使用 Quaternion.Lerp 进行旋转

        lerp_tm += Time.deltaTime * lerp_speed;

        raw_Transform.rotation = Quaternion.Lerp(raw_rotation, lookat_rotation, lerp_tm);

            }

        private Quaternion raw_rotation;                // 保存转身前的角度  

    private Quaternion lookat_rotation;             // 准备面向的角度   

    private float per_second_rotate = 120.0f;       // 转身速度(每秒能转多少度)    

    float lerp_speed = 0.0f;                        // 旋转角度越大, lerp变化速度就应该越慢   

    float lerp_tm = 0.0f;                           // lerp的动态参数

}

6、脚本编译正确,回到Unity界面,新建一个GameObject 然后把脚本挂载上去,把Cube父物体作为原生物体,Sphere作为目标物体,具体如下图

Unity LookAt 之 获得转向角度并平滑旋转角度

7、运行场景,就会看到Cube,平滑的移动到目标位置,具体如下图

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢