feat(ai): AiRuntime 事件转换(push,不受门限制)+trace触发原因+池复用测试
This commit is contained in:
@@ -111,5 +111,53 @@ namespace BaseGames.Tests.EditMode.AI
|
||||
var rt = new AiRuntime(b.Build(), ctx);
|
||||
CollectionAssert.Contains(ctx.M.Calls, "LookAround");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EventTransition_FiresOnSignal_EvenBeforeTick()
|
||||
{
|
||||
var ctx = new FakeAiContext();
|
||||
var rt = new AiRuntime(Graph(), ctx);
|
||||
rt.Send(AiSignal.Died);
|
||||
rt.Tick(0.1f);
|
||||
Assert.AreEqual("Dead", rt.CurrentStateName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EventTransition_FiresEvenWhenNotControllable()
|
||||
{
|
||||
// 死亡等事件不受让位门限制(门只挡决策推进/条件评估,不挡事件)
|
||||
var ctx = new FakeAiContext();
|
||||
var rt = new AiRuntime(Graph(), ctx);
|
||||
ctx.V.Controllable = false;
|
||||
rt.Send(AiSignal.Died);
|
||||
rt.Tick(0.1f);
|
||||
Assert.AreEqual("Dead", rt.CurrentStateName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Trace_RecordsTriggerReason()
|
||||
{
|
||||
var ctx = new FakeAiContext();
|
||||
var rt = new AiRuntime(Graph(), ctx);
|
||||
ctx.S.Sees = true;
|
||||
rt.Tick(0.1f);
|
||||
Assert.AreEqual(1, rt.Trace.Count);
|
||||
Assert.AreEqual("Patrol", rt.Trace[0].From);
|
||||
Assert.AreEqual("Chase", rt.Trace[0].To);
|
||||
StringAssert.Contains("SeesPlayer", rt.Trace[0].Trigger);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Reset_ReturnsToEntryAndClearsState()
|
||||
{
|
||||
var ctx = new FakeAiContext();
|
||||
var rt = new AiRuntime(Graph(), ctx);
|
||||
ctx.S.Sees = true; rt.Tick(0.1f); // -> Chase
|
||||
ctx.BB.Set("scratch", 42);
|
||||
rt.Reset();
|
||||
Assert.AreEqual("Patrol", rt.CurrentStateName);
|
||||
Assert.IsEmpty(rt.Trace);
|
||||
Assert.IsFalse(ctx.BB.Has("scratch"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user