9

C# を使用して「ビヘイビア ツリー」を作成しようとしています。

知らない人のために説明すると、ビヘイビア ツリーは基本的に AI を構築できるフレームワークです。シーケンサー、セレクター、デコレーター、複合アクションなどがあります。

ここ( http://code.google.com/p/treesharp/ )にあるC#で「ビヘイビアツリー」を実装した単一のライブラリを見つけましたが、サンプルコードがないため、実際に使用する方法がわかりませんから描けます。このフレームワークを実際に使用する方法を示す簡単なサンプル コードを作成できる人はいますか? または、C# でビヘイビア ツリーを実装する別の方法を知っている人はいますか?

本当にありがとう!

4

3 に答える 3

15

その実装を見たところ、比較的単純なものになぜこれほど多くのコードが必要なのか疑問に思いました。

あなたの言うことから、あなたは行動を構成する簡単な方法を望んでいます。ここでの動作は、エージェントによる状態から0個以上のアクションへのマッピングであると私は推測します。これは、C#ラムダを使用して非常に簡単にモデル化できます。例えば:

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));

警備員に何かをさせるには、を呼び出しますpatrollingGuardBehaviour()。さまざまなサブアクションとテストは、ラムダとしてインラインではなく、適切なシグネチャを持つメソッドとして実装できることに注意してください。他のコンビネータをSelectorおよびに追加してSequencer、たとえば並列アクティビティを行うことができます。

于 2010-11-22T05:59:39.430 に答える
4

TreeSharp の背後にある開発者の 1 人であるapocdevには、ある種のスペルキャスティング World of Warcraft player に TreeSharp を使用するコードがあるようです

ここにスニピットがあります:

public Composite CreateSpellCheckAndCast(string name)
{
    return new Decorator(
        ret => Spells.CanCast(name),
        new Action(ret => Spells.Cast(name)));
}

確かではありませんが、ここでの使用法は非常に単純に思えます。クラスは、何らかのアクション ( ) を実行しようとする前にDecorator、述語 ( ) をチェックするように見えます。Spells.CanCastSpells.Cast

したがって、 aCompositeはおそらく、Action事前に述語をチェックしたり、いくつかのアクションを順番に実行したりするなど、いくつかのことを実行できる an です。

apocdev のブログでは、ビヘイビア ツリーの概要について言及しており、シーケンスセレクタ、およびデコレータのより一般的な説明にリンクしています。

于 2010-11-22T16:38:42.143 に答える