Unity中动画对象加Nav Mesh Agent后不跟随玩家却前往(0,0,0)的解决建议
嘿,我帮你梳理下可能导致这个问题的几个常见原因,结合你给出的代码片段,大概率是这几个点出了状况:
代码截断导致目标位置错误
你提供的代码里Update方法的nav.SetDestination(pla...明显没写完,正确的写法应该是传入玩家的位置player.position。如果这里参数缺失或者写错,Nav Mesh Agent找不到有效目标,就会默认前往世界原点(0,0,0)。玩家对象的标签不匹配
确认你的玩家GameObject确实设置了Player标签——GameObject.FindGameObjectWithTag("Player")如果找不到对应标签的对象,player变量会变成null。这时候调用player.position会触发报错,Agent也会因为没有有效目标而走到原点。可以在Awake里加个调试日志排查:void Awake () { player = GameObject.FindGameObjectWithTag ("Player").transform; nav = GetComponent <NavMeshAgent> (); if (player == null) { Debug.LogError("找不到带有Player标签的对象!检查你的玩家对象标签设置"); } }Nav Mesh烘焙不完整或错误
就算代码没问题,如果场景的Nav Mesh没正确烘焙,Agent也无法规划到玩家位置的路径,最终只能走向原点。解决步骤:- 打开
Window > AI > Nav Mesh窗口 - 确保玩家和敌人活动区域的地面、可走平台都勾选了
Navigation Static - 点击窗口里的
Bake按钮重新烘焙导航网格
- 打开
Nav Mesh Agent组件参数异常
检查敌人身上的Nav Mesh Agent组件:- 确认
Speed、Angular Speed数值不为0,不然敌人会看起来没移动 - 检查
Area Mask是否包含你烘焙的可行走区域(比如默认的Walkable) - 确保
Auto Traverse Off Mesh Link这类必要选项处于勾选状态
- 确认
这里给你一份修正后的完整代码参考:
using UnityEngine; using UnityEngine.AI; public class EnemyMovement : MonoBehaviour { Transform player; NavMeshAgent nav; void Awake () { player = GameObject.FindGameObjectWithTag ("Player").transform; nav = GetComponent<NavMeshAgent>(); // 调试检查:确认找到玩家对象 if (player == null) { Debug.LogError("错误:场景中没有找到带有'Player'标签的对象!"); } } void Update () { // 只有找到玩家时才设置目标位置 if (player != null) { nav.SetDestination(player.position); } } }
内容的提问来源于stack exchange,提问作者Don_Huan




