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

Unity中如何让NavMesh Agent持续跟随预制体克隆的玩家角色?

解决Unity NavMesh Agent无法持续跟随克隆玩家的问题

核心问题分析

从你的描述和代码来看,Debug能正确识别到生成的玩家,但Agent只停留在出生点,大概率是脚本执行顺序或NavMesh Agent参数配置的问题,也可能是玩家生成后Agent没有正确响应位置更新。

分步解决方案

1. 调整脚本执行顺序,确保玩家先生成

如果NPC_Follow的Start()方法比LoadCharacter的Start()先执行,即使后续能找到玩家,Agent可能初始状态异常。

  • 打开Edit > Project Settings > Script Execution Order
  • 将LoadCharacter脚本拖动到NPC_Follow上方,让它先执行

2. 优化NavMesh Agent参数配置

检查动物身上的NavMesh Agent组件:

  • Speed/Angular Speed:确保数值大于0,否则Agent无法移动
  • Auto Braking:关闭该选项,避免Agent到达初始位置后自动停止,无法响应玩家后续移动
  • Acceleration:设置合适的数值,让Agent能快速跟上玩家的移动速度

3. 代码优化:用事件监听玩家生成(更可靠的方式)

避免依赖FindGameObjectWithTag的时机问题,通过事件通知Agent玩家已生成:

修改LoadCharacter.cs,添加玩家生成事件:

public class LoadCharacter : MonoBehaviour
{
    public static event System.Action<GameObject> OnPlayerSpawned;

    public GameObject[] characterPrefabs;
    public Transform playerStartPosition;
    private string selectedCharacterDataName = "SelectedCharacter";
    int selectedCharacter;
    public GameObject playerObject;

    void Start()
    {
        selectedCharacter = PlayerPrefs.GetInt(selectedCharacterDataName, 0);
        playerObject = Instantiate(characterPrefabs[selectedCharacter],
                                 playerStartPosition.position,
                                 characterPrefabs[selectedCharacter].transform.rotation);
        // 触发玩家生成事件
        OnPlayerSpawned?.Invoke(playerObject);
    }
}

修改NPC_Follow.cs,监听事件并设置目标:

using UnityEngine;
using UnityEngine.AI;

public class NPC_Follow : MonoBehaviour
{
    private GameObject targetPlayer;
    NavMeshAgent myAgent;

    void OnEnable()
    {
        LoadCharacter.OnPlayerSpawned += SetTargetPlayer;
    }

    void OnDisable()
    {
        LoadCharacter.OnPlayerSpawned -= SetTargetPlayer;
    }

    void Start()
    {
        myAgent = GetComponent<NavMeshAgent>();
        // 兜底:尝试获取已存在的玩家
        targetPlayer = GameObject.FindGameObjectWithTag("Player");
        if (targetPlayer != null)
        {
            Debug.Log("已找到玩家:" + targetPlayer.name);
        }
    }

    void SetTargetPlayer(GameObject player)
    {
        targetPlayer = player;
        Debug.Log("玩家生成完成,跟随目标设置为:" + targetPlayer.name);
    }

    void Update()
    {
        if (targetPlayer != null && myAgent.isActiveAndEnabled)
        {
            myAgent.destination = targetPlayer.transform.position;
        }
    }
}

4. 验证NavMesh烘焙状态

  • 确保游戏场景中的地面已烘焙NavMesh(Window > AI > NavMesh)
  • 烘焙时确认Include Layers包含玩家和动物所在的层级(默认Everything即可)
  • 玩家的Collider需设置为NavMesh Obstacle或确保不会阻碍Agent路径

5. 检查玩家移动逻辑

确认玩家移动时,transform.position确实在更新:

  • 如果用Root Motion动画,需确保动画的Root Motion选项正确开启,且移动逻辑同步更新transform
  • 测试时可以在玩家的Update中打印transform.position,确认位置变化正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:14:53