首页/ 第 13 章 · 2D 游戏开发/ 第 211 课
LESSON 211 · 2D 游戏开发

2D 敌人 AI(巡逻与追击)

2D 敌人 AI 完成。下一课做道具收集。

⏱ 约 16 分钟📊 难度:入门🗂 第 13 章 · 2D 游戏开发📍 第 211 / 300 课
课程进度
211 / 300

🎯本节学习目标

  • 实现敌人巡逻
  • 实现追击玩家
  • 实现敌人攻击

🚀课程导读

敌人会来回走、看到你追你——最简单的 AI 也有“状态机”思维。本课实现经典敌人。

巡逻 AI

来回走 + 悬崖转身。

  1. 【敌人基础】精灵 + Rigidbody2D + BoxCollider2D + 脚本 EnemyPatrol。
  2. 【巡逻】来回移动并翻转:
  3. public float speed = 2f;
  4. public Transform groundCheck; public LayerMask groundLayer;
  5. void Update() {
  6. rb.velocity = new Vector2(speed * transform.localScale.x, rb.velocity.y);
  7. // 悬崖检测:前方地面射线
  8. bool groundedAhead = Physics2D.Raycast(groundCheck.position, Vector2.down, 0.5f, groundLayer).collider != null;
  9. if (!groundedAhead) Flip();
  10. }
  11. void Flip() { transform.localScale = new Vector2(-transform.localScale.x, transform.localScale.y); }
  12. 【说明】用 localScale.x 作为朝向(正=右);碰悬崖翻转。
  13. 【或】撞墙检测:前方短射线/碰撞回调翻转。
  14. 【速度】rb.velocity 移动(第 206 课)。
  15. 【测试】敌人在平台上往返巡逻、悬崖边转身。
  16. 【注意】敌人朝向与射线方向一致(翻转后射线自动跟随 localScale)。
💡
巡逻 = 恒速移动 + 悬崖/墙检测翻转。朝向用 localScale.x。

追击与攻击

发现玩家就追。

  1. 【追击】给敌人加视野:
  2. public Transform player; public float sightRange = 6f;
  3. public LayerMask playerLayer;
  4. void Update() {
  5. // 视野射线
  6. RaycastHit2D hit = Physics2D.Raycast(transform.position, new Vector2(transform.localScale.x,0), sightRange, playerLayer);
  7. if (hit.collider != null) Chase(); else Patrol();
  8. }
  9. void Chase() {
  10. // 朝玩家移动
  11. float dir = Mathf.Sign(player.position.x - transform.position.x);
  12. rb.velocity = new Vector2(dir * chaseSpeed, rb.velocity.y);
  13. if (dir != transform.localScale.x) Flip();
  14. }
  15. 【状态】简单分支:发现→追、没发现→巡逻(就是“状态机”)。
  16. 【攻击】接触玩家:OnCollisionEnter2D 里对玩家扣血(或玩家脚本受伤)。
  17. 【受伤】给敌人加 hp:
  18. public int hp = 3;
  19. void TakeDamage(int dmg) { hp -= dmg; if (hp <= 0) Destroy(gameObject); }
  20. 玩家攻击时调用 enemy.TakeDamage(1)。
  21. 【死亡】掉道具/特效(第 212 课)。
  22. 【进阶】完整状态机(第 131 课思维)+ 追击距离限制。
  23. 【注意】追击时也别冲出平台(同样做悬崖检测)。
  24. 【完成】敌人“活了”!
敌人 AI = 状态分支(巡逻/追击)+ 视野射线 + 朝向处理。一套就够普通游戏用。

常见错误与排查

错误:敌人卡在墙边抖?
原因:朝向与速度方向不一致
解决:移动方向始终用 localScale.x 或独立 facing 变量统一管理。

动手练习

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

  • 做来回巡逻的敌人
  • 做视野发现玩家追击
  • 实现敌人受伤与死亡

本节小结

2D 敌人 AI 完成。下一课做道具收集。

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

← 上一课2D 平台游戏(跑跳完整版)