我刚刚查看了那个实现,我发现自己想知道为什么相对简单的事情需要这么多代码。
从你所说的,你想要一种简单的方式来组成行为。我认为这里的行为是代理从状态到零个或多个动作的映射。您可以使用 C# lambda 轻松对此进行建模。例如:
Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) {
return () => { if cond() then ifTrue() else ifFalse() };
}
Action Sequencer(Action a, Action b) {
return () => { a(); b(); }
}
树的叶子是简单的动作,可以做一些适合状态的事情。您只需执行即可“运行”一棵树。
如果你想变得花哨,你可以参数化这个方案以使状态显式。
希望这会有所帮助。
---- 附录----
Jason 询问了如何使用这种方法的示例,因此这里有一个简单的“AI”巡逻警卫示例(我假设 WorldState 对应于评估行为树时的环境描述):
Func<bool> ifPlayerIsInSight = () => ...true iff WorldState shows guard can see player...;
Action shootAtPlayer = () => { ...aim guard's weapon at player and fire... };
Func<bool> ifUnderFire = () => ...true iff WorldState shows guard hears player gunfire...;
Action takeCover = () => { ...guard runs for nearest shelter... };
Action walkBackAndForthGuardingDoorway = () => { ...default guard patrol behaviour... };
Action patrollingGuardBehaviour =
Selector(ifPlayerIsInSight, shootAtPlayer,
Selector(ifUnderFire, takeCover,
walkBackAndForthGuardingDoorway));
要让守卫做点什么,只需致电patrollingGuardBehaviour()。请注意,各种子操作和测试可以作为具有正确签名的方法实现,而不是作为 lambda 内联。您可以将其他组合器添加到 Selector 和 Sequencer,例如用于并行活动。