Widget: ScrollList (mit Buttons in eigenem BP) OnClick

  • Hey,
    ich habe eine ScrollList erstellt und darin Buttons (mit eigenem Widget BP) erstellen lassen (soll ein Inventar werden). Nun will ich, dass, wenn die Button angeklickt werden oder wenn man mit der Maus drüber geht, ein Event in dem eigentlichem Widget BP ausgeführt wird (mit der ScrollList drin). Außerdem soll dann eine Variable von dem Button BP an den Widget BP (mit der ScrollList drin) übergeben werden. Wie geht das am besten?
    Mir fallen nur Lösungen ein, die sehr umständlich wären.

  • Button und scrolllbox (ich glaube das meinst du mit scroll list) sind in einem (widget) BP also no problem. Du beschreibst es nicht sehr konkret also kann ich nur raten was du genau machen willst. Wenn du einen Button auf den Canvas deines widget gemalt hast dann kannst du in den Properties ganz nach unten scrollen und du siehst schon die beliebtesten actions - also wohl "OnClicked" was passiert wenn du den button klickst. Hier kannst du mit der scrolllbox interagieren. Wichtig daß du deine scrollbox oben rechts den Haken setzt "isVariable" dann hast du die immer im Zugriff. Dann kannnst du die auch reinziehen in den OnClicked BP und mit GET auslesen oder mit SET ändern.

  • @kyodai
    Oh fail. Heißt Scrollbox und nicht Scrolllist ^^
    Ich bin mir nicht sicher, ob du mich richtig verstanden hast. Hier nochmal ne deutlichere Erklärung:
    Ich rufe ein Inventar Widget BP von meinem Charakter BP auf. In dem Inventar Widget ist eine Scroll Box. In dem Inventar Widget wird für jedes Item einmal ein Button Widget BP aufgerufen und als Child der ScrollBox gesetzt. Nun will ich: Wenn ein Button aus der ScrollBox angeklickt wird, soll eine Funktion im Inventar Widget BP aufgerufen werden.


    Ich hab jetzt eine neue Idee, wie ich das machen kann, jedoch bekomm ich das so nicht ganz umgesetzt.
    Es wird beim Erstellen von dem Inventar Widget BP das Object als Variable an das Inventar Widget BP weitergegeben. Das wird wiederum beim Erstellen von jedem Button an den Button weitergegeben. Nun soll, wenn der Button geklickt wird, dieser mit einem Cast und der Object Variable eine Funktion im Inventar Widget BP ausführen. Leider wird die Funktion nicht ausgeführt. Warum nicht?
    Auf den Fotos ist das, was ich bisher hab

  • Hi, wow das ist echt kompliziert. Ich blicke immer noch nicht ganz durch muß ich zugeben.


    Ich glaube du machst es dir teilweise echt selber schwer und sehr kompliziert.



    Also erst mal was ich aus deinen Screenshots sehe, ich gehe mal der reihe nach durch und sage einfach was mir einfällt. Bitte nicht böse nehmen als Kritik oder so, ich bin weder unfehlbar noch so furchtbar klug, also gerne auf mich draufhauen wenn ich was dummes sage, ich kann das ab und bekomm gerne mal eine auf den Deckel.


    1. Button Widget - benenn mal deinen Button_165 um damit du später mal selber weisst was das ist, Button_165 sagt nix, also wenn es der "Item info Anzeigen" Button ist nenn den doch BtnShowItemInfo oder so, später debuggst du mal und wenn du das liest weisst du sofort was es ist auch wenn du tausend buttons hast. tip aus der Praxis. In deinem Inventory hast dualso eine Funktion "Button clicked" die irgendwas macht - ich weiss hier einfach nicht was, aber du übergibst ne object reference. Funktioniert die schon mal? Kannste ja mit print ausgeben und schauen ob das passt. Den namen der Funktion "Button clicked" im Inventory BP finde ich auch so lala, also wenn der button macht daß du das Item benutzt oder equippst dann benenn die doch von "ButtonClicked" in "UseInvetoryItemByNumber" oder so, dann weisst du später mal im debugging eher wo du gerade bist - "Button clicked" ist ja sehr generisch. Bin mir auch nicht sicher ob du das Button widget überhaupt brauchst, so aus dem Bauch heraus denke ich ist das evtl unnötig, mehr dazu bei den anderen 3 BP Kommentaren.


    2. Inventar widget erstellen. Kompliziert. Das "ShowMouseCursor" ist noch normal aber warum kein "SetInputModeUIOnly" (Menü und Maus an) bzw. SetInPutModeGameOnly (Menü und Maus aus). Dann sparste dir das ignore move und ignore look. Muß man nicht klar hätte ich hier aber voll erwartet. naja. Eben wieder Tip vom alten Hasen. Aber vielleicht hast du das ach in dem Key (tab?) action drin. Kann man einen separaten BP machen finde ich eigentlich sauber, also kudos dafür, aber dann würde ich alles reinpacken. Wenn du direkt auf den Tab Key gehst brauchst du aber auch den FlipFlop also eigentlich wirklich gut gelöst. Was ich gar nicht machen würde ist der "get all widgets of class". Grundsätzlich immer vermeiden weil langsam. Hier gehts noch weil du ja nur ein widget hast, abr dann ist der loop auch voll sinnlos - mach lieber ne reference auf das gespawnte widget (return value ziehen und variable draus machen!) dann referenzierst du das zum schliessen. Deine inventory object reference kapiere ich hier gar nicht, der BP ist aber auch sehr unübersichtlich (Design guide 6 minus, setzen. Scherz aber habe ich früher auch gemacht. Aber es ist halt gerade für dritte super unübersichtlich, man erkennt die Verbindungen nicht mehr!). Wenn ich richtig verstehe ist inventory object reference eine referenz zum widget selbst (schlecht zu sehen). Siehe was ich eben gesagt habe, dann kannste die auch statt des loops verwenden. Ich bin mir aber nicht 100% sicher ob ich das hier alles blicke.


    3. button BP erstellen. Also du hast schon das Inventory widget - jetzt kommt noch das Inventory item widget. Puh. Ich finde es kompliziert. Klar man kann so viele widgets haben wie man will aber hier muss ich erst mal durchblicken. Also du erstellt dieses item widget und willst das dann als child an das "Panel widget" (Was ist das?) anfügen. Klappt das?? Mit den beiden Set überträgst du eine Variable von einem BP ins andere. kannmanmachen, aber sieht kompliziert aus. Hier nochnicht so schlimm aber wenn du mal heftig debuggst ist es einfach eine Variable nur an einer Stelle zu haben und dann zu casten (Kannst ne return oder set funktion für externen Gebrauch machen). ist aber so ne philosopie Frage also nicht schlimm.


    4. On Klick in dem Inventar widget. Eigentlich ein no-brainer, aber wenn du das so postest nehme ich an es funktioniert nicht?





    Jetzt nochmal generell gesagt - es ist super kompliziert. Kann man wohl auchnicht ganz verstehen wenn man nicht davorsitzt, die widgets sieht und das selber debuggt. Ich sage mal ganz vosrsichtig als Fragen formuliert:



    - Brauchst du wirklich so viele Widgets? Je weniger widgets desto einfacher.
    - Klappt das mit den childs ohne die auf den viewport zu adden? habe ich noch nie probiert muß ich zugeben.
    - Hast du mal versucht statt child einfach ein widget zu killen und ein anders zu spawnen? Finde ich generell sauberer und übersichtlicher. Wozu überhaupt childs? hat das nen Vorteil?
    - Hast du mal überlegt manche Variablen "global" (z.B. im game mode oder so?) zu speichern? Das machst du doch mit deinem Inventar sicherlich auch. Warum also nicht mit diversen Variablen die du in widgets nutzt? Dann hast du die auch nur an einer Stelle und das macht es übersichtlicher beim debuggen.


    Letztlich - jetzt kannst du mich beissen, treten, schlagen und schimpfen. ja ich hab jetzt bestimmt auch Quatsch erzählt und die Hälfte überlesen oder nicht kapiert. :) Und nein der Quatsch den ich schreibe kommt ohne Garantie. XD

  • In ein paar Punkten hast du schon recht ^^
    Manche Variablen sollte ich wohl lieber Global setzen, da ich (und Spieler) damit auf die Dauer sehr viel RAM sparen und es übersichtlicher wird
    Das mit dem als Child adden ist, da ich mehrere Buttons (für jedes Item einen) zu der Scroll Box hinzufügen will. Da das unterschiedlich viele Items sind und ich nur diesen Weg gefunden hab, um das variabel zu machen, hab ich das so gelöst. Falls es da ne bessere Möglichkeit gibt, kannst du mich gern drauf hinweisen
    Das mit dem Button und dem eindeutigen Namen ist ein guter Tipp. Danke
    Das mit dem "SetInputModeUiOnly" hab ich vergessen, dass das die bessere Methode ist. Danke für den Hinweis
    Das mit dem "GetAllWidgetsOfClass": Da hast du eigentlich recht


    Hier mal in Worte gefasst, was das von den Bildern machen sollte:


    Leider wird die Funktion im Inventar Widget BP nicht ausgeführt. Ich hab jetzt zumindest das Problem etwas genauer feststellen können. Aus irgend einem Grund wird das OnClicked von dem Button (im Inventory Item Widget) nicht ausgeführt. Hat jmd ne Idee woran das liegt


    Ich hoffe, dass das nun etwas deutlicher ist. Ich weiß, dass ich sowas nicht allzu gut erklären kann ^^


    PS:
    Sorry, dass ich das so unsortiert beantwortet hab ^^


    EDIT:
    Ich hab jetzt erst das mit SetInputModeUiOnly gemacht. Leider weiß ich gerade nicht mehr, wie man das machen konnte, dass ich das Inventar Menü wieder schließen kann (denn die Inputs (und somit auch der Inventar Input) sind ja deaktiviert)

  • Wenn ein Button in einer Scrollbox ist, dann ist eventuell das Anklicken nicht möglich. Das habe ich bei meinem alten Projekt Jewel Snake gemerkt.


    Dafür gibt es aber eine Lösung. Unter Interaction im Details Panel des Buttons kannst du die Click Methode (und Touch) von "Up and Down" auf "Precise" stellen, eventuell funktioniert es dann ;)

  • Das Inventar würde ich global mit Tab oder so steuern. Wenn du Keine action in "Project settings"-->"Input"-->"Bindings"-->"Action mappings" definieren magst kannst du das ja auch global handeln, also im Game mode.


    Mit Scrollbox habe ich ehrlich gesagt noch nie gearbeitet. Habe mir das mal angesehen aber ist nicht so ganz mein Lieblings Object für Inventar, aber klar man kann damit arbeiten denke ich.



    habe ein Tutorial gefunden - vielleicht hilft das. Ich würde das mal in nem leeren Project machen damit du bei dir nicht alles versaust.


    https://wiki.unrealengine.com/…uttons_From_Dynamic_Array

  • Es haben nun viele Änderungen zum Ziel geführt:

    • Wie Tankbuster gesagt hat: auf "Precise" stellen
    • Die Variable wurde zu spät an Inventory Widget BP übergeben (zu der Zeit wurde das Widget bereits erstellt und somit war das zu spät)
    • Das CastToInventoryWidgetBP war unnötig (das hat das Inventory Object Reference schon beinhaltet)

    Nun funktioniert es. Danke für die Hilfe