Jump to content
Unity Insider Forum

Brauchbares Dialog-System gesucht


Jomnitech

Recommended Posts

Hallo Zusammen

Kann mir jemand ev. ein gutes Dialogue-System empfehlen? Habe bis jetzt schon einiges aus dem Asset Store ausprobiert, sowohl free als ach paid Assets. Aber leider hat keines der Assets überhautp mal in den Example-Scenes einwandfrei funktioniert, überall waren Bugs die erst gelöst werden wollten. Und meistens beim beheben der Bugs, sind mir immer mehr und mehr unschöne Dinge aufgefallen.
Habe mal mit meinem eigenen Dialogue-System angefangen, aber bin bei der Implementierung von Antwortmöglichkeiten gescheitert, wurde mir einfach bei dem Aufbau den ich hatte zu unübersichtlich.

Was ich haben möchte:
- Möglichkeit um es mehrsprachig zu machen.
- Antwortmöglichkeiten mit entsprechenden alternativen Dialogen.
- Support fuer Gamepad, sollte also denke ich mit UI-Buttons aufgebaut sein.

Fancy Sachen wie Audio, oder Avatar Portrais brauche ich nicht.

Ev. ist ja jemand von euch schon ein Schritt weiter und kann mir eine Empfehlung zu einem Asset machen. Ich habe kein Problem mich in etwas einzuarbeiten, nur möchte ich eben weiteren Frust vermeiden.
Oder kann mir jemand sagen wie man verschiedene Antwortmöglichkeiten sinnvoll und uebersichtil macht? Habe diesbezueglich schon ein Auge auf Node-Based-Editor geworfen, aber bin daraus nicht so ganz schlau geworden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie du ja selber erkannt hast, macht es nicht viel Sinn, ein vorgefertigtes Asset zu nutzen. Fehler in der Assetprogrammierung mal ausgenommen, wirst du nie die Dinge bekommen die dein Spiel braucht.
Also selber schreiben!
Da du die Story deines Spiels kennen solltest, solltest du auch alle Dialogelemente der einzelnen Charaktäre kennen. Du solltest auch wissen, bei welchen Bedingungen die Charaktäre welche Texte sagen können. Das gilt genauso für die Texte des Players.
Das Wort Charakter sagt ja schon alles! Je nach Spiel muss man sich das Vertrauen oder Wohlwollen eines Charakters erst erarbeiten. Das kann über die richtige Frage oder Antwort geschehen. Das kann auch über erledigte / nicht erledigte Aufgaben geschehen. Bei komplexen Spielen, kann die Freundschaft zum Char A das Gegenteil beim Char B verursachen.
Damit das funktioniert musst du für jeden Char einen Status der Beziehung zueinander speichern. Über diesen Staus (können durchaus auch 2 oder noch mehr Werte sein) steuerst du die Frage/Antwortmöglichkeiten.
Das bedeutet, dass du die Charaktäre , wie ein Geschichtenschreiber, vorher definiert haben musst. Ja und dann weißt du ja welche Antworten / Informationen dieser Char dir geben kann.
Für jeden Status definierst du jetzt die Texte, die im Spiel dann in einer Liste oder einem Dictionary pro Charakter gespeichert sein werden. Über den Status kannst du in der Liste direkt auf die nötigen Texte zugreifen.
Diese Texte solltest du als JSON oder XML oder von mir aus auch nur als Textdatei gespeichert haben, die dann im Spiel eingeladen wird und der Liste bzw. dem Dictionary zugewiesen wird. Für jede Sprache hast du eine eigene Datei und je nach Spracheinstellung im Spiel wird dann einfach die entsprechende Datei eingelesen.

Wie du das jetzt darstellest, also ob du mit Butons arbeitest oder die Texte mit nem Klick auswählst, ist Nebensache. Die Darstellung ist niemals ein Element eines Dialogsystems.
Das Dialogsystem gibt nur Texte aus (und selbst wenn mehrere Antwortmöglichkeiten da sind, sind das ja auch nur Texte) , die anhand des Spielfortschritts, also eines oder mehrerer Parameter, ausgewählt werden. Natürlich musst du die Auswahl der Textelemente auswerten. Je nach Antwort muss du in einen anderen Bereich springen.
Hast du mehrere Frage-  Antwortoptionen, so verändern diese einfach nur den oder die Parameter. Das Ändern ist aber eine Sache eines anderen Bereiches, also eine Spielelogik Skriptes. Denn es muss ja nicht nur eine Frage oder Antwort zu einen gewissen Dialog führen, sondern auch eine erledigte Mission oder auch ein Gegenstand im Inventar. 


