Dialog System

  • Hi,


    ich arbeite zur Zeit an einem Dialog System.


    Da @Traumwolf mich darauf angesprochen hat und es sicher auch den einen oder anderen interessiert wie die Konzeption eines solchen Projektes aussehen könnte, habe ich mal dieses Thema eröffnet.


    Da so ein System sehr komplex werden kann und ich kein Programmierer bin, kann ich natürlich auch jede Hilfe, Vorschläge oder Ideen gebrauchen.
    Es ist somit jeder eingeladen hier mitzuwirken.


    Wenn wir hier zusammen ein System entwickeln können das flexibel genug ist um in den verschiedensten Projekten genutzt zu werden, würde ich das ganze dann in einem Wiki Tutorial zusammenfassen.



    Meine Anforderungen an ein Dialog System


    Da ich selbst an einem Action Adventure in der Tradition von Gothic arbeite, brauche ich ein System das mit sehr viel Text umgehen kann aber auch auf alle mögliche Bedingungen reagieren kann.
    Auch ist es mir wichtig das es später beim Dialog/Story Design einfach zu handhaben ist, sprich NPC in die Welt stellen, Text geben und fertig.



    Was habe ich bis jetzt


    Im Moment benutze ich eine CSV-Datei die ich als DataTable importiere.
    In dieser stehen Zeile für Zeile die Infos für jede Dialogzeile. Das heißt einmal natürlich der Text aber auch welche Bedingungen erfüllt sein müssen um diesen anzuzeigen.
    Da das in meinem Fall sehr umfangreich ist, werde ich mir wohl ein Tool programmieren das die CSV-Datei generiert.
    Es ist geplant das jeder NPC seine eigenen Texte und die des Spielers hat, so hab ich alles an einer Stelle beisammen und muss nicht bei Änderungen mit verschiedenen Datensätzen arbeiten.
    Also Spieler spricht NPC an und der übernimmt die Steuerung über den Dialog.


    Per Interface schicke ich dann ein TextArray ans HUD.
    Dieses schaut dann ob es NPC oder Spieler-Texte sind und zeigt diese dann entsprechend an.



    Was brauche ich


    Wie verwalte ich am besten die Daten?
    Da man DataTables scheinbar nicht ändern kann, kopiere ich alles in ein Struct das lauter Arrays enthält. Die Frage ist jetzt ob jeder NPC sich seinen Datensatz holt oder ob alle auf den grossen globalen Datensatz zugreifen.


    Die Logik für die Auswertung.
    Die Macht mir sorgen. Wenn ich das mit massig if-Abfragen mache wird das sehr unübersichtlich und Fehleranfällig und lässt sich zudem noch schwer warten.


    Ich frage da mal gezielt die Informatiker.
    Gibt es da etwas wie man Entscheidungen treffen kann. Ein paar Begriffe zum googeln wären nicht schlecht.



    Das war es jetzt erstmal, hab mich extra versucht kurz zu fassen denn sonst liest es ja keiner. :D Aber ich hoffe mal wir werden das hier noch ausführlich diskutieren.


    Fragen, Ideen, Kritik sind ausdrücklich erwünscht.


    Gruss
    DarkFaces

  • Heya,


    erstmal vielen Dank fürs Losstoßen =D


    da ich selber das ganze in C++ und einer SQLite-Datenbank realisieren möchte (was der CSV-Datei gar nichtmal so unähnlich ist), hier mal meine Idee:


    Ich erstelle eine Datenbank mit:


    dialogue_npc_table


    1. Integer als Dialog-ID
    2. String mit dem DialogText (am besten mit Formatierungszeichen, die ich dann vom UI interpretieren lasse, z.B.<h1>Überschrift</h1> wird dann zu ÜBERSCHRIFT, also eigentlich HTML MarkingLanguage^^)
    4. Int-Array mit SpielerAntworten, die in einer anderen Tabelle eingespeichert sind. Der Array verweist auch auf IDs in der anderen Tabelle


    dialogue_player_table


    1. Integer als Antwort-ID
    2. String mit Antwort
    3. dialogue_npc_table ID Verweis, um den nächsten Dialog anzuzeigen.


    Ich verlinke also immer zwischen diesen beiden Tabellen hin und her, um eine Konversation zu erreichen.


    Für dieses System baue ich mir dann eine "einfache" Dialog-Komponente, die ich NPCs zuweisen kann. Ich weise dem Ganzen dann eine Int-Variable mit einer ID zu, die sich dann "einfach" den dazu gehörigen text aus den Tabellen holt und je nach Antwort dynamisch reagiert.


    Das einzige Problem .... es wird sehr schnell unübersichtlich. Binde ich dann später ein QuestSystem ein, kann ich gewisse "Antworten des Spielers" auf Quests weiterleiten, indem ich eine zusätzliche Spalte mit einer Quest-ID
    anhänge. Ist die Stelle NULL, gibts keine Quest, hat sie eine ID, sollte eine Quest existieren.


    Was deine Bedingungen angehen, da ist immer die Frage ... was für Bedingungen du denn genau brauchst, die musst du dann auf die gemeinsamen Nenner runterbrechen^^ Ich glaube dafür gibts kein "Patentrezept". Du könntest eigentlich ein EventSystem einbauen, das bei erfolgreicher Erfüllung eine hinterlegte ID(Dialogs-ID) freischaltet, indem es in einer Spalte einen bool Wert von false auf true setzt. Und dieses Event-System als Komponente überall dort, wo du was für dein DialogSystem triggern willst^^ Aber da kenne ich mich auch noch nicht wirklich aus =/


    Ein Event schickt, sobald es "getriggered" wurde,Informationen an die richtige Stelle und sollte daher eigentlich sehr performant sein. Du müsstest halt irgendwie Custom Events für jedes deiner "Dialog-Freischaltungs-Fälle" erstellen.


    Das sind jetzt so meine groben Gedanken zu der Sache, bin noch weit davon entfernt damit anzufangen .... leider =/ Wobei ich schon Lust habe, das Ding vorzuschieben =D Dann ist es nen friedvolles-Dialog-Spiel^^


    Die Tabelle an sich kannst du ja theoretisch mit Excel erstellen und dann über Blueprints "einlesen" lassen. Die texte ind er Unreal einzugeben und zu verwalten halte ich persönlich für eine schreckliche Idee/Vorstellung. Da habe ich lieber eine Excel-Tabelle, die der Story-Teller leicht (ohne irgendwelche Kenntnisse, ausser Excel bedienen zu können) bearbeiten kann. Ich muss dann lediglich meine IDs in meiner Dialogs-Komponente eingeben ... und fertig. Man könnte auch mit Dialogs-Kennzeichnungen anfangen (als String), über die man zugreift .... oder sortiert nach NPC-Namen/IDs, die dann jeweils eine zusätzliche Spalte mit IDs für ihre eigenen Dialoge haben.


    Bei der ersten Variante ... halte ich alles relativ "offen" und wiederverwertbar, bei der zweiten Variante ist es irgendwie persönlicher. Ich denke ein ganz wichtiger Punkt ist, das der Dialog-Designer sehr schnell die Daten von spezifischen NPCs finden kann ... ohne dass er lange mit Scrollen beschäftigt ist^^

  • Hi,


    Datenbank ist für mich wohl keine Option, wird ja vom Editor nicht unterstützt.
    Und jetzt extra in C++ einarbeiten um ein Dialog System umzusetzen ist mir dann doch zu viel Aufwand im Verhältnis zum Nutzen.


    Wäre aber interessant welche Vorteile man hat. Kannst dann ja mal berichten.


    Zum Thema Queste hab ich mir auch schon Gedanken gemacht, im Grunde sind es ja nur Dialoge die dann ein entsprechendes Event auslösen. Dafür hab ich natürlich auch einen Wert vorgesehen.
    Am liebsten würde ich das so weit wie möglich trennen aber irgend eine Schnittstelle muss es ja geben. Werde ich mich wohl als nächstes mit beschäftigen.


    Was meine Bedingungen angeht werde ich einfach mal schauen wie weit ich komme.
    Vielleicht hat ja noch jemand eine Idee.


    Die Dialoge in einer Tabelle zu bearbeiten ist aber auch nicht wirklich schön. Vor allem wenn man mehrere Tabellen hat, dann schleichen sich da bald Fehler ein.
    Wenn Du eh mit einer Datenbank arbeitest kann du ja auch was basteln um die Daten vernünftig zu bearbeiten.
    Kommt natürlich darauf an ob der Aufwand lohnt.


    Gruss
    DarkFaces

  • Nee, meinte eigentlich, dass du ja mit Excel eine Datentabelle im CSV-Format erstellen kannst, vom Prinzip halt exakt ... wie es bei einer C++ mit SQLite Lösung ist^^ Da tut sich vom Konzept nicht viel =D


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
    (Tut für Excel to Unreal)


    Die Dialoge in einer Tabelle zu bearbeiten ist aber auch nicht wirklich schön. Vor allem wenn man mehrere Tabellen hat, dann schleichen sich da bald Fehler ein.
    Wenn Du eh mit einer Datenbank arbeitest kann du ja auch was basteln um die Daten vernünftig zu bearbeiten.
    Kommt natürlich darauf an ob der Aufwand lohnt.


    Bin damit auch nicht wirklich zu frieden^^
    Ich wüsste jetzt auch ehrlich nicht, wie ich eine "schöne" UI für ein Dialog-Quest-Editor bauen würde. =/


    Gibt halt momentan ein C++/SQLite-Plugin, das du "einfach" installieren kannst und mit der Datenbank "einfach" über BPs kommunizierst (https://github.com/KhArtNJava/SQLite3UE4). Aber da find ich das mit den BPs echt schon zu viel des Guten^^

  • Achso, CSV-Dateien erstelle ich natürlich in einem Excel artigen Programm.
    Finde ich nur nicht so schön, und in meinem Fall kommen da ja auch noch jede Menge Werte dazu um das ganze zu steuern. Wenn ich mich da mal in der Zeile vertue hab ich gleich nen Bug.
    Daher ein extra Tool.


    Bei einer Datenbank ist es ja ähnlich, der Endanwender hat ja dann irgend ein Programm wo er Werte eingibt oder ausliest.
    Wenn du eh schon programmierst kannst du da ja gleich was basteln.
    Sql sollte das Stichwort sein wenn ich mich nicht irre.


    Auf Plugins möchte ich weitgehend verzichten, in zwei Jahren hat der Entwickler keine Lust mehr und dann steh ich da.


    Gruss
    DarkFaces

  • Meines Wissen gibt es für die UT4 sogar fertige Blueprints bzws nach einem Node Based editor auf dem Markplace da ich selbst nicht programmieren kann hab ich schon lange mit dem Gedanken gespielt es mir zu besorgen, glaub der Preis ging auch in ordnung bei 74€ "Dialogue Plugin" sollte es heissen.
    Es sollten sich damit Gesprächsabläufe zwischen Actoren erstellen lassen, Frage, Antwort usw......

    Geschichte kann so viel doch vorallem, Fluch und Segen sein.
    Segen wenn man aus ihr Lernt!
    Fluch wenn man an ihr Hängt!

    Einmal editiert, zuletzt von Meisterlie ()

  • Ich glaub da gibs sogar mehrere.
    Man muss halt schauen ob es für die eigenen Bedürfnisse passt und ob man es dem eigenen Spiel anpassen kann.


    Ich möchte halt gern mein eigenes machen, zu einem weil es mir Spaß macht und ich kenne das Ding dann in und auswendig.
    Wenn dann irgendwo zwickt kann ich es jederzeit anpassen.