私は 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 つのアクションが削除されます)
繰り返しますが、質問がある場合は、遠慮なく質問してください。