fix(ai): 应用 Task 1+2 代码审查意见

ResourceFull 未挂 BossResource 时改为显式抛——原先静默返回 false,
是 CLAUDE.md 第 6 条禁止的下游兜底,且与紧邻的 Boss facet 行为不一致。
FakeBossControl.DistanceToAnchor 不再忽略 index。测试改用 TearDown 清理
(本项目关闭了 Domain/Scene Reload,失败断言会把物体永久留在打开的场景里)。
BeginPhaseTransition 去掉死的默认参数;接口补充重入契约说明。

顺带去重:FakeAiContext 实现 IEnemyActor,删除两个测试内的本地 Ctx 副本
——一个接口成员改动要同步三份是复发性成本。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 12:31:39 +08:00
co-authored by Claude Opus 5
parent 3665504a58
commit 2a1ada4388
7 changed files with 60 additions and 77 deletions
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using UnityEngine;
using BaseGames.AI;
using BaseGames.Enemies;
namespace BaseGames.Tests.EditMode.AI
{
@@ -44,7 +45,7 @@ namespace BaseGames.Tests.EditMode.AI
public bool HpBelow(float ratio) => Hp < ratio;
}
public sealed class FakeAiContext : IAiContext
public sealed class FakeAiContext : IAiContext, IEnemyActor
{
public FakeSensor S = new FakeSensor();
public FakeLocomotion L = new FakeLocomotion();
@@ -52,11 +53,13 @@ namespace BaseGames.Tests.EditMode.AI
public FakeVitals V = new FakeVitals();
public Blackboard BB = new Blackboard();
public FakeBossControl B = new FakeBossControl();
public bool HasAlert = true;
public ISensor Sensor => S;
public IEnemyLocomotion Locomotion => L;
public ICombatant Combat => C;
public IActorVitals Vitals => V;
public Blackboard Blackboard => BB;
public IBossControl Boss => B;
public bool HasAlertState => HasAlert;
}
}
@@ -13,9 +13,9 @@ namespace BaseGames.Tests.EditMode.AI
public float LastDuration = -1f;
public int BeginCallCount;
// 锚点:测试按下标直给坐标;距离由测试直接设定
// 锚点:测试按下标直给坐标;距离由 SelfPosition 与该下标锚点算出(不忽略 index)
public UnityEngine.Vector2[] Anchors = new UnityEngine.Vector2[0];
public float DistanceToAnchorValue;
public UnityEngine.Vector2 SelfPosition;
public int CurrentPhase => Phase;
public bool IsPhaseTransitioning => Transitioning;
@@ -30,6 +30,7 @@ namespace BaseGames.Tests.EditMode.AI
}
public UnityEngine.Vector2 AnchorAt(int index) => Anchors[index];
public float DistanceToAnchor(int index) => DistanceToAnchorValue;
public float DistanceToAnchor(int index)
=> UnityEngine.Vector2.Distance(SelfPosition, Anchors[index]);
}
}