You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:36:13