Unity 3D中带Nav Mesh Agent的GameObject待机动画异常问题
问题排查与修复方案
1. 修复脚本致命错误
你的脚本存在两处直接导致逻辑失效的问题:
- 组件调用顺序错误:
Start方法中先给agent.destination赋值,但此时agent还未通过GetComponent获取实例,会触发空引用异常。 - 未定义
player变量:直接使用player.position会引发编译错误,脚本无法正常执行。
修正后的脚本:
using UnityEngine; public class Inimigo : MonoBehaviour { private Animator animator; private UnityEngine.AI.NavMeshAgent agent; // 在Inspector面板拖拽玩家对象赋值 public Transform player; void Start() { // 优先获取组件实例 animator = GetComponent<Animator>(); agent = GetComponent<UnityEngine.AI.NavMeshAgent>(); // 避免空引用,仅在player有效时设置目的地 if (player != null) { agent.destination = player.position; } } void Update() { // 提前校验组件有效性,防止空引用 if (agent == null || animator == null) return; if (agent.velocity.magnitude == 0) { animator.SetBool("parado", false); } else if (agent.remainingDistance > agent.stoppingDistance) { animator.SetBool("parado", true); } else { animator.SetBool("parado", false); } } }
2. 校正Animator状态机配置
根据你的描述,状态机逻辑可能存在倒置:
- 确认默认状态:Animator控制器的默认状态需设为
Z_Idle(静止动画),而非parado状态。 - 调整过渡规则:
- 若
parado=true对应行走状态,需设置从Z_Idle到Z_Walk的过渡,条件为parado=true;同时添加从Z_Walk到Z_Idle的过渡,条件为parado=false。 - 取消过渡的Has Exit Time勾选:无需等待动画播放完毕即可切换状态,保证状态响应即时性。
- 若
3. 验证NavMesh配置
- 确认场景已完成NavMesh烘焙,僵尸和玩家的位置都处于NavMesh可行走区域内。
- 检查Nav Mesh Agent组件的
Speed、Acceleration参数值大于0,避免因速度为0导致僵尸无法移动,进而触发错误动画状态。
4. 调试确认
- 运行游戏时打开Animator窗口,实时观察
parado参数的数值变化与状态机切换情况,确认参数是否正确传递。 - 查看Console面板,排查是否存在编译错误或空引用异常,这类错误会直接中断脚本逻辑。
内容的提问来源于stack exchange,提问作者codertocode
相关产品推荐
相关产品推荐

