为什么摄像机的逻辑代码要写在LateUpdate函数中?
Update函数执行完成之后,才会执行LateUpdate函数。
如果在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);
}
}
评论区