Files
zeling_v2/Assets/_Game/Scripts/Enemies/Behaviors/EnemySpawnerOnEvent.cs

47 lines
2.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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("对象池 keyIObjectPoolService.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);
}
}
}
}