using BaseGames.Core; using BaseGames.Core.Pool; using UnityEngine; namespace BaseGames.Enemies.Behaviors { /// /// 动画事件触发的对象池生成(零代码替代每敌人专属的 SpawnProjectile() 重写)。 /// /// 会把 payload 路由到本组件;当 payload 与 /// payloadKey 匹配时,在自身周围随机位置从对象池生成 count 个指定 key 的对象 /// (例如精英怪死亡前摇中生成 N 个小怪)。 /// /// 使用方式:在动画(如死亡前摇)相应帧放置 SpawnProjectile 动画事件,payload 填 payloadKey。 /// 同一敌人可挂多个本组件(不同 payloadKey)以生成不同对象。 /// public class EnemySpawnerOnEvent : MonoBehaviour, IEnemySpawnEventHandler { [Header("触发匹配")] [Tooltip("匹配的动画事件 payload(如 \"spawn_e003\");留空则匹配任意 payload")] [SerializeField] private string _payloadKey = ""; [Header("生成")] [Tooltip("对象池 key(IObjectPoolService.Spawn 的 key,须经 AddressKeys 常量约定,如 \"ENM_YouZhi\")")] [SerializeField] private string _poolKey = ""; [Tooltip("生成数量")] [Min(1)][SerializeField] private int _count = 3; [Tooltip("生成点相对自身的随机半径")] [Min(0f)][SerializeField] private float _radius = 1.5f; public void HandleSpawn(string payload) { if (!string.IsNullOrEmpty(_payloadKey) && payload != _payloadKey) return; if (string.IsNullOrEmpty(_poolKey)) return; var pool = ServiceLocator.GetOrDefault(); if (pool == null) return; for (int i = 0; i < _count; i++) { Vector2 offset = Random.insideUnitCircle * _radius; pool.Spawn(_poolKey, (Vector2)transform.position + offset, Quaternion.identity); } } } }