Beispiel:
Char 1 weiß etwas Wichtiges, mag dich aber nicht und gibt dir ersteinmal nur ne standard Antwort. Möglicher Parameter könnte Zuneigungswert sein, der jetzt noch auf 0 steht.
Der Player hat für diesen Char erstmal nur 2 Dialogmöglichkeiten. Ein "Hallo, wie geht's" und ein " Bis später!" Denn der Char weist ihn mit der Begrüßung gleich zurück.
Char 2 hat von Anfang an einen Zuneigungswert von 1. Der Player kann mit ihm ein Dialog starten bei dem er freundlich sein kann oder eben abwertend. Je nachdem, was er sagt, bekommt er eine entsprechende Antwort und neue Dialogmöglichkeiten. Außerdem ändert sich der Zuneigungswert positiv oder negativ.
Es würde jetzt also mit einem "Hallo, wie geht's?" anfangen. Dieses ist noch neutral zu bewerten. Die Antwort wäre jetzt: "Nett, dass du fragst....". Also nächste Dialogsequenz käme jetzt eine positive Antwortmöglichkeit auf die "Nett, dass du fragst.."-Sache, oder eine Negative. Hier würde sich auch der Zuneigungswert verändern. Bei der positiven Entscheidung würde nach einer Antwort des Chars eine weitere Dialogsequenz kommen. Bei einer negativen Entscheidung wäre der Dialog  mit einer verärgerten Antwort des Chars ersteinmal zuende.
Ob und wie sich der Zuneigungswert dieses Chars wieder ins Positive ändert ist dann eben vom Spiel abhänig. Könnte sein, dass dieser Char einen Cooldown hat und von alleine wieder eine positive Einstellung zu dir bekommt.
Wenn du dich aber Positiv geäußert hättest, würdest du im weiteren Dialog erfahren, dass der Char1 unheimlich gerne Äpfel isst.
Du sammelst also einen Apfel ein und bekommst beim Char1 jetzt eine Dialogmöglichkeit, den Apfel im anzubieten (abhängig davon, ob den Apfel im Inventar hast). Dieses Würde die Zuneigung vom Char1 erhöhen und eine weitere Dialogsequenz würde erscheinen, bei der du die wichtige Information bekommen würdest.

Du hast also Textbausteine für Begrüßung (was auch ein PositiverDialog ist, wo aber einfach nur weiter gesprungen würde) , Verabschiedung, Positiver-Dialog, Negativer-Dialog und Quest. Jeder dieser Bereiche springt in eine entsprechende Funktion.

Ja und welche Parameter brauchst du jetzt?

In meinem Beispiel eigentlich nur 2.
Jeder Char hat einen Zuneigungswert zum Player. Dadurch steuerst du wie die Dialoge ablaufen.
Jeder Char hat einen Questwert zum Player. Dadurch steuerst du die Quests oder Hints die dir gegeben werden. Sachen, die erledigt sind sollen ja nich nocheinmal kommen. Und wenn Sachen noch nicht erledigt sind, soll die Antwort entsprechend sein.
Die Spielelogik weiß, welche Gegenstände oder erledigte Quests für welchen Char wichtig sind und erhöht diesen Questwert natürlich in Abhängigkeit ob dieses Quest nicht schon einmal erledigt wurde.

Deine Texte für den Char und auch für den Player kannst du also mit einer Kombination aus Buchstaben und  Zahlen zusammenbauen.
Q0Z0 Wären die Texte des Char1 bei der ersten Begegnung. Wobei Q jetzt gar nicht ausgewertet wird.
Q1Z0 wären die Texte sobald du einen Apfel hast. Übergibst du den Apfen, würde sich Z erhöhen.
Jetzt kämen Dialogtexte von Q1Z1 wo du einen Auftrag annehmen kannst. Tust du es, erhöht sich Q. Tust du es nicht, bleibt alles wie es ist, es sei denn, du beleidigts ihn. Dann würde sich Z verringern und du müsstest ihm ersteinmal wieder einen Apfel bringen um wieder in Dialog zu kommen.
Q2Z1 wäre jetzt da, wenn du den Auftrag angenommen hast. Würdest du jetzt mit dem Char sprechen, würde er dich nach dem Auftrag fragen und du könntest das nur verneinen.
Q3Z1 wären die Dialoge wenn du den Auftrag erledigt hast und es ihm mitteilen willst. Nachdem du es ihm mitgeteilt hast, würde sich Q und Z erhöhen. Die Zuneigung ist jetzt so hoch, dass du ihn nicht mehr verärgern kannst.
Q4Z2 wäre für diesen Char jetzt das Ende. Er hat nichts mehr für dich, ist aber jetzt dein Freund.

