refactor(enemy): 清全库行为树残留,删无人使用的 Boss 技能事件频道

Task 21 Step 2 全库扫描后的收尾:

注释与 Tooltip 里的旧决策层措辞逐处改为只描述功能——
EnemyControlledState / RangedEnemy / FlyingEnemy / SensorSlotNames /
EnemyPoiseComponent / EnemyAnimationConfigSO / EnemyAiBrain。

EnemyQuotaManager 的序列化字段 _maxActiveBehaviorTrees 改名 _maxActiveBrains
(它裁剪的实际是 EnemyAiBrain),带 FormerlySerializedAs。复核确认目前
无任何场景 / 预制体挂载该组件,故无值可丢;属未雨绸缪。

BossSkillEventChannelSO + BossEvents.BossSkillEvent + EVT_BossSkill.asset 删除:
唯一发送方 BossSkillExecutor 已随旧轨删除,复核确认全项目零发送方、零订阅方,
资产 guid 在场景 / 预制体 / Addressables 分组中均无引用。

自检:编译 0 error;EditMode 260/260 通过;
SO 校验 0 error 0 warning;层矩阵 25/25 正确。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 17:14:09 +08:00
co-authored by Claude Opus 5
parent 2c569dcf0d
commit cf0ac60fad
16 changed files with 15 additions and 1781 deletions
@@ -5,7 +5,7 @@ namespace BaseGames.Enemies
{
/// <summary>
/// 把 BrainGraph 决策层挂到敌人上:按 id 取共享 AiGraph、构造 AiRuntime、逐帧推进。
/// 取代旧的行为树组件
/// 是敌人唯一的决策层组件(小怪与 Boss 共用)
/// </summary>
[DisallowMultipleComponent]
[RequireComponent(typeof(EnemyBase))]
@@ -33,7 +33,7 @@ namespace BaseGames.Enemies
public AnimationClip Investigate;
/// <summary>
/// 按字段名返回 ClipBD_PlayAnimation 使用)。
/// 按字段名返回 ClipAI 状态片段与能力模块按名取动画时使用)。
/// 支持字段名和常见别名(如 Attack_Melee / Idle 等)。
/// </summary>
public AnimationClip GetClipByName(string name)
@@ -6,7 +6,7 @@ namespace BaseGames.Enemies
/// <summary>
/// 敌人霸体组件(架构 06_CombatModule §13)。
/// Awake 时自动注入到同节点 HurtBox(无需手动 Inspector 赋值)。
/// EnemyBase 或 BehaviorDesigner 任务可调用 SetPoiseLevel / ResetPoiseLevel 切换超甲状态。
/// EnemyBase、能力模块或动画事件可调用 SetPoiseLevel / ResetPoiseLevel 切换超甲状态。
/// </summary>
[RequireComponent(typeof(EnemyBase))]
public class EnemyPoiseComponent : MonoBehaviour, IPoiseSource
@@ -31,7 +31,7 @@ namespace BaseGames.Enemies
// ── 外部 API ──────────────────────────────────────────────────────────
/// <summary>进入/退出超甲时由 EnemyBase 或 BehaviorDesigner 任务调用。</summary>
/// <summary>进入/退出超甲时由 EnemyBase、能力模块或动画事件调用。</summary>
public void SetPoiseLevel(PoiseLevel level) => _currentPoiseLevel = level;
/// <summary>恢复到默认霸体等级(超甲结束时调用)。</summary>
@@ -5,14 +5,16 @@ using BaseGames.Core.Events;
namespace BaseGames.Enemies
{
/// <summary>
/// 敌人 BehaviorTree 配额管理器(架构 07_EnemyModule §13)。
/// 敌人决策层配额管理器(架构 07_EnemyModule §13)。
/// 每 REBALANCE_INTERVAL 帧,按到玩家距离排序已注册敌人,
/// 仅对最近的 _maxActiveBehaviorTrees 个敌人启用 BT
/// 仅对最近的 _maxActiveBrains 个敌人启用 <see cref="EnemyAiBrain"/>,其余暂停决策与感知
/// 挂载在场景管理器 GameObject 上(每场景一个实例)。
/// </summary>
public class EnemyQuotaManager : MonoBehaviour
{
[SerializeField, Min(1)] private int _maxActiveBehaviorTrees = 12;
[Tooltip("同时保持决策活跃的敌人上限;超出的按距离由远及近暂停")]
[UnityEngine.Serialization.FormerlySerializedAs("_maxActiveBehaviorTrees")]
[SerializeField, Min(1)] private int _maxActiveBrains = 12;
[Tooltip("PlayerController.Start() 广播此频道,替代 FindWithTag")]
[SerializeField] private TransformEventChannelSO _onPlayerSpawned;
@@ -107,11 +109,11 @@ namespace BaseGames.Enemies
if (enemy == null) { _registered.RemoveAt(i); continue; }
var brain = enemy.Brain;
bool active = i < _maxActiveBehaviorTrees;
bool active = i < _maxActiveBrains;
if (brain != null && brain.enabled != active)
{
// 禁用 brain 即停其 Update/Tick等价于旧的禁用行为树
// 禁用 brain 即停其 Update/Tick敌人保持静止但仍存在于场景中
brain.enabled = active;
// 同步暂停/恢复感知系统,避免远处敌人无效 tick
enemy.SensorHub?.SetSuspended(!active);
+1 -1
View File
@@ -8,7 +8,7 @@ namespace BaseGames.Enemies
/// 飞行敌人基类。
///
/// 导航由 <see cref="Navigation.FlyingNavigator"/> 实现(IEnemyNavigator),
/// AI 行为逻辑由挂载的 Behavior Designer 树驱动。
/// AI 决策由挂载的 <see cref="EnemyAiBrain"/>BrainGraph驱动。
/// 本类仅负责:
/// <list type="bullet">
/// <item>Rigidbody2D 无重力初始化</item>
@@ -16,7 +16,7 @@ namespace BaseGames.Enemies.Perception
/// <summary>
/// 视线检测(BatchLOS):敌我之间无遮挡时持续为 true。
/// 由 PhysicsPerceptionSystem 自研批量计算(OverlapCircle + 单次 Raycast),BD_IsPlayerVisible 读取结果。
/// 由 PhysicsPerceptionSystem 批量计算(OverlapCircle + 单次 Raycast),AI 图的可见性条件读取结果。
/// </summary>
public const string LOS = "los";
+1 -1
View File
@@ -7,7 +7,7 @@ namespace BaseGames.Enemies
{
/// <summary>
/// 远程敌人。重写 <see cref="EnemyBase.SpawnProjectile"/> 以从对象池生成抛射物。
/// Behavior Designer 任务通过调用 SpawnProjectile(payload) 触发发射。
/// 能力模块或动画事件通过调用 SpawnProjectile(payload) 触发发射。
/// </summary>
public class RangedEnemy : EnemyBase
{
@@ -2,7 +2,7 @@ namespace BaseGames.Enemies.States
{
/// <summary>
/// 受控状态(默认行为)。
/// 敌人处于 AI 正常控制下(Behavior Designer 运行中),无特殊 Enter/Exit 动画逻辑。
/// 敌人处于 AI 正常控制下(决策层运行中),无特殊 Enter/Exit 动画逻辑。
/// </summary>
public sealed class EnemyControlledState : IEnemyState
{