Files
daluandou/Assets/Script/WaveSpawner.cs
T
huadexuan f93d69d8ee ```
docs(clipboard): 添加剪贴板功能相关图片资源

添加了两个剪贴板功能的截图文件,用于文档说明和功能展示。
```
2026-09-09 23:59:15 +08:00

115 lines
2.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[System.Serializable]
public class Wave
{
public string waveName = "第一波";
public GameObject[] enemyPrefabs;
public Vector3[] spawnPositions;
public float spawnDelay = 0.5f;
}
[Header("波次配置")]
public Wave[] waves;
[Header("触发设置")]
public float triggerZPosition = 20f;
public bool autoStart = false;
private int currentWave = 0;
private bool waveStarted = false;
private bool waveCompleted = false;
private List<GameObject> activeEnemies = new List<GameObject>();
private Transform player;
private void Start()
{
player = GameObject.FindGameObjectWithTag("Player")?.transform;
if (player == null)
{
player = FindObjectOfType<MainCharacterCombat>()?.transform;
}
if (autoStart)
{
StartWave();
}
}
private void Update()
{
if (!waveStarted && !waveCompleted && player != null)
{
if (player.position.z >= triggerZPosition)
{
StartWave();
}
}
if (waveStarted && !waveCompleted)
{
CleanupDestroyedEnemies();
if (activeEnemies.Count == 0)
{
CompleteWave();
}
}
}
private void StartWave()
{
if (currentWave >= waves.Length)
{
return;
}
waveStarted = true;
StartCoroutine(SpawnWave(waves[currentWave]));
}
private IEnumerator SpawnWave(Wave wave)
{
Debug.Log($"开始生成:{wave.waveName}");
int count = Mathf.Min(wave.enemyPrefabs.Length, wave.spawnPositions.Length);
for (int i = 0; i < count; i++)
{
if (wave.enemyPrefabs[i] != null)
{
Vector3 spawnPos = transform.position + wave.spawnPositions[i];
GameObject enemy = Instantiate(wave.enemyPrefabs[i], spawnPos, Quaternion.identity);
enemy.tag = "Enemy";
activeEnemies.Add(enemy);
Debug.Log($"生成敌人:{enemy.name} 位置={spawnPos}");
yield return new WaitForSeconds(wave.spawnDelay);
}
}
}
private void CleanupDestroyedEnemies()
{
activeEnemies.RemoveAll(enemy => enemy == null);
}
private void CompleteWave()
{
waveCompleted = true;
Debug.Log($"完成:{waves[currentWave].waveName}");
}
public void NextWave()
{
currentWave++;
waveStarted = false;
waveCompleted = false;
activeEnemies.Clear();
}
}