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 activeEnemies = new List(); private Transform player; private void Start() { player = GameObject.FindGameObjectWithTag("Player")?.transform; if (player == null) { player = FindObjectOfType()?.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(); } }