#if GRAPH_DESIGNER using UnityEngine; using Opsive.BehaviorDesigner.Runtime.Tasks; using Opsive.BehaviorDesigner.Runtime.Tasks.Actions; using BaseGames.Core; using BaseGames.Core.Pool; using BaseGames.Enemies; namespace BaseGames.Enemies.AI { /// /// BD Action:Boss 专用召唤小兵。 /// 通过 GlobalObjectPool 在 Boss 周围生成 MinionPrefabKey 对应的敌人。 /// [TaskName("Summon Minions")] [TaskCategory("BaseGames/Enemy/Boss")] [TaskDescription("在指定位置生成小怪预制体(支持延迟和数量配置)")] public class BD_SummonMinions : Action { [Header("召唤配置")] [Tooltip("对象池 Key,对应 PoolRegistry 中注册的小怪预制体。")] [SerializeField] private string m_MinionPrefabKey = ""; [Tooltip("单次召唤的小兵数量。")] [Min(1)] [SerializeField] private int m_Count = 2; [Tooltip("小兵生成位置距 Boss 中心的横向散开半径(m)。")] [Min(0.1f)] [SerializeField] private float m_SpawnRadius = 3f; // 延迟缓存:首次调用时解析,避免每帧服务定位开销 private IObjectPoolService _pool; public override TaskStatus OnUpdate() { if (string.IsNullOrEmpty(m_MinionPrefabKey)) return TaskStatus.Failure; _pool ??= ServiceLocator.GetOrDefault(); if (_pool == null) return TaskStatus.Failure; for (int i = 0; i < m_Count; i++) { float angleRad = (i / (float)m_Count) * Mathf.PI * 2f; var offset = new Vector2(Mathf.Cos(angleRad), 0f) * m_SpawnRadius; var spawnPos = new Vector3( transform.position.x + offset.x, transform.position.y, 0f); _pool.Spawn(m_MinionPrefabKey, spawnPos, Quaternion.identity); } return TaskStatus.Success; } } } #endif