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:
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using BaseGames.AI;
|
||||
|
||||
@@ -10,11 +11,16 @@ namespace BaseGames.Enemies
|
||||
public sealed class EnemyBrainContext : IAiContext, ISensor, ICombatant, IActorVitals, IEnemyActor
|
||||
{
|
||||
readonly EnemyBase _enemy;
|
||||
readonly BossBase _boss;
|
||||
readonly Blackboard _blackboard = new Blackboard();
|
||||
Vector2 _lastKnown;
|
||||
float _lostTimer;
|
||||
|
||||
public EnemyBrainContext(EnemyBase enemy) { _enemy = enemy; }
|
||||
public EnemyBrainContext(EnemyBase enemy)
|
||||
{
|
||||
_enemy = enemy;
|
||||
_boss = enemy as BossBase; // 非 Boss 为 null,Boss facet 访问时显式抛
|
||||
}
|
||||
|
||||
// ---- IAiContext ----
|
||||
public ISensor Sensor => this;
|
||||
@@ -23,6 +29,14 @@ namespace BaseGames.Enemies
|
||||
public IActorVitals Vitals => this;
|
||||
public Blackboard Blackboard => _blackboard;
|
||||
|
||||
/// <summary>
|
||||
/// Boss 专属决策面。非 Boss 敌人访问即抛——小怪图误挂了 Boss 边必须立刻暴露,
|
||||
/// 不返回空对象让错误静默通过(CLAUDE.md 第 6 条)。
|
||||
/// </summary>
|
||||
public IBossControl Boss => _boss ?? throw new InvalidOperationException(
|
||||
$"[EnemyBrainContext] '{_enemy.name}' 不是 Boss(未挂 BossBase 或其子类)," +
|
||||
"但它的 AI 图访问了 IAiContext.Boss。请检查该敌人是否误用了 Boss 专属的图或图片段。");
|
||||
|
||||
/// <summary>每帧由 EnemyAiBrain 在 Tick 之前调用,维护最后已知位置与丢失计时(供需要的敌人用)。</summary>
|
||||
public void Refresh(float dt)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user