Files
gold_dolphin/unity/Assets/enemy/EnemyManager.cs
2026-06-27 22:21:16 +08:00

86 lines
2.6 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace IndianOceanAssets.Engine2_5D
{
/// <summary>
/// 敌人管理器 —— 在游戏开始时,于场景中所有 EnemySpawnPoint 处生成敌人。
///
/// 用法:
/// 1. 在场景中放置空物体,挂 EnemySpawnPoint 组件,作为出生点
/// 2. 在场景中创建空物体,挂此 EnemyManager 脚本
/// 3. 把敌人预制体拖到 enemyPrefab 字段
/// 4. 运行时自动在所有出生点生成敌人
/// </summary>
public class EnemyManager : MonoBehaviour
{
public static EnemyManager Instance { get; private set; }
[Header("敌人物体预制体")]
[SerializeField] private GameObject enemyPrefab;
[Tooltip("勾选后游戏开始时自动在所有出生点生成敌人")]
[SerializeField] private bool spawnOnStart = true;
private readonly List<EnemyAI> _enemies = new List<EnemyAI>();
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this);
return;
}
Instance = this;
}
private void Start()
{
if (spawnOnStart)
SpawnAll();
}
/// <summary>
/// 在所有 EnemySpawnPoint 处生成敌人
/// </summary>
[ContextMenu("Spawn All")]
public void SpawnAll()
{
var spawnPoints = FindObjectsByType<EnemySpawnPoint>(FindObjectsSortMode.None);
foreach (var sp in spawnPoints)
{
SpawnEnemy(sp.transform.position, sp.transform.rotation);
}
Debug.Log($"[EnemyManager] 在 {spawnPoints.Length} 个出生点生成了 {_enemies.Count} 个敌人");
}
/// <summary>
/// 在指定位置生成一个敌人
/// </summary>
public GameObject SpawnEnemy(Vector3 position, Quaternion rotation)
{
if (enemyPrefab == null)
{
Debug.LogWarning("[EnemyManager] enemyPrefab 未设置!");
return null;
}
var enemy = Instantiate(enemyPrefab, position, rotation);
var ai = enemy.GetComponent<EnemyAI>();
if (ai != null && !_enemies.Contains(ai))
_enemies.Add(ai);
return enemy;
}
/// <summary>
/// 获取所有活跃敌人(自动清理已销毁的)
/// </summary>
public List<EnemyAI> GetActiveEnemies()
{
_enemies.RemoveAll(e => e == null);
return _enemies;
}
}
}