refactor(enemy): 敌人专属子类改为零代码配置型行为组件
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user