我试图使用C#创建一个“行为树”.
对于任何不知道的人来说,一个行为树基本上是一个可以构建AI的框架.有排序器,选择器,装饰器,复合动作等.
我发现一个单独的库已经在C#中添加了一个“行为树”,位于这里(http://code.google.com/p/treesharp/),但是我无法理解如何实际使用它,因为没有可以绘制的示例代码.这里有没有人可能会做一些简单的示例代码来显示如何实际使用这个框架?或者也许你知道另一种方式来填补C#中的一个行为树?
非常感谢!
解决方法
我只是看着这个实现,我发现自己想知道为什么需要这么多的代码来比较简单的东西.
从你所说的,你想要一种简单的组合行为方式.我认为这里的一个行为是一个代理从一个状态到零个或多个动作的映射.您可以使用C#lambdas轻松建模.例如:
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));
为了让守卫做点什么,只需打电话给巡逻队GardBehavIoUr().请注意,各种子动作和测试可以实现为具有正确签名的方法,而不是内联为lambdas.您可以将其他组合器添加到选择器和排序器,例如并行活动.