0

最近、 apoc によって投稿された treesharp ライブラリを使用して、堅牢なビヘイビア ツリーを実装しようとしています。私は本でイテレータとインターフェースを調べてきましたが、このライブラリを使用するどころか、テストする方法さえまだわかりません。インターフェイスが相互に接続する方法と、実際にそれらを使用してテスト/ツリーを構築する方法は、私を混乱させます。

通常、このような状況では、コード例を探して、他の人の作品を見て啓発を導き出しますが、このライブラリの場合、サンプル コードはないようです。

このライブラリを使用して動作ツリーの構築を開始する方法を理解してくれる人はいますか? 質問が非常に初心者である場合は申し訳ありませんが(そうかもしれないと思います)、列挙子とインターフェース内のプログレッシブインターフェースは、今のところ理解するのが非常に困難です。

4

2 に答える 2

13

私は TreeSharp の作成者です。質問がある場合は、お気軽にメールをお送りください (ヘッダー内のすべてのソース ファイルに含まれています)。

まず、ビヘイビア ツリーの概念 (セレクタ、シーケンス、デコレータ、アクションなどの違い) を理解する必要があります。また、物事を少し簡単にするために、いくつかの「バニティ」コンポジット (Wait など) も提供します。

コンストラクターベースの API を使用すると、ctor を介してツリーを完全に定義できます (実行時に評価されて決定を提供するデリゲートを使用するなど)。

残念ながら、Tick() メソッドなどからの任意の動作ブランチの実行を処理する「TreeExecutor」クラスを実装するまでには至りませんでした。最も簡単な方法 (この例では 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 アクションを作成すると、シーケンス内の 2 つのアクションが削除されます)

繰り返しますが、質問がある場合は、遠慮なく質問してください。

于 2012-03-27T02:17:24.277 に答える
0

ジェイソン、このライブラリは、BT ライブラリの他の例で私が見たすべてのアイデアを実装しているようです。このようなライブラリを自分のプロジェクトの 1 つに活用することを検討しているので、そうするまでは、簡単な調査に基づいてこのライブラリを使用する方法を推測するだけです。

それにもかかわらず、Action クラスのインスタンスに独自のコールバック関数を提供し、BT のアイデアに基づいてさまざまなアクションをグループの組み合わせにまとめると思います (何かが true になるまで待ってから行動し、これらのアクションの 1 つが成功するまで行動し、実行するいずれかが失敗しない限り、これらすべてのアクションなど)。

HTH

于 2012-03-02T00:37:22.877 に答える