0

最近我一直在尝试使用apoc 发布的 treesharp 库来实现一个健壮的行为树。我一直在我的书中讨论迭代器和接口,但我什至不知道如何测试,更不用说使用这个库了。接口如何相互连接以及如何用它们实际执行测试/构建树让我感到困惑。

通常在这种情况下,我会寻找代码示例并从查看其他人的工作中获得启发,但是对于这个库,似乎没有任何示例代码。

谁能帮我弄清楚如何开始使用这个库构建行为树?如果这个问题非常无聊(我认为可能是),我很抱歉,但我现在很难理解接口中的枚举器和渐进式接口。

4

2 回答 2

13

我是 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 动作,它消除了序列中的两个动作)

同样,如果你们有问题,请不要犹豫。

于 2012-03-27T02:17:24.277 回答
0

Jason,该库似乎实现了我在其他 BT 库示例中看到的所有想法。我正在考虑将这样的库用于我自己的一个项目,所以在我这样做之前,我只是根据简短的检查来猜测如何使用这个库。

尽管如此,我认为您会为 Action 类的实例提供自己的回调函数,然后根据 BT 思想将各种动作拼凑成组组合(等到某些事情成立后再行动,直到其中一个动作成功,执行所有这些行动,除非一个失败,等等)。

高温高压

于 2012-03-02T00:37:22.877 回答