You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:06:03