47 lines
2.0 KiB
C#
47 lines
2.0 KiB
C#
using BaseGames.Core;
|
||
using BaseGames.Core.Pool;
|
||
using UnityEngine;
|
||
|
||
namespace BaseGames.Enemies.Behaviors
|
||
{
|
||
/// <summary>
|
||
/// 动画事件触发的对象池生成(零代码替代每敌人专属的 <c>SpawnProjectile()</c> 重写)。
|
||
/// <para>
|
||
/// <see cref="EnemyBase.SpawnProjectile"/> 会把 payload 路由到本组件;当 payload 与
|
||
/// <c>payloadKey</c> 匹配时,在自身周围随机位置从对象池生成 <c>count</c> 个指定 key 的对象
|
||
/// (例如精英怪死亡前摇中生成 N 个小怪)。
|
||
/// </para>
|
||
/// 使用方式:在动画(如死亡前摇)相应帧放置 SpawnProjectile 动画事件,payload 填 <c>payloadKey</c>。
|
||
/// 同一敌人可挂多个本组件(不同 payloadKey)以生成不同对象。
|
||
/// </summary>
|
||
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<IObjectPoolService>();
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
}
|