Files
daluandou/Assets/Script/关卡脚本/LevelWaveManager.cs
T
huadexuan 8d58c2223c 根据提供的code differences信息,由于没有具体的代码变更内容,我将生成一个通用的commit message模板:
```
docs(readme): 更新文档说明

- 添加项目使用指南
- 完善API接口说明
- 修正错误的配置示例
```
2026-10-01 16:01:43 +08:00

125 lines
4.1 KiB
C#

using System.Collections.Generic;
using UnityEngine;
public class LevelWaveManager : MonoBehaviour
{
[Header("关卡配置")]
public TextAsset levelConfigJson;
[Header("资源引用")]
public Transform playerTransform;
private LevelConfig levelConfig;
private List<GameObject> waveSpawners = new List<GameObject>();
private Dictionary<string, CharacterData> characterDataCache = new Dictionary<string, CharacterData>();
private void Start()
{
if (playerTransform == null)
{
var mainChar = FindObjectOfType<MainCharacterCombat>();
if (mainChar != null)
{
playerTransform = mainChar.transform;
}
}
if (levelConfigJson != null)
{
LoadLevelConfig();
CreateWaveSpawners();
}
else
{
Debug.LogError("LevelWaveManager: 未配置关卡 JSON 文件!");
}
}
private void LoadLevelConfig()
{
try
{
levelConfig = JsonUtility.FromJson<LevelConfig>(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<WaveSpawner>();
spawner.triggerZPosition = waveConfig.triggerZPosition;
spawner.autoStart = false;
// 构建 WaveSpawner.Wave 数据
WaveSpawner.Wave wave = new WaveSpawner.Wave();
wave.waveName = $"第{waveConfig.waveIndex}波";
List<GameObject> enemyPrefabs = new List<GameObject>();
List<Vector3> spawnPositions = new List<Vector3>();
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<CharacterData>($"Data/{characterDataId}");
if (data != null)
{
characterDataCache[characterDataId] = data;
}
return data;
}
}