123 lines
3.1 KiB
C#
123 lines
3.1 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";
|
|
|
|
// 增大敌人的寻敌距离
|
|
UnitBase unitBase = enemy.GetComponent<UnitBase>();
|
|
if (unitBase != null)
|
|
{
|
|
unitBase.detectionRange = 100f; // 从默认30增加到100
|
|
}
|
|
|
|
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();
|
|
}
|
|
} |