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
相关产品推荐
相关产品推荐

