微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C#中创建AI行为树 – 如何?

我试图使用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.您可以将其他组合器添加到选择器和排序器,例如并行活动.

原文地址:https://www.jb51.cc/csharp/92576.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