首页/ 第 15 章 · 寻路与导航/ 第 258 课
LESSON 258 · 寻路与导航

导航与动画整合

导航动画整合完成。下一课做玩家跟随。

⏱ 约 14 分钟📊 难度:入门🗂 第 15 章 · 寻路与导航📍 第 258 / 300 课
课程进度
258 / 300

🎯本节学习目标

  • 整合速度动画
  • 实现攻击停顿
  • 实现战斗状态

🚀课程导读

“AI 走路时有走路动画、停下攻击”——把导航与动画状态机打通。本课整合。

速度驱动动画

走/跑/停自动切换。

  1. 【准备】敌人 Animator(第 130 课)状态:Idle、Walk、Run、Attack、Death。
  2. 【参数】Speed(Float)。
  3. 【代码】
  4. public NavMeshAgent agent; public Animator anim;
  5. void Update() {
  6. float speed = agent.velocity.magnitude;
  7. anim.SetFloat("Speed", speed, 0.1f, Time.deltaTime);
  8. }
  9. 【效果】agent 走→Walk 动画;停→Idle。
  10. 【阈值】Blend Tree 把 Idle(0)/Walk(1)/Run(2) 按速度融合(第 134 课)。
  11. 【朝向】agent 转向由它自己处理(Angular Speed),动画跟朝向即可。
  12. 【到达停顿】agent 停在攻击距离时自动转 Idle(速度 0)。
  13. 【测试】敌人走近/停下,动画跟着切换。
  14. 【完成】AI“会表演”了!
💡
导航动画 = agent.velocity 大小 → SetFloat(Speed) → 混合树。一行打通。

攻击与战斗状态

打到你了。

  1. 【攻击触发】到达攻击距离:
  2. void Update() {
  3. if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending) {
  4. Attack();
  5. }
  6. }
  7. void Attack() {
  8. agent.isStopped = true; // 停下
  9. anim.SetTrigger("Attack");
  10. // 攻击动画事件里判定伤害(第 135/240 课)
  11. }
  12. 【恢复追击】攻击结束(动画事件/协程)后:
  13. agent.isStopped = false;
  14. agent.SetDestination(player.position);
  15. 【攻击冷却】定时攻击(别连发):
  16. public float attackCooldown = 1.5f;
  17. private float lastAttack;
  18. if (Time.time - lastAttack > attackCooldown) { lastAttack = Time.time; Attack(); }
  19. 【死亡】hp<=0:anim.SetTrigger("Death") + 停 agent + 布娃娃(第 242 课)。
  20. 【完整循环】追击(走)→ 停下(攻)→ 追击…
  21. 【测试】敌人追、停、攻击、死亡全流程动画正确。
  22. 【完成】敌人“有血有肉”了!
战斗循环 = 追击(SetDestination)→ 停下(isStopped)→ 攻击(Trigger+冷却)→ 恢复。四步。

常见错误与排查

错误:攻击时角色还在走?
原因:没停 agent 或没设 StoppingDistance
解决:攻击时 agent.isStopped=true;Agent 的 StoppingDistance 设成攻击距离。

动手练习

课后小任务(做出来才算真的学会)

  • 用速度驱动敌人走/停动画
  • 实现攻击停顿与冷却
  • 整合死亡动画

本节小结

导航动画整合完成。下一课做玩家跟随。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课群组 AI 与避让