125 lines
4.1 KiB
C#
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;
|
|
}
|
|
}
|