Das heißt, was hängt mit was zusammen und wie bewegt man sich zwischen den Sprachzeilen, wenn eine Nebenkonversation endet?
Wenn Sie Beispiele für einen grundlegenden Dialogfeldbaum in C # haben, stellen Sie diese bitte bereit.
Das heißt, was hängt mit was zusammen und wie bewegt man sich zwischen den Sprachzeilen, wenn eine Nebenkonversation endet?
Wenn Sie Beispiele für einen grundlegenden Dialogfeldbaum in C # haben, stellen Sie diese bitte bereit.
Antworten:
Der Name "Dialogbaum" ist etwas irreführend - es handelt sich normalerweise um einfach gerichtete Grafiken , nicht nur um Bäume . Die grundlegende Datenstruktur solcher Graphen besteht normalerweise aus einer Art "Daten" für die Knoten, die die Punkte darstellen, an denen wir uns in der Konversation befinden, und Verknüpfungen von diesen zu anderen Knoten, die darstellen, was von den Teilnehmern gesagt und getan wird und optional Bedingungen, um die Sichtbarkeit zu beschränken, oder Skripts, um verschiedene zusätzliche Aktionen auszuführen. In der Regel ist einer der Knoten der Standardstartknoten (typische Bezeichnungen hierfür sind "ROOT", "START" und "GREETING"), und Knoten, von denen keine gültigen Links ausgehen, beenden die Konversation.
In den meisten Fällen wird der Graph im Speicher als eine Liste von Node
Datenstrukturen dargestellt, die jeweils mindestens eine ID und eine Liste von 0 ... n Link
Datenstrukturen aufweisen. Die Liste kann lokal für den NPC oder global sein. Der zweite Fall ist vorzuziehen, wenn Sie viele allgemeine NPCs haben, mit denen Sie zur Information sprechen können, die jedoch selbst keine spezifischen Konversationen anbieten. Das System selbst findet den Start-Konversationsknoten für den NPC, merkt sich seine ID als aktuelle Konversations-ID, zeigt die aktuell gültigen Links an, aus denen der Spieler auswählen kann (oder "[Konversation beenden]", wenn keine gültigen Links vorhanden sind) und wartet Eingang. Wenn der Player einen Link auswählt, werden die zugehörigen Dialogzeilen angezeigt und alle zugehörigen Skripts ausgeführt.
Anstatt komplexe Regeln und Bedingungen für Links zu haben, können Sie stattdessen eine einfache "gültige" boolesche Variable verwenden, die entweder über die Skripte anderer Konversationslinks (einschließlich des Standardknotens vom Startknoten) oder von außerhalb geändert werden kann Mechanismen. Im Allgemeinen ist dieser Ansatz einfacher, aber nur für Spiele mit sehr wenigen derartigen Gesprächen geeignet, da er die Logik von "Wann ist diese Reaktion möglich?" weg von den Antwortdaten selbst.
Beachten Sie, dass die hier beschriebene Struktur sich geringfügig von der von Byte56 unterscheidet, da die Knoten keine Dialogzeilen benötigen. Die Links können sie alle haben. In der grundlegendsten Variante ergibt dies die folgende Struktur.
Dialogbäume werden mit einer gerichteten Diagrammstruktur erstellt .
Der Graph wird basierend auf den Dialogentscheidungen des Spielers durchlaufen. Die dem Benutzer zur Verfügung gestellten Dialogoptionen stammen von den Kanten, die die Pfade zu anderen Dialogknoten definieren.
Gerichtete Graphen sind eine grundlegende Datenstruktur. Sie können leicht implementiert werden und Sie werden es wahrscheinlich selbst implementieren wollen. Da Sie das Diagramm an Ihre Dialoganforderungen anpassen möchten.
Einige der Knoten müssen möglicherweise spezielle Bedingungen erfüllen, um angezeigt zu werden. Zum Beispiel würde der Spieler eine Fertigkeit im Sprechen über X benötigen. Oder der Spieler muss Mission Z abgeschlossen haben, bevor er einen Zweig des Dialogs durchlaufen kann. Oder sie müssen 4 Mal etwas fragen, bevor der NPC es mit ihnen bespricht. Diese Funktionen sind an Ihr Spiel angepasst. Erwähnenswert bei der Implementierung der Knoten- und Kantenüberquerung. Natürlich ist es immer am besten, mit der einfachsten Form zu beginnen und von dort aus aufzubauen.
Ich habe ein einfaches Dialogbaum-System erstellt: http://iki.fi/sol/d3/ Die "Engine" selbst ist derzeit normal c, aber die vom Editor erzeugten Daten sind in jeder Sprache recht einfach zu verwenden. Das Tool gibt XML, JSON und ein benutzerdefiniertes Binärformat aus.
Das Hauptkonzept ist ziemlich einfach:
Jeder Knoten (den ich wie im obigen Beispiel "Karte" nenne) des Dialogs besteht aus Fragetext und null oder mehr Antworten. Jede der Antworten führt zu einer anderen Karte.
Es gibt auch ein Tag-System, bei dem dem Benutzer bestimmte Antworten nur angezeigt werden, wenn ein Tag festgelegt wurde (oder kein Tag festgelegt wurde). Durch das Eingeben einer Karte werden bestimmte Tags festgelegt (oder deaktiviert).
Das ist so ziemlich alles, was man für jeden Dialog in einem Spiel braucht. Der "Fragentext" kann reiner Text sein oder ein Skript, um die Animation zu steuern oder so weiter.
Sie können TreeSharp und Verhaltensbäume verwenden, um ein Dialogsystem zu modellieren. TreeSharp ist eine Bibliothek, die eine einfache Implementierung eines Verhaltensbaums bietet. IA Bots für Wow sind damit fertig, also ist es ausgereift ... :)
Meine Implementierung verfügt über Knoten, auf denen Sie zwischen Antworten wählen können. Jede Antwort kann mit einem Dialog oder einer Aktion oder einer Abfolge von Aktionen oder einem Knoten verbunden werden, auf dem Sie zu einem anderen Dialog wechseln können ... oder was Sie möchten ...
Ich habe Brainiac Editor verwendet, um es visuell zu machen ... aber am Ende erzeugt es C # -Code basierend auf Treesharp ...
Sie möchten einen gerichteten (möglicherweise zyklischen) Graphen.
Sie modellieren die Knoten als Objekte, und alle ausgehenden Pfeile im Knoten eines Diagramms werden auch als separate Objekte modelliert. Der Knoten verfügt über eine Liste ausgehender Pfeile, und jedes "Pfeil" -Objekt verfügt über einen anzuzeigenden Text und einen Verweis auf das Ziel. Ich bin mir nicht sicher, aber ich denke, in C # werden Objekte immer referenziert. Erstellen Sie also zuerst die Objekte und fügen Sie dann beim Erstellen der Pfeilobjekte dasselbe Objekt in das Zielfeld von zwei Pfeilen ein. (In C ++ würden Sie einen Referenz- oder Zeigertyp, Node & oder Node *, verwenden.)
Zum Laden von Dingen wie diesem von der Festplatte gibt man normalerweise jedem Knoten eine eindeutige ID-Nummer und lädt dann alle Knoten in ein Array, in dem der Index diese eindeutige Nummer ist. Dann werden die Pfeile serialisiert, indem die Nummer und nicht das eigentliche Objekt ausgeschrieben wird.
Wenn Sie einen Pfeil laden, verwenden Sie das Array und die ID, um einen Verweis auf den Knoten abzurufen, auf den er verweist. Wenn Sie das Objekt zweimal ausgeschrieben hätten, würden Sie zwei separate Objekte erhalten, die einfach identisch aussehen, was wahrscheinlich nicht das ist, was Sie wollten.
Das Verarbeiten eines Dialogbaums wird sehr einfach. Sie setzen einfach den Wurzelknoten in eine currentNode
Variable, zeigen das Ganze irgendwie an, und wenn Sie eine Auswahl treffen, setzen Sie es rootNode
auf das Ziel des Pfeils. Im Pseudocode:
Node& currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
stage.displayNode( currentNode );
currentNode = stage.waitForUserToChoose();
}
Vor kurzem musste ich so etwas mit Node entwickeln und entschied mich für eine sehr einfache Textdateistruktur, um einen gerichteten Graphen von Konversationsknoten darzustellen.
Sie können den resultierenden Code und das Textformat unter folgender Adresse sehen:
https://github.com/scottbw/dialoguejs
Es unterstützt (noch) keine Bedingungen oder Ereignisauslöser, ist aber wahrscheinlich für viele Spieleentwickler einfach genug, um damit zu beginnen.
(Der Code selbst in der GPL, übrigens)
dialog-tree
Etikett zu haben .