2010-11-21 13 views
0

Kürzlich habe ich versucht, einen robusten Verhaltensbaum unter Verwendung der treesharp library posted by apoc zu implementieren. Ich habe über Iteratoren und Interfaces in meinen Büchern gelesen, aber ich kann immer noch nicht herausfinden, wie man diese Bibliothek testen oder gar benutzen kann. Wie die Interfaces miteinander verbunden sind und wie man einen Test mit ihnen durchführt, ist verwirrend. Normalerweise würde ich in dieser Situation nach Codebeispielen suchen und die Erleuchtung von der Arbeit anderer Leute ableiten, für diese Bibliothek scheint es jedoch keinen Beispielcode zu geben.Treesharp C# Verhaltensbaumbibliothek - wo soll ich anfangen?

Könnte mir jemand helfen, herauszufinden, wie ich mit dieser Bibliothek einen Verhaltensbaum erstellen könnte? Es tut mir leid, wenn die Frage sehr noobish ist (und ich denke, dass es sein mag), aber Enumerators und progressive Schnittstellen innerhalb von Schnittstellen sind für mich derzeit extrem schwierig zu verstehen.

+0

es klingt wie Sie sich entschieden, mit Treesharp nach Wahl zu gehen, nicht, dass Sie es verwenden müssen.Für mich würde ich in einem solchen Fall etwas populäreres verwenden, für das Sie Codebeispiele finden würden. – BeemerGuy

+0

das problem ist ... auf der suche nach etwas populärer ... ich konnte wirklich nichts finden. Haben Sie irgendwelche anderen C# -Bibliotheken für Verhaltensweisen erstellt oder solche, die beim Erstellen eines robusten Verhaltensbaums verwendet werden könnten? das war der einzige, den ich finden konnte – Jason

+0

Irgendwelche Ideen? Könnte jemand aushelfen? – Jason

Antwort

0

Jason, Die Bibliothek scheint alle Ideen zu implementieren, die ich in anderen Beispielen von BT-Bibliotheken gezeigt habe. Ich bin dabei, eine solche Bibliothek für eines meiner eigenen Projekte zu nutzen, aber bis ich es tue, bin ich nur raten, wie man dieses basierend auf einer kurzen Inspektion verwendet.

Nichtsdestotrotz denke ich, dass Sie den Instanzen der Action-Klasse eigene Callback-Funktionen zur Verfügung stellen und dann verschiedene Aktionen in Gruppenkombinationen basierend auf BT-Ideen zusammenfügen (warten Sie, bis etwas wahr ist, bevor Sie handeln, handeln Sie bis zu einer dieser Aktionen) ist erfolgreich, führen Sie alle diese Aktionen durch, es sei denn, einer schlägt fehl usw.).

HTH

12

Ich bin der Autor von TreeSharp, wenn ihr irgendwelche Fragen haben, fühlen sich frei, mir eine E-Mail, um zu schießen (sein in jeder Quelldatei im Header enthalten ist).

Sie müssen zuerst die Konzepte von Verhaltensbäumen verstehen (die Unterschiede zwischen Selektoren, Sequenzen, Dekoratoren, Aktionen und Ähnlichem). Ich biete auch ein paar "Vanity" -Composites an, um die Dinge etwas leichter zu machen (wie Warten).

Die Konstruktor-basierte API kann Sie Bäume vollständig über ctors (mit dem Einsatz von Delegierten, die zur Laufzeit ausgewertet werden Entscheidungen zur Verfügung zu stellen, usw.) definieren

leider nie Ich habe um die „TreeExecutor“ Klasse zur Umsetzung, die Ausführung eines willkürlichen Verhaltenszweigs von etwas wie einer Tick() - Methode handhabt. Der einfachste Weg (mit einem PrioritySelector in diesem Beispiel, aber Sie können eine beliebige Composite verwenden) ist wie folgt;

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

Leider hängt es wirklich davon ab, wofür Sie es verwenden. (Da es so generisch ist, ist es schwierig, Beispiele zu geben, die für ein gegebenes Projekt sinnvoll sind. Ich habe es von Sachen zur KI-Logik, zu Workflows, bis hin zu Planungsprozessen verwendet)

Ein kleines Beispiel, das helfen kann ein bisschen;

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

Auch dies hängt wirklich von Ihren Anforderungen ab. Mit der Bibliothek können Sie alle Komposite untergliedern, um die Verwendung von Kompositen einfacher zu machen. (ZB; Sie können eine SetTargetAndRotate-Aktion erstellen, die die zwei Aktionen innerhalb der Sequenz eliminiert)

Nochmals, wenn Sie Fragen haben, zögern Sie nicht zu fragen.

Verwandte Themen