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

2D 射击游戏基础

2D 射击骨架完成。下一课做子弹与弹幕。

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

🎯本节学习目标

  • 实现射击发射
  • 实现子弹飞行
  • 实现敌人生成

🚀课程导读

“哒哒哒”扫射——2D 射击的骨架:发射、子弹、敌人、得分。本课实现核心循环。

射击与子弹

瞄准与发射。

  1. 【子弹预制体】小矩形/圆形精灵 + Rigidbody2D + Collider2D + 脚本 Bullet:
  2. public float speed = 15f;
  3. void Start() { GetComponent<Rigidbody2D>().velocity = transform.right * speed; Destroy(gameObject, 3f); }
  4. 【发射】玩家脚本:
  5. public GameObject bulletPrefab; public Transform firePoint;
  6. void Update() {
  7. if (Input.GetMouseButtonDown(0)) Fire();
  8. }
  9. void Fire() {
  10. // 朝鼠标方向
  11. Vector3 mouse = Camera.main.ScreenToWorldPoint(Input.mousePosition);
  12. mouse.z = 0;
  13. Vector3 dir = (mouse - transform.position).normalized;
  14. float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
  15. firePoint.rotation = Quaternion.Euler(0, 0, angle);
  16. Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
  17. AudioManager.Instance.PlaySFX(shootSound);
  18. }
  19. 【说明】子弹沿自身 right 方向飞(旋转对齐鼠标)。
  20. 【冷却】限制射速:
  21. public float fireCooldown = 0.15f; private float lastFire;
  22. if (Input.GetMouseButtonDown(0) && Time.time - lastFire > fireCooldown) { lastFire = Time.time; Fire(); }
  23. 【销毁】子弹 3 秒销毁或撞墙销毁。
  24. 【测试】点击射击、子弹飞向鼠标方向。
  25. 【注意】子弹要有 Collider 才能打中敌人(触发器或碰撞)。
💡
射击 = 子弹预制体(速度+销毁)+ 鼠标朝向旋转 + 冷却控制。经典三件套。

敌人生成与得分

打靶循环。

  1. 【敌人生成器】Spawner 脚本:
  2. public GameObject enemyPrefab;
  3. void Start() { StartCoroutine(SpawnLoop()); }
  4. IEnumerator SpawnLoop() {
  5. while (true) {
  6. yield return new WaitForSeconds(Random.Range(1f, 3f));
  7. Vector2 pos = new Vector2(Random.Range(-8f, 8f), 6f); // 屏幕上方随机
  8. Instantiate(enemyPrefab, pos, Quaternion.identity);
  9. }
  10. }
  11. 【敌人】向下移动(velocity.y = -speed),碰子弹死亡:
  12. void OnTriggerEnter2D(Collider2D other) {
  13. if (other.CompareTag("Bullet")) {
  14. GameManager.Instance.AddScore(10);
  15. Destroy(other.gameObject);
  16. Destroy(gameObject);
  17. }
  18. }
  19. 【得分】GameManager 加分数 + UI 刷新(第 167 课)。
  20. 【玩家受伤】敌人碰到玩家扣血(第 163 课判定)。
  21. 【爆炸特效】敌人死亡时实例化小爆炸(第 197-200 课)。
  22. 【关卡难度】随时间加快生成速度(GenerationInterval 递减)。
  23. 【完成】一个能“打”的 2D 射击循环!
  24. 【注意】敌人离开屏幕下缘要销毁,防止堆积(Destroy 或回收到池)。
射击循环 = 生成器 + 子弹击敌 + 得分 + 玩家受伤。循环完整才“好玩”。

常见错误与排查

错误:子弹穿敌人/敌人不受伤?
原因:碰撞检测或 Tag 不匹配
解决:确认子弹 Collider 勾 Is Trigger;双方 Tag 正确;OnTriggerEnter2D 写在有刚体的那方。

动手练习

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

  • 实现鼠标瞄准射击
  • 做敌人生成器与移动
  • 实现击毁得分与玩家受伤

本节小结

2D 射击骨架完成。下一课做子弹与弹幕。

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

← 上一课2D 视差背景滚动