refactor(enemy): 敌人专属子类改为零代码配置型行为组件

This commit is contained in:
2026-06-09 15:56:44 +08:00
parent 7781ac4755
commit ebf0c97320
22 changed files with 496 additions and 242 deletions

View File

@@ -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("对象池 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);
}
}
}
}