Ich habe gerade diese Implementierung betrachtet und ich frage mich, warum so viel Code für etwas relativ einfaches benötigt wird.
Von dem, was Sie sagen, wollen Sie eine einfache Möglichkeit, Verhalten zu komponieren. Ein Verhalten hier, vermute ich, ist eine Zuordnung von einem Zustand zu null oder mehr Aktionen durch einen Agenten. Sie können dies sehr einfach mit C# Lambda modellieren. Zum Beispiel:
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(); }
}
Die Blätter Ihres Baumes sind einfache Aktionen, die dem Staat etwas entsprechendes tun. Sie "laufen" einen Baum, indem Sie ihn einfach ausführen.
Wenn Sie Lust haben, können Sie dieses Schema parametrisieren, um den Status explizit zu machen.
Hoffe, das hilft.
---- ---- Addendum
Jason für ein Beispiel gefragt, wie Sie diesen Ansatz verwenden könnte, also hier ein einfaches „AI“ patrouillieren Wächter Beispiel (ich nehme an World auf eine Beschreibung der entspricht Umgebung zum Zeitpunkt wird das Verhalten Baum) ausgewertet:
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));
die Wache etwas tun zu machen, patrollingGuardBehaviour()
rufen Sie einfach an. Beachten Sie, dass die verschiedenen Subaktionen und Tests als Methoden mit den richtigen Signaturen anstelle von Inline als Lambdas implementiert werden können. Sie können andere Kombinatoren zu Selector
und hinzufügen, z. B. für parallele Aktivität.
Die Bibliothek, die Sie auf code.google.com erwähnt haben, wurde vor fast einem Jahr hinzugefügt und zuletzt zwei Wochen später aktualisiert. Wenn Sie vorhaben, es zu benutzen, werden Sie wahrscheinlich keine Beispiele finden, es ist vielleicht besser, wenn Sie nach einer anderen Bibliothek suchen oder Ihre eigene entwickeln. – tbridge