Unity塔防游戏如何实现波次计数及波次进度显示功能?
Unity塔防波次计数功能实现
核心逻辑梳理
- 维护三个核心状态:总波次数量、当前已触发的波次序号、当前波次存活敌人数量
- 每波敌人全部生成完成后才开始检测存活数,避免波次中途还没刷完怪就提前触发下一波
- 敌人死亡时统一触发计数回调,存活数归0后自动更新波次序号并刷新UI显示
- 注意:
isSpawning标记用来避免未完成刷怪时提前触发波次结束,必须在整波所有敌人都生成到场景中后再设为false
完整可运行脚本参考
1. 波次管理单例脚本 WaveManager.cs
该脚本挂在场景全局空物体上即可,负责管理所有波次状态:
using UnityEngine; using UnityEngine.UI; public class WaveManager : MonoBehaviour { public static WaveManager Instance; [Header("波次配置")] public int totalWave = 10; public Text waveCountText; // 拖入场景中显示波次的UI文本组件 [Header("当前状态")] public int currentWave = 0; public int enemyAliveCount = 0; public bool isSpawning = false; // 标记当前是否正在生成敌人 private void Awake() { if (Instance == null) Instance = this; else Destroy(gameObject); } private void Start() { // 初始显示0/10,第一波启动后自动更新 UpdateWaveUI(); } // 调用该方法启动下一波 public void StartNextWave() { if (currentWave >= totalWave) { // 所有波次完成的自定义逻辑可在此补充,比如胜利判定 Debug.Log("所有波次已通关"); return; } currentWave++; enemyAliveCount = 0; isSpawning = true; UpdateWaveUI(); // 此处接入你自己的敌人生成逻辑 // 整波敌人全部生成完成后,执行 WaveManager.Instance.isSpawning = false; // 生成每个敌人时,执行 WaveManager.Instance.enemyAliveCount++ 统计总敌人数 } // 每个敌人死亡时调用该方法 public void OnEnemyDead() { enemyAliveCount--; CheckWaveComplete(); } // 检测当前波次是否完成 private void CheckWaveComplete() { if (enemyAliveCount <= 0 && !isSpawning) { Debug.Log($"第{currentWave}波已完成"); // 此处可补充波次结束奖励、倒计时逻辑,之后调用StartNextWave()启动下一波 // 示例:3秒后自动启动下一波 Invoke(nameof(StartNextWave), 3f); } } // 按要求格式更新UI显示 private void UpdateWaveUI() { waveCountText.text = $"{currentWave}/{totalWave}"; } }
2. 敌人死亡逻辑补充
在你现有敌人脚本的死亡方法中,新增一行计数调用即可:
public class Enemy : MonoBehaviour { public float health = 100f; public void TakeDamage(float damage) { health -= damage; if (health <= 0) Die(); } private void Die() { // 此处保留你原有死亡逻辑:死亡动画、奖励掉落等 WaveManager.Instance.OnEnemyDead(); Destroy(gameObject); } }
使用步骤
- 场景新建空物体命名为
WaveManager,挂上WaveManager脚本 - Inspector面板设置总波次数量(比如10),将场景中用于显示波次的Text组件拖到对应字段
- 在你现有的敌人生成逻辑中,生成每个敌人时执行
WaveManager.Instance.enemyAliveCount++,整波全部生成完成后执行WaveManager.Instance.isSpawning = false - 游戏启动后首次调用
WaveManager.Instance.StartNextWave()即可启动第一波,后续波次会在当前波次敌人全灭后自动触发
内容的提问来源于stack exchange,提问作者Marius Stoica
相关产品推荐
相关产品推荐

