Trigger Funktion/Event beim drücken eines Buttons meines DialogSystems

  • Hallo Leute, eine weitere Frage,


    ich habe ein DialogSystem angefangen, auf DataTables basierend.

    In meinem DataTable habe ich neben DialogText etc. auch ein Array erstellt, welches einen Text und einen DialogState Integer beinhaltet, aus welchen ich meine Antwortoptionen als Buttons erstellen möchte.


    Nun möchte ich irgendwie an den Button meinen DialogState Integer heften, so dass bei einem Click auf den Button der Dialog weiter geführt wird, und zur nächsten State springt, ein Dialog eben.

    Auch möchte ich die Möglichkeit einbauen, dass beim Click auch ein Event b.z.w eine Funktion getriggert werden kann. Beispielsweise, dass der Actor mit dem der Dialog geführt wird in den Angriffsmodus wechselt oder ähnliches.


    Meine Fragen:

    - Wie gebe ich dem Button einen Click Event und den anzuspringenden DialogState aus dem DataTable mit. Ich habe es mit "CreateEvent" versucht und mit "Bind Event to On Clicked" versucht, allerdings kann ich den State nicht mitgeben um den Dialog weiter führen zu können. Wie würdet ihr so etwas umsetzen?


    - Des weiteren frage ich mich wie ich auch eine andere Funktion triggern kann die das Verhalten oder Aktion des DialogActors beeinflusst. Woher bekomme ich die Funktion? Kann ich evtl die Funktion mit aus dem DataTable übergeben?

    Muss die Funktion im Blueprint meines DialogSystem geschrieben sein, oder kann ich einen anderen Actor ansprechen wie beim Angriffsmodus Beispiel. Kann ich evtl. auch eine FunctionLibrary verknüpfen?

  • Ich bin mir nicht ganz sicher, ob ich dein Anliegen jetzt zu 100 % richtig verstanden habe. Aber, wenn deine Dialogauswahl an bestimmte Aktoren geht, dann wären Interfaces genau das, was du suchst. Du kannst damit den Klick per einem einzelnen Event, an den Empfänger senden und im Empfänger wird dann festgelegt, wie darauf reagiert wird.

  • Danke Tomarr das könnte für mein Vorhaben funktionieren, über Interfaces. Ich werde mich damit befassen.


    Tatsächlich bin ich auch schon weiter gekommen, was das DialogState wechseln angeht. Ich habe es so gemacht, dass ich im ButtonWidget eine Variable habe, welche beim erstellen und hinzufügen des Buttons in das Dialogfenster mit dem angestrebten Dialogstate gefüllt wird. Im Button Blueprint gehe ich einfach über das ClickEvent wieder ins DialogSystem und starte meinen Event "NextDialogPart" mit dem Input des State Integer, was mit dann aus dem DataTable das passende holt.



    Soweit funktioniert es. Aber natürlich machen sich neue Probleme auf:


    - Wie kann ich bestimmte Dialogfenster Identifizieren und prüfen ob es bereits geöffnet ist. Die Sache ist, derzeit starte ich den Dialog per OverlapEvent einer Sphere.

    Ich schließe ihn aber nicht automatisch wieder. Overlapt mein PlayerCharacter die Sphere mehrmals, öffnet sich das Dialogfenster in der VerticalBox die ich nutze mehrmals untereinander. Die Buttons sprechen beim Click immer den letzten gestarteten Dialog an. Ich brauche also etwas, um die Dialoge zu prüfen ob diese bereits geöffnet sind, welche Dialoge beim drücken von Buttons angesprochen werden sollen, auch wenn mehrere verschiedene geöffnet sind, was geplant ist...

    Möglicherweise bekomme ich das hin, indem ich meinen Dialogen ebenfalls eine Variable gebe welche dann in einem Array gespeichert wird, sobald sich ein Dialog auf macht. Daran kann ich dann vllt bestimme Dialogfenster ansprechen.



    Der Screenshot zeigt mein Problem, der gleiche Dialog ist zwei mal in der Vertical Box geöffnet worden als ich zwei mal durch die Sphere durch bin. Ich habe den Button "Andocken an Frachthafen" gedrückt und im unteren Dialog springt es zum DialogState 4...


  • Ja das ist möglich. Ich würde es auch eher als InstantMessager mit vordefinierten Antwortmöglichkeiten bezeichnen :).


    Mit einer isOpen Variable wird es leider nicht ganz realisierbar sein. Ich brauche schon einen eindeutigen Identifier für jede Nachricht die aufplopt. Ich gebe aber beim Start eines Dialogs auch den DialogStarter als Input mit in meine DialogSystem Funktion. Diesen kann ich als Identifier verwenden, da es nicht mehrere Dialogfenster von ein und dem selben DialogStarter geben soll.



    Woran ich jetzt aber hänge ist, wie bekomme ich die im Widget angelegte Variable "MessageIdentifier" aus dem Array der Childs meines MessagerWindow um zu prüfen ob es mit dem MessageStarter übereinstimmt?


  • Naja, je nach Aufbau musst du ja nur überprüfen, ob der Itemname und das, was du suchst, übereinstimmt. Mit Equal halt.

    Ich denke, mit einem Makro dürfte das ganz gut gehen, in dem du eine Schleife laufen lässt, wo dann die Identität gesucht wird und zwei Ausgängen, einmal, wenn es gefunden wurde und einmal wenn es nicht gefunden wurde.

  • So habe ich es jetzt auch gemacht. "For Each Loop with break", durchsucht einen Array den ich mit "all widgets of class" erstellt habe.

    Klingt jetzt hier in einem Satz geschrieben doch recht einfach, ist aber schon ein ganz schönes Gefrickel gewesen, bis das richtig funktioniert hat.

    Es kamen noch die OptionsButtons dazu und es musste auch der DataTable mit rein, der neue Daten liefern muss, sobald ein Button gedrückt wird.

    Wie es halt so ist, anfangs denkt man noch "och geht bestimmt einfach zu realisieren" und dann stellt man fest, hoppla, hier passiert was seltsames, da brauche ich noch das und das hier funktioniert gar nicht so wie gedacht ;)


    Den Loop in ein Makro zu verpacken ist eine gute Idee die ich mir noch ansehe. Muss das Ding jetzt sowieso erstmal aufräumen. Da kann ich solche Optimierungen umsetzen. Das mit dem Funktionen starten um andere Actor zu beeinflussen, b.z.w zB Verknüpfung mit einem QuestSystem fehlt auch noch.


    Danke aber erstmal für deine Denkanstöße