Feststellen, welcher Button in Buttonarray geklickt wurde.

  • Hi zusammen.


    Derzeit bin ich gerade dabei, einen Teil meines Widgets zu bauen, der aus relativ vielen Buttons besteht. Also eigentlich ist es ein Colorpicker, bestehend aus 2x8 Buttons, einmal 8 Buttons für die Favoriten Farbe und einmal 8 Buttons für eine alternative Farbe. Da ich es recht einfach gestrickt halte, sprich der Button hat eine Farbe und beim Anklicken wird die Farbe dann halt eine Variable zur weiteren Verarbeitung gepackt. Gleichzeitig soll im alternativen Feld dieselbe Farbe natürlich nicht wählbar sein usw.


    Deswegen hielt ich es auch für eine relativ gute Idee, die Buttons in ein Array zu packen. Was ja grundsätzlich kein Problem darstellt.


    Nun muss ich jedem Button natürlich ein OnClicked_Event zuteilen. Das habe ich ansatzweise, es gab da schon mehrere Versuche, so versucht.

    Nun stehe ich aber bei all meinen Versuchen vor dem Problem, dass ich ja noch immer rausfinden muss, welche Button nun genau angeklickt wurde. Sprich den Index vom Array usw. brauche ich ja um eben halt weitere Verarbeitungen durchzuführen.


    In meinem Kopf klang es ganz einfach. Inzwischen wäre es wohl einfach gewesen, jedem Button ein eigenes Event zu verpassen und eine Funktion dahinter zu hängen.


    Kann es sein, dass ich mich mit der Idee eines Button_Arrays einfach nur verrant habe und das so gar nicht geht wie ich mir das Ganze vorstelle? Oder übersehe ich einfach nur etwas und denke viel zu kompliziert?

  • Du musst deinen Buttons noch einen "manuellen" Index geben. Du erstellst dir eine Variable: "Button Navigation Index" oder ähnlich.
    Diese Variable wird immer gesetzt wenn du auf den Button klickst oder schon beim "On Hovered".




    Beim Event Construct kannst du noch den Index Reseten falls nötig. Mache ich zB. beim Menu, damit der aktive Button immer der erste ist.



    Und dann kannst du ganz einfach deinen Array Index mit deinem Button Index abfragen;



    Die Reihenfolge von deinem Make Array ist dann logischer weise auch die Reihenfolge welchen Button Index du deinen Buttons gibst.
    Dann funktioniert es, und du kannst mit dem Loop deinen Button raus filtern.

  • Achso.
    Ich habe bei mir dieses System für die Gamepad Steuerung. Da brauche ich das. (hat Gründe).

    Wenn du aber eh die Buttons anklickst, dann ist die Idee mit dem Loop nicht gut denke ich.
    Du drückst auf einen Button, der dann erstmal einen Loop auslöst um den Button herauszufiltern den du gedrückt hast??
    Irgendwie unlogisch oder?

  • Wenn du aber eh die Buttons anklickst, dann ist die Idee mit dem Loop nicht gut denke ich.
    Du drückst auf einen Button, der dann erstmal einen Loop auslöst um den Button herauszufiltern den du gedrückt hast??
    Irgendwie unlogisch oder?

    Der Loop, den ich oben gepostet habe, wird schon im PreConstruct ausgeführt. Mein Gedanke war, dass mit dem Loop jedem Button aus dem Array ein Clickevent zugewiesen wird, den ich dann abfragen kann. Bzw. sie führen ja immer dasselbe aus, der Button hat halt eine Farbe, und bei einem Click wird dieser Farbwert halt in einer Linear Color-Variable zwischengespeichert.


    Deswegen hatte ich halt so den Hintergedanken, dass ich die Buttons in ein Array packe und dann anhand des Index den jeweiligen Farbwert auslese. Nur, wie gesagt, die Information, welcher Button des Arrays nun halt geklickt wird, geht bei meiner Methode irgendwie verloren. Deswegen halt die Frage dahinter, ob ich mich mit meiner Idee ein wenig verrannt habe.


    Theoretisch könnte ich ja auch eine Funktion schreiben, die ich hinter jedes ClickEvent hänge. Würde ja auch Code sparen. Nur ich wollte halt mal einen anderen Weg gehen.

  • im PreConstruct ausgeführt

    Musst du aufpassen. Das Event dient nur für designzwecke. Also wenn du schon vorher sehen möchtest wie dein Widget aussieht, wenn du da erst was generieren musst.
    Wenn du da ernsthafte Logiken setzt, dann kann es zum Crash im fertigen Spiel kommen. Steht bei dem Event glaube ich auch als Warnung, ansonsten steht es auch in den Docs.
    https://docs.unrealengine.com/…UUserWidget/PreConstruct/



    Ansonsten bin ich dann raus. Also ich habe keine weitere Lösung. Ich hätte es wie du schon erwähnt hast, mit einer Funktion gemacht.

  • Uhm, Ich weiß garnicht, wo das Problem ist. Einfach mehrere Buttons mit Index spawnen, und diese Buttons rufen zum Beispiel im "Main-Widget" (das widget, wo sie z.B. drinstecken) ein Event auf wenn sie geklickt werden. Anhand der ID lassen sie sich unterscheiden. Das ist alles.
    Du musst blos beim spawnen der Buttons eine Referenz zum "Main-Widget" mitgeben. Garnicht nötig, irgendwelche Events zu binden :)

  • Edit: Ich bin doof und habe nicht bis nach unten gescrollt. Sorry




    Leider musst du folgendes machen:

    1. Du machst ein UMG Widget welches nur einen Button enthält (+ Styling, Text, etc.)

    Hat auch den Vorteil, dass du den Style für jeden Button innerhalb eines Widgets managen kannst.

    Natürlich solltest du alles parametrierbar machen, was parametrierbar sein soll.


    2. Du erstellst einen EventDispatcher innerhalb des Widgets mit entsprechender Call-Signature


    Jetzt kannst du deinen Button innerhalb deines anderen UMG Widgets nutzen und hast das neue Event verfügbar

  • Ja, wie schon geschrieben. Ich habe bei der Eingabe von Assign, nicht wirklich darauf geachtet was vorgeschlagen wurde, ich hatte auch Kontextbezogene Vorschläge aus, hatte als recht viel da stehen. Mein Eventdispatcher hieß zwar mit ED_Button, er schlug mir den aber gar nicht vor, zumindest hatte ich das wohl übersehen. Kann natürlich auch sein, dass ich vergessen hatte auf Compile zu klicken. Passiert mir auch oft genug. Uf jeden Fall hatte ich als erstes wohl Button oder so gesehen, was ja auch hinkam, weil den wollte ich ja haben. Naja, und halbherzig hingeschaut sagt man dann halt "Jaja, ist ein Button, hat schon seine Richtigkeit". Und in der Node erschien denn ja auch OnClick, was ich ja eigentlich auch haben wollte.


    Hatte es aber leider nicht. Es musste halt ED_Button sein, logischerweise.