feat(ai): 新增 IBossControl facet——Boss 阶段状态经 IAiContext 供图读取

非 Boss 敌人访问 IAiContext.Boss 显式抛 InvalidOperationException,
不返回空对象掩盖小怪图误挂 Boss 边的错误。BossResource 补 IsFull 供图条件边判定。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 12:15:54 +08:00
co-authored by Claude Opus 5
parent 5839b423ae
commit 3665504a58
13 changed files with 176 additions and 4 deletions
@@ -12,7 +12,7 @@ namespace BaseGames.Enemies
/// Boss 敌人基类。扩展 <see cref="EnemyBase"/> 以支持多阶段切换、技能执行与战斗结束广播。
/// 具体 Boss 继承此类并重写 <see cref="EnterPhase"/>。
/// </summary>
public class BossBase : EnemyBase
public class BossBase : EnemyBase, BaseGames.AI.IBossControl
{
[Header("Boss 配置")]
[SerializeField] private string _bossId;
@@ -31,12 +31,15 @@ namespace BaseGames.Enemies
public string BossId => _bossId;
/// <summary>当前是否有 Boss 技能正在执行BD_UseBossSkill 轮询此值)。</summary>
/// <summary>当前是否有 Boss 技能正在执行。</summary>
public bool IsBossSkillExecuting => _skillExecutor != null && _skillExecutor.IsExecuting;
protected int _currentPhase = 0;
/// <summary>当前 Boss 阶段索引BD Task 可直接查询)。</summary>
/// <summary>当前 Boss 阶段索引。IBossControl 实现。</summary>
public int CurrentPhase => _currentPhase;
/// <summary>Boss 资源是否已满(未挂资源组件时恒为 false)。IBossControl 实现。</summary>
public bool ResourceFull => _bossResource != null && _bossResource.IsFull;
private Coroutine _counterStaggerCoroutine;
// 缓存加权候选与其有效权重(两者等长、下标对应),避免 UseBossSkillWeighted() 每次 new List → GC 分配
@@ -26,6 +26,10 @@ namespace BaseGames.Boss
public float NormalizedValue => _config != null && _config.maxValue > 0f
? _currentValue / _config.maxValue : 0f;
/// <summary>资源是否已达上限(供 AI 图条件边判定"可放大招")。</summary>
public bool IsFull => _config != null && _config.maxValue > 0f
&& _currentValue >= _config.maxValue;
private void Awake()
{
if (_boss == null) _boss = GetComponentInParent<BossBase>();