Die Texte dieser Bereiche wären dann natürlich auch  unterschieden. B - Begrüßung, P - positiver Dialog, N - negativer Dialog, Q - Quest, V- Verabschiedung.
Je nachdem, ob ein Text dafür da ist, würde das Textfeld auch angezeigt werden, ansonsten ist das Feld nicht da.

Das Ganze kann man natürlich noch viel mehr verschachteln, wenn man will. Aber es wird dann auch recht komplex.
Wie du in meinem Beispiel siehst, ist das aber eigentlich gar nicht so schwer. Es muss jedoch für ein Spiel angepasst sein, deswegen funktionieren fremde Assets nur bedingt.

 






 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbieVielen Dank für deine Antwort, hat mir jetzt sehr weitergeholfen.

vor 11 Stunden schrieb malzbie:

Wie du ja selber erkannt hast, macht es nicht viel Sinn, ein vorgefertigtes Asset zu nutzen

Dachte mir eben, wieso immer das Rad neu erfinden, wenn man eine solide Grundstruktur schon hat, kann man diese doch erweitern. Aber wie dem meistens so ist, bis man das gemacht hat, kann man es gleich selber so machen wie man es von Anfang an haben möchte.

 

vor 11 Stunden schrieb malzbie:

Diese Texte solltest du als JSON oder XML oder von mir aus auch nur als Textdatei gespeichert haben

Das ist denke ich der Ansatz den ich brauche. Habe alles bisher als strings direkt im Inspektor gemacht, da verliert man schnell die übersicht wo jetzt welcher Dialog war. Ein anderes Asset hat für jeden Text ein separates Skript erstellt und dort den Text als string "hard coded", fand ich auch unschön. Aber alles als Textdatei gefällt mir gut, da kann ich das auch vernüftig orden. Macht es auch einfacher Texte zu überarbeiten, oder mal jemandem zum lesen zu geben.

 

vor 11 Stunden schrieb malzbie:

Das Ganze kann man natürlich noch viel mehr verschachteln, wenn man will. Aber es wird dann auch recht komplex.

Ja, da habe ich immer mühe mir die Grenzen zu setzen 🙃. Aber grundsätzlich möchte ich bei meinem jetzigen Projekt mich einfach mit verschiedenen Aspekten auseinandersetzen, sei es wie jetzt Dialoge oder Animationen oder 3dModellierung,  ohne es immer masslos zu übertreiben.

vor 11 Stunden schrieb malzbie:

Deine Texte für den Char und auch für den Player kannst du also mit einer Kombination aus Buchstaben und  Zahlen zusammenbauen.

Sehr schöner Ansatz, danke für den Input.

 

Hast du in dem Fall selber schon das ein oder andere Dialogsystem erstellt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Freut mich, wenn ich dir ein paar Ansätze liefern konnte.
Ich selber habe noch kein richtiges Dialogsystem gebaut, weil ich es bis jetzt noch nicht gebraucht habe.
Aber wie bei fast allen Dingen, die man in Spielen so sieht, versuche ich immer herauszufinden wie dieses Ding wohl gemacht wurde. Ja, und dann Teste ich das ein wenig, ohne jetzt wirklich damit etwas tun zu wollen. :)
Was ich dir noch empfehlen würde:
Ein kleines Editor-Programm schreiben, was alle deine Textelemente als JSON-Datei abspeichert. Und in dem du die Texte auch bearbeiten kannst.
Denn man kann so eine Datei zwar einfach mit nem Texteditor anschauen und bearbeiten, aber es ist schon recht mühsam, darin dann die richtige Stelle zu finden, wenn du mal was korrigieren willst. Bei meinen Flippern mache ich das auch alles per Hand, weil da ja nicht soo viele Texte drin sind, aber inzwischen, beim 9ten Flipper, wird es echt nervig. ;)
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vorgefertigte Assets machen genau dann Sinn, wenn sie exakt abgesteckte Aufgaben übernehmen und sonst nichts. Generell zu sagen, dass vorgefertigte Assets schlecht sind, finde ich problematisch. Mein Pooling-Paket zum Beispiel macht genau eine Sache: Pooling. Es macht es auf eine Art, die dir im Projekt nicht reinpfuscht oder dir irgendeinen Workflow vorschreibt - außer eben, wenn es um Pooling-Verhalten geht. Problematisch sind "nur" die Assets, die einem bestimmte, projektweite Workflows vorschreiben und/oder Einfluss darauf nehmen, wie dein Produkt am Ende aussieht. Dass dein Inventarsystem im Spiel sich so oder so verhält, weil du ein Inventar-Asset benutzt. Aber wenn du ein Asset hast, das dir erlaubt, deine Systeme genau so zu implementieren, wie du es willst, ist ein Paket von Dritten meiner Meinung nach kein Problem.

Oft ist es nur so, dass die Pakete so viel Einarbeitung benötigen, das man in derselben Zeit auch ein eigenes Asset selber bauen kann, und da hat man dann die Garantie, dass es so funktioniert, wie man es haben will :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Sascha Falls du mich mich damit meinst :

Zitat

Generell zu sagen, dass vorgefertigte Assets schlecht ...

dann habe ich mich da missverständlich ausgedrückt. Ich bezog mich lediglich auf Dialogsysteme. :)
Es gibt einen Haufen Assets die gut sind, weil sie einem Arbeit abnehmen. Aber Dialogsysteme oder auch Inventar Assets gehören, meiner Meinung nach, nicht dazu.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb malzbie:

Textelemente als JSON-Datei abspeichert

Da muss ich mich mal schau machen wie das geht. Für jeden einzelnen Dialog eine eigene Textdatei zu machen wäre natürlich doof.

@Sascha

Gut auf den Punt gebracht. Habe Assets wie Character Controller oder Decal-System im Einsatz, mit denen ich sehr zufrieden bin und eben genau das machen was sie sollen, micht mehr und nicht weniger. Und wie du schon geschrieben hast, habe ich auch Inventarsysteme ausprobiert, bis ich dan mein eigenes gemacht habe, aus besagten Gründen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Jomnitech:

Da muss ich mich mal schau machen wie das geht. Für jeden einzelnen Dialog eine eigene Textdatei zu machen wäre natürlich doof. 

Ne, das musst du natürlich nicht. Solch eine Datei kann theoretisch alle Dialoge drin haben. Die Sache ist nur, dass du den Bereich finden musst, den du ändern willst.
Ich persönlich würde für jeden einzelnen Charakter eine eigene Datei anlegen, die alle Diealogtexte dieses Charakters drin hat. Und das für jede weitere Sprache nocheinmal.
Natürlich können auch alle Sprachen in einer Datei drin sein. Aber so eine Datei wird dann immer unübersichtlicher.
So etwa sieht eine JSON Datei aus:

{"Q0Z0B":"Guten Tag, der Herr!","Q0Z0P":"Das wäre schön.","Q0Z0N":"Das gefällt mir gar nicht","Q0Z0Q":"Bring bitte den Sack zum Bäcker","Q0Z0V":"Auf wiedersehen!","Q1Z1B":"und so weiter",.......}

Du hast immer ein Schlüsselwort (hier  Q0Z0irgendwas) in Anführungszeichen, gefolgt von einem Doppelpunkt und dann den Wert dazu. Dann kommt ein Komma und das nächste Datenpaar folgt. Das könnte ewig so weitergehen und vorallem kann der Wert bei einem String auch eine ganze Buchseite lang sein. Da in einer JSON Datei einfach nur eine einzige Textzeile ist, kann man alles ganz einfach per Texteditor editieren. Aber das ist mühsam. Deswegen empfehlt sich ein Hilfstool.
Einfach etwas bei dem ich nach Schlüsselwörtern suchen kann und dann den Wert dazu angezeigt bekomme, damit ich dort Änderungen vornehmen kann und das ganze wieder abspeichere. Das Tool sollte natürlich auch in der Lage sein neue Datensätze anzulegen. ;)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...