为什么摄像机的逻辑代码要写在LateUpdate函数中?

  1. Update函数执行完成之后,才会执行LateUpdate函数。

  2. 如果在Update函数里面写了摄像机相关的处理,那么有可能在动画逻辑还没有执行完,就去渲染摄像机了,这显然不符合正常逻辑

using System;
using UnityEngine;

/// <summary>
/// CameraFollow - 摄像机跟随类
/// 
/// 作者: DY
/// 创建日期: 2024-12-26
/// 版本: 1.0
/// 
/// 详细描述: 
/// 1. 摄像机在物体斜后方,通过角度控制倾斜率
/// 2. 通过鼠标滚轮可以控制摄像机距离目标物体物体的距离(有最大和最小限制)
/// 3. 摄像机看向物体的上方的一个位置(可以调节)
/// 4. 相机跟随(有一个推进的效果)
/// 5. 相机看向物体
/// </summary>
public class CameraFollow : MonoBehaviour
{
    [Tooltip("目标对象")]
    public Transform targetTF;

    [Tooltip("高度偏移")]
    public float offestHieght = 0;

    [Tooltip("倾斜角度")]
    public float angle = 30;

    [Tooltip("摄像机离目标位置的距离")]
    public float distance = 15;

    public float maxDistance = 15;
    public float minDistance = 3;

    [Tooltip("滚轮速度")]
    public float scrollSpeed = 2;

    [Tooltip("转向速度")]
    public float roundSpeed = 1;

    [Tooltip("移动速度")]
    public float moveSpeed = 1;


    // 进行偏移和新的位置
    Vector3 newPos;
    // 摄像机指向目标的方向
    Vector3 dir;

    private void Update()
    {
        MouseScrollerInput();
    }

    private void MouseScrollerInput()
    {
        distance += Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
        distance = Mathf.Clamp(distance, minDistance, maxDistance);
    }

    private void LateUpdate()
    {
        newPos = targetTF.position + transform.up * offestHieght;
        dir = Quaternion.AngleAxis(angle,transform.right) * -targetTF.forward;
        transform.position = Vector3.Lerp(transform.position, newPos + dir * distance, Time.deltaTime * moveSpeed);

        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(-dir), Time.deltaTime*roundSpeed);


        Debug.DrawLine(transform.position, targetTF.position + transform.up * offestHieght, Color.red);
    }

}

版本2