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

@@ -92,9 +92,12 @@ public class EnemyBase : MonoBehaviour, IDamageable
// ──── EnemyAnimationEvents 接口虚方法Boss 子类覆盖)──────────
// 由 EnemyAnimationEvents.OnAnimationEvent 在对应动画帧触发时调用(见 24_AnimEventModule §6
public virtual void SpawnProjectile(string data) { }
// SpawnProjectile 基类实现:路由到挂载的 IEnemySpawnEventHandler 组件(见 §8.5 配置型行为组件)
public virtual void SpawnProjectile(string data) { /* routes to IEnemySpawnEventHandler */ }
public virtual void TriggerPhaseTwo() { }
public virtual void OnAnimationComplete(string data) { }
// 对象池取出并完成 OnSpawn 重置后触发配置型出生行为组件EnemyAbilityTrigger订阅
public event System.Action Spawned;
// ⚡ BD 每帧 Tick 调用 Blackboard 读写 SharedVariableAwake 缓存、消除 GetComponent 热开销
public BehaviorTree Blackboard => _behaviorTree;
@@ -426,6 +429,20 @@ public class EnemyAnimationConfigSO : ScriptableObject
---
## 8.5 配置型行为组件(零代码扩展点)
过去 E003/E004/E005 等敌人各写一个继承 `EnemyBase` 的专属子类,只为挂接少量生命周期钩子。现已抽成**通用、可配置的行为组件**——策划在 Prefab 上加组件、填字段即可,不再为单个敌人写脚本。`EnemyBase``Awake` 收集这些组件并在对应时机回调。
| 组件 | 命名空间 | 作用 | 关键字段 | 接入的 EnemyBase 钩子 |
|------|---------|------|---------|---------------------|
| `EnemyAbilityTrigger` | `BaseGames.Enemies.Behaviors` | 出生时(对象池)或外部时机执行某个能力 | `_abilityId``_executeOnSpawn` | 订阅 `Spawned` 事件;`public Trigger()` 供场景触发器/UnityEvent/动画事件调用 |
| `EnemyDeathSequence` | 同上 | 死亡前摇无敌演出(停 BT/移动、关 HurtBox、播放前摇、等待后再真正死亡 | `_deathPreClip``_duration``_hurtBoxesToDisable` | 实现 `IEnemyDeathSequence``Die()` 委托其播放,期间 `IsInvincible=true`,结束回调 `PerformDeath()` |
| `EnemySpawnerOnEvent` | 同上 | 动画事件触发的对象池生成(如死亡演出中生成小怪) | `_payloadKey``_poolKey``_count``_radius` | 实现 `IEnemySpawnEventHandler``SpawnProjectile(payload)` 路由匹配 |
扩展原则:新的"某时机做某事"需求优先做成此类通用组件(参考现有 `AssignReference`/`AssignAsset` 脚手架绑定模式接入 `SceneObjectPlacerTool`),而非新建 `EnemyBase` 子类——使敌人尽量通过配置而非代码创建。`RangedEnemy` / `BossBase` / `ChaoFengBoss` 等仍可重写 `SpawnProjectile`/`Die` 自定义逻辑(重写不调用 base 时即绕过路由/委托)。
---
## 9. BossBase
```csharp