using System.Collections.Generic; using UnityEngine; public class LevelWaveManager : MonoBehaviour { [Header("关卡配置")] public TextAsset levelConfigJson; [Header("资源引用")] public Transform playerTransform; private LevelConfig levelConfig; private List waveSpawners = new List(); private Dictionary characterDataCache = new Dictionary(); private void Start() { if (playerTransform == null) { var mainChar = FindObjectOfType(); if (mainChar != null) { playerTransform = mainChar.transform; } } if (levelConfigJson != null) { LoadLevelConfig(); CreateWaveSpawners(); } else { Debug.LogError("LevelWaveManager: 未配置关卡 JSON 文件!"); } } private void LoadLevelConfig() { try { levelConfig = JsonUtility.FromJson(levelConfigJson.text); Debug.Log($"加载关卡配置:{levelConfig.levelName},共 {levelConfig.waves.Length} 波"); } catch (System.Exception e) { Debug.LogError($"解析关卡配置失败:{e.Message}"); } } private void CreateWaveSpawners() { if (levelConfig == null || levelConfig.waves == null) { return; } foreach (var waveConfig in levelConfig.waves) { GameObject spawnerObj = new GameObject($"WaveSpawner_Wave{waveConfig.waveIndex}"); spawnerObj.transform.SetParent(transform); spawnerObj.transform.position = new Vector3(0, 0, waveConfig.triggerZPosition + 5f); // 生成点在触发点后方5米 WaveSpawner spawner = spawnerObj.AddComponent(); spawner.triggerZPosition = waveConfig.triggerZPosition; spawner.autoStart = false; // 构建 WaveSpawner.Wave 数据 WaveSpawner.Wave wave = new WaveSpawner.Wave(); wave.waveName = $"第{waveConfig.waveIndex}波"; List enemyPrefabs = new List(); List spawnPositions = new List(); foreach (var enemyConfig in waveConfig.enemies) { CharacterData characterData = LoadCharacterData(enemyConfig.characterDataId); if (characterData == null) { Debug.LogError($"找不到角色数据:{enemyConfig.characterDataId}"); continue; } // 根据配置生成多个敌人 for (int i = 0; i < enemyConfig.count; i++) { enemyPrefabs.Add(characterData.unitPrefab); Vector3 spawnPos = (i < enemyConfig.spawnPositions.Length) ? enemyConfig.spawnPositions[i] : new Vector3(i * 2f, 0, 0); // 默认横向排列 spawnPositions.Add(spawnPos); } } wave.enemyPrefabs = enemyPrefabs.ToArray(); wave.spawnPositions = spawnPositions.ToArray(); wave.spawnDelay = 0.5f; spawner.waves = new WaveSpawner.Wave[] { wave }; waveSpawners.Add(spawnerObj); Debug.Log($"创建 WaveSpawner:波次{waveConfig.waveIndex},触发位置 Z={waveConfig.triggerZPosition},敌人数量={enemyPrefabs.Count}"); } } private CharacterData LoadCharacterData(string characterDataId) { if (characterDataCache.ContainsKey(characterDataId)) { return characterDataCache[characterDataId]; } CharacterData data = Resources.Load($"Data/{characterDataId}"); if (data != null) { characterDataCache[characterDataId] = data; } return data; } }