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);
}
}
}
}