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

NavMeshAgent同向跟随玩家抖动及准星抖动问题求助

解决方案:AI跟随抖动与准星抖动修复

一、修复NavMeshAgent跟随抖动问题

当前AI跟随逻辑每隔固定时间直接更新目标点,当玩家持续移动时,目标点的突变会导致NavMeshAgent频繁调整路径,加上寻路系统的即时响应,引发抖动。结合你的timer逻辑,可通过以下方式修复:

修复步骤

  1. 添加目标点平滑过渡:避免直接将玩家当前位置设为目标,通过插值算法让AI的目标点逐步趋近玩家位置,减少路径突变。
  2. 优化NavMeshAgent参数:在Inspector面板中调整寻路参数——适当提高Acceleration(加速度)和Angular Speed(角速度),降低Stopping Distance(停止距离),或启用Auto Braking并微调参数,让移动更顺滑。
  3. 同步逻辑与帧率:若仍存在抖动,可将FixedUpdate改为Update,让寻路更新与屏幕渲染帧率同步。

修改后的AiLocomotion代码

public class AiLocomotion : MonoBehaviour
{
    private PlayerController player;
    public float maxTime = 1.0f;
    public float maxDistance = 1.0f;
    public float smoothFactor = 0.15f; // 目标点平滑系数
   
    NavMeshAgent agent;
    Animator anim;
    float timer = 0.0f;
    Vector3 targetPosition;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        anim = GetComponent<Animator>();
        player = FindAnyObjectByType<PlayerController>();
        targetPosition = player.transform.position;
    }

    private void Update()
    {
        timer -= Time.deltaTime;

        if (timer < 0.0f)
        {
            float sqrDistance = (player.transform.position - targetPosition).sqrMagnitude;
            if (sqrDistance > maxDistance * maxDistance)
            {              
                targetPosition = player.transform.position;
            }
            timer = maxTime;
        }

        // 平滑过渡到目标点
        Vector3 smoothedTarget = Vector3.Lerp(agent.destination, targetPosition, smoothFactor);
        agent.SetDestination(smoothedTarget);
        
        anim.SetFloat("speed", agent.velocity.magnitude);
    }
}

二、修复准星抖动问题

准星抖动源于FixedUpdate的固定时间步与屏幕渲染帧率不一致,加上Raycast结果的微小波动,导致屏幕位置频繁突变。可通过以下方式修复:

修复步骤

  1. 将逻辑移至Update:Update与屏幕渲染同步,避免帧率差导致的视觉抖动。
  2. 添加位置平滑插值:使用线性插值让准星逐步移动到目标位置,消除微小波动带来的抖动。

修改后的Cross代码

public class Cross : MonoBehaviour
{
    public Transform target;
    public float offset;
    public float distance;
    public float smoothSpeed = 6f; // 平滑移动速度
    private Vector3 targetScreenPos;

    void Update()
    {
        if (Physics.Raycast(target.position, target.forward, out RaycastHit hit, distance))
            targetScreenPos = Camera.main.WorldToScreenPoint(hit.point);
        else    
            targetScreenPos = Camera.main.WorldToScreenPoint(target.position + (target.forward * offset));

        // 平滑移动准星到目标位置
        transform.position = Vector3.Lerp(transform.position, targetScreenPos, smoothSpeed * Time.deltaTime);
    }
}

内容的提问来源于stack exchange,提问作者Mehmet YILDIZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:53:21