为什么Unity中背景跟随相机会出现延迟、移动平滑及停止抖动问题?
问题原因
- 跟随目标逻辑错误:背景的跟随对象设置为玩家而非相机,当相机被边界Clamp限制移动、玩家仍处于移动状态时,背景会跟随玩家偏移,和相机位置产生错位,表现为滞后、抖动。
- 生命周期使用错误:两个脚本的位置更新逻辑都放在
FixedUpdate中,FixedUpdate为物理帧,和渲染帧Update帧率不匹配,和渲染相关的位置更新逻辑和渲染时机不同步,自然会出现抖动、滞后问题。 - 脚本执行顺序不确定:Unity默认同生命周期函数的脚本执行顺序是随机的,若同一帧背景先更新位置、相机后更新,背景就会永远比相机慢一帧,出现持续滞后。
- 无用冗余逻辑:代码中
Vector3.Lerp的第三个插值参数设置为1,等于直接赋值,没有任何平滑效果,留用反而会增加逻辑混淆风险。
修复方案
1. 调整相机跟随脚本
将生命周期改为LateUpdate(所有Update逻辑执行完成后运行,保证拿到玩家最新位置),删除冗余的Lerp代码:
public class CameraFollowScript : MonoBehaviour { [SerializeField] public Transform player; [SerializeField] private float rightLimit; [SerializeField] private float leftLimit; [SerializeField] private float bottomLimit; [SerializeField] private float topLimit; void LateUpdate() { if (player) { transform.position = new Vector3(player.position.x, player.position.y, transform.position.z); } transform.position = new Vector3( Mathf.Clamp(transform.position.x, leftLimit, rightLimit), Mathf.Clamp(transform.position.y, bottomLimit, topLimit), transform.position.z); } private void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawLine(new Vector2(leftLimit, topLimit), new Vector2(rightLimit, topLimit)); Gizmos.DrawLine(new Vector2(leftLimit, bottomLimit), new Vector2(rightLimit, bottomLimit)); Gizmos.DrawLine(new Vector2(leftLimit, topLimit), new Vector2(leftLimit, bottomLimit)); Gizmos.DrawLine(new Vector2(rightLimit, topLimit), new Vector2(rightLimit, bottomLimit)); } }
2. 调整背景控制脚本
将跟随目标改为相机而非玩家,同样使用LateUpdate执行位置更新:
public class BackGroundScript : MonoBehaviour { [SerializeField] public Transform followCamera; void LateUpdate() { if (followCamera) { transform.position = new Vector3(followCamera.position.x, transform.position.y, transform.position.z); } } }
3. 可选优化(如需保留平滑跟随效果)
如果需要实现自然的平滑跟随效果,不要使用固定插值系数,改为和帧时间绑定的动态系数:
// 声明平滑系数参数 [SerializeField] private float smoothSpeed = 10f; // 位置更新逻辑改为 transform.position = Vector3.Lerp(transform.position, targetPos, smoothSpeed * Time.deltaTime);
4. 执行顺序校验
如果调整后仍有轻微抖动,可以进入Unity的Edit > Project Settings > Script Execution Order设置界面,将CameraFollowScript的执行顺序调整到BackGroundScript之前,保证相机位置先更新,背景再同步位置,完全消除帧差问题。
内容的提问来源于stack exchange,提问作者VillyFiki
相关产品推荐
相关产品推荐

