最近我一直在尝试使用apoc 发布的 treesharp 库来实现一个健壮的行为树。我一直在我的书中讨论迭代器和接口,但我什至不知道如何测试,更不用说使用这个库了。接口如何相互连接以及如何用它们实际执行测试/构建树让我感到困惑。
通常在这种情况下,我会寻找代码示例并从查看其他人的工作中获得启发,但是对于这个库,似乎没有任何示例代码。
谁能帮我弄清楚如何开始使用这个库构建行为树?如果这个问题非常无聊(我认为可能是),我很抱歉,但我现在很难理解接口中的枚举器和渐进式接口。
最近我一直在尝试使用apoc 发布的 treesharp 库来实现一个健壮的行为树。我一直在我的书中讨论迭代器和接口,但我什至不知道如何测试,更不用说使用这个库了。接口如何相互连接以及如何用它们实际执行测试/构建树让我感到困惑。
通常在这种情况下,我会寻找代码示例并从查看其他人的工作中获得启发,但是对于这个库,似乎没有任何示例代码。
谁能帮我弄清楚如何开始使用这个库构建行为树?如果这个问题非常无聊(我认为可能是),我很抱歉,但我现在很难理解接口中的枚举器和渐进式接口。
我是 TreeSharp 的作者,如果你们有任何问题,请随时给我发电子邮件(它包含在标题中的每个源文件中)。
您首先需要了解行为树的概念(选择器、序列、装饰器、动作等之间的区别)。我还提供了一些“虚荣”组合来让事情变得稍微容易一些(例如等待)。
基于构造函数的 API 允许您完全通过 ctor 定义树(使用在运行时评估的委托以提供决策等)
不幸的是,我从来没有实现过“TreeExecutor”类,它处理从诸如 Tick() 方法之类的东西执行任意行为分支。最简单的方法(在此示例中使用 PrioritySelector,但您可以使用任何组合)如下;
static void Start()
{
// Start MUST be called before you can tick the tree.
Logic.Start(null);
// do work to spool up a thread, or whatever to call Tick();
}
private static void Tick()
{
try
{
Logic.Tick(null);
// If the last status wasn't running, stop the tree, and restart it.
if (Logic.LastStatus != RunStatus.Running)
{
Logic.Stop(null);
Logic.Start(null);
}
}
catch (Exception e)
{
// Restart on any exception.
Logging.WriteException(e);
Logic.Stop(null);
Logic.Start(null);
throw;
}
}
不幸的是,给出其用法的“示例”实际上取决于您使用它的目的。(由于它如此通用,很难给出对任何给定项目都有意义的示例。我一直在使用它,从事物到 AI 逻辑,到工作流,再到调度过程)
一个可能会有所帮助的小例子;
static Composite CreateFireMissile()
{
return new PrioritySelector(
new Decorator(ret => CurrentShip.CurrentTarget != null,
new Action(ret => CurrentShip.CurrentTarget.FireMissile())),
new Decorator(ret => CurrentShip.CurrentTarget == null,
new Decorator(ret => CurrentShip.NearbyHostiles.Count > 0,
new Sequence(
new Action(ret => CurrentShip.SetTarget(CurrentShip.NearbyHostiles[0])),
new Action(ret => CurrentShip.RotateTo(CurrentShip.CurrentTarget.Location))
)
)
)
);
}
同样,这实际上取决于您的要求。该库将允许您对任何复合材料进行子类化,以便更轻松地重用复合材料。(例如;您可以创建一个 SetTargetAndRotate 动作,它消除了序列中的两个动作)
同样,如果你们有问题,请不要犹豫。
Jason,该库似乎实现了我在其他 BT 库示例中看到的所有想法。我正在考虑将这样的库用于我自己的一个项目,所以在我这样做之前,我只是根据简短的检查来猜测如何使用这个库。
尽管如此,我认为您会为 Action 类的实例提供自己的回调函数,然后根据 BT 思想将各种动作拼凑成组组合(等到某些事情成立后再行动,直到其中一个动作成功,执行所有这些行动,除非一个失败,等等)。
高温高压