customevent mit ui eingabe auslösen

  • customevent mit ui eingabe auslösen

    Hi Leute,
    bin gerade darüber ein Kartenspiel, also etwas rundenbasiertes zu machen und hab wieder ein noobproblem.
    Das level hat ein ui mit button. Die einzelnen Runden sind customevents im levelblueprint, nun bekomme ich es nicht hin ein customevent über diesen interfacebutton auszulösen.
    Ich habe sogar schon mit einem eventdispatcher eine Verbindung zwischen dem event buttononclick und dem customevent herstellen können aber bei dem befehl cast to fehlt ein objekt.
    Kann mir jemand sagen ob das überhaupt so klappen kann, oder ob es schon von Grund auf falsch aufgebaut ist?
    Bilder
    • ue4.png

      175,08 kB, 1.366×768, 30 mal angesehen
  • Hi,

    bin zwar auch kein Profi, aber versuche mal folgendes: Erstelle im Level_BP eine neue Variable. Links-Klick auf das kleine Symbol davor und tippe in der Suchleiste deinen "uicontainer" ein und erstelle daraus eine Object-Reference und ziehe sie dann mit "Get-" in den Event Graph und verbinde es mit dem Target deines Bind-Dispatcher. Das "CastTo-Node" kannst du weglassen.
    Keine Ahnung ob es funktioniert, aber kannst es ja mal testen :)
  • Danke, funzt aber leider trotzdem nicht. Es gibt zwar keinen compilererror mehr, aber das Event wird trotzdem nicht ausgelöst. Garnicht mal so einfach die Kommunikation zwischen ui und levelblueprint. War so froh als schon einiges geklappt hat. Hab ne Klasse Kartenstapel die spawned wenn das Level gestartet wird (Ein Array mit allen verfügbaren Karten). Dann spawnen die Karten der Spieler die random aus dem Kartenstapel beschrieben werden. Die Karten und den Stapel konnte ich dem levelbp ja mit get all Actors from class vorstellen, aber mit nem widget läuft das so offensichtlich net. Anscheinend kann man das Event auch nicht direkt aus dem widget herraus starten.

    Daran muss ich mich erst noch gewöhnen, wie das läuft mit der Programmierarbeit, an manchen Tagen läufts gut, und an manchen Tagen kommt kann keinen Millimeter vorwärts.
  • Hallo zusammen

    Das ist mit dem Eventdispatcher möglich. Wo fügst du denn das Widget an den Viewport, dieses Objekt kannst du dann für den Eventdispatcher nehmen - ohne cast.
    Also wenn du das im Levelblueprint an den Vieport fügst kann du gleich damit den Eventdispatcher bauen, verstehst du?
    Du solltest aber auch prüfen ob das tatsächlich im Levelblueprint sein soll und nicht eher im Gamemode. Zusätzlich auch ob du das mit dem Eventdispatcher machen willst.

    Gruss
  • Hallo, Du musst ein Referenzobjekt in die Cast to Node reingeben, sonst weiß er nicht wo er hin casten muss. Bei deinem Widget wäre das zB ein "Get All Widgets of Class", allerdings musst du dann theoretisch nicht mehr casten.

    Aber: Für solche Aktionen gibt es Gamemode, Gamestate etc. hier kannst du ohne Probleme hincasten (ausser im Multiplayer) und Referenzen (zB Custom Events) aufrufen.

    Ich weiß gar nicht wozu der Level BP genutzt wird, wohl ursprünglich für Sequenzen, Matinees etc. dafür ist er geeignet, weil er direkt auf Objekte in der Welt zugreifen kann
    (was man aber generell anders auch mit allen anderen Klassen möglich ist).

    Würde dir aber empfehlen, alles was du im Widget machst, zum HUD zu schicken und vom HUD aus an die anderen Klassen weiter zu geben.
  • Ja viele Wege führen nach Rom aber man sollte nicht alles quick und dirty programmieren. Im Level BP sollten max. nur Sachen sein, die was mit dem Level zu tun haben und nicht woanders hinpassen.
    Für UI Sachen kannst du ganz bequem auch die GameInstance benutzen. Hier hast du den Vorteil, dass du von fast überall aus auf deine GameInstance casten kannst und dort programmierte CustomEvents aufrufen kannst.
    Ich habe es so verstanden:
    - du hast ein Button
    - der Klick auf den Button soll ein CustomEvent auslösen
    Richtig?

    Mein Lösungvorschlag:
    #Button erstellen in GameInstance :
    - create widget -> dein Button Widget auswählen -> Reference in eine Variable speichern
    #CustomEvent erstellen in GameInstance
    #OnClickedEvent des Buttons wird ausgelöst -> CustomEvent ausführen

    Und fertig bist du. Wieso? Deine grafische Oberfläche ist lokal beim Spieler und deine GameInstanz auch. Somit brauchst du für solche Sachen das LevelBP nicht. Möchtest du Netzwerk-Sachen mit dem Knopfdruck auslösen dann musst das das Ganze verlagern in den GameMode oder den PlayerController oder eine andere Klasse, die für sowas geeignet ist.
    Dafür hilft einem das Netzwerk Kompendium von Cedric Neukirchen. Einfach mal googeln falls du das brauchst.
  • Darkentik schrieb:

    Ja viele Wege führen nach Rom aber man sollte nicht alles quick und dirty programmieren. Im Level BP sollten max. nur Sachen sein, die was mit dem Level zu tun haben und nicht woanders hinpassen.
    Für UI Sachen kannst du ganz bequem auch die GameInstance benutzen. Hier hast du den Vorteil, dass du von fast überall aus auf deine GameInstance casten kannst und dort programmierte CustomEvents aufrufen kannst.
    Ich habe es so verstanden:
    - du hast ein Button
    - der Klick auf den Button soll ein CustomEvent auslösen
    Richtig?

    Mein Lösungvorschlag:
    #Button erstellen in GameInstance :
    - create widget -> dein Button Widget auswählen -> Reference in eine Variable speichern
    #CustomEvent erstellen in GameInstance
    #OnClickedEvent des Buttons wird ausgelöst -> CustomEvent ausführen

    Und fertig bist du. Wieso? Deine grafische Oberfläche ist lokal beim Spieler und deine GameInstanz auch. Somit brauchst du für solche Sachen das LevelBP nicht. Möchtest du Netzwerk-Sachen mit dem Knopfdruck auslösen dann musst das das Ganze verlagern in den GameMode oder den PlayerController oder eine andere Klasse, die für sowas geeignet ist.
    Dafür hilft einem das Netzwerk Kompendium von Cedric Neukirchen. Einfach mal googeln falls du das brauchst.
    Hab das so gemacht, leider scheiterts am letzten Schritt. Ich bekomme von meinem onClickedEvent des Buttons keinen Zugriff auf mein customevent runde 2(bin in der ui containerclass). Nur über Cast to gameinstance und hier möchte er wieder ein Objekt, die neue Variable wird nicht akzeptiert. Und ich hab noch ein Problem: Ich habe ja einen Kartenstapel also einen Array nachdem ein Shuffle geschalten ist, bevor er die Spieler bedient, deshalb muss ich alle Runden zusammen in die gameinstance verschieben, sonst haut der Zufallsgenerator nicht mehr hin. Aber seitdem alles in der gameinstance ist wird auch die erste Runde nicht mehr ausgelöst, es gibt kein Event begin Play oder so.

    Es ist mein erstes Projekt, deshalb kann es durchaus sein, dass hier der ein oder andere Denkfehler drin ist

    Nur zum Verständnis, ich möchte eine Art Pokerspiel machen, dachte erst das wäre nicht so schwer.

    Ein Spieler gegen 3 KI´s
    Die 1. Runde: Der Spieler und die KI´s bekommen Ihre Karten + 3 Karten die allen gehören auf dem Tisch
    Die 2. Runde: Eine zusätzliche Karte wird aufgedeckt
    Die 3. Runde: Eine zusätzliche Karte wird aufgedeckt

    Es soll eine Mechanik geben die jederzeit das austeigen oder setzten von Geld ermöglicht.

    Ich habe es mir so vorgestellt, das man im Hauptmenü einen der Spieltische der KI´s aussuchen kann, das wäre quasi die Levelauswahl?

    Das Verhalten und das Geld der Gegner werden in eigenen Charakterklassen gespeichert.

    Ist ein Spiel beendet kommt ein kurzer Clip und alles wird zurückgesetzt. Also quasi eine neue gameinstance?
  • Hallo zusammen

    Also wir bereits gesagt wurde, kannst du mit "Get Game Instance", also der Blueprint node die Gameinstance als Objekt referenzieren und dann dementsprechend zugreifen.
    Die GameInstance wurde eingeführt und ist eigentlich dazu da, um Daten zwischen Maps zu transportieren. Das war früher umständlicher. Für die Regeln im Spiel, also die grundlegenden Sachen, kannst du den Gamemode nutzen.

    Gruss
  • Hi Leute,
    habs nun geschafft, das über den button im ui das customevent ausgelöst wird, das zeigt ein printstring an veschiedenen Stellen. Leider werden nun keine Objekte mehr gespawned obwohl der ganze code durchlaufen wird. Nicht mal ein sound direkt nach dem customevent. Als ich das im levelblueprint machte lief es noch.

    Es würde mir sehr helfen wenn ich wüsste wie so ein Kartenspiel grundsätzlich aufgebaut wird. Sonst versuche ich immer irgendwo was auf die Reihe zu bekommen, und am Schluß klappts vielleicht aber hat da nix verloren, und es entstehen unnötige Fragen. Versuch mich da so gut es geht reinzufuchsen aber eine Info ob ich den grundsätzlichen Aufbau nun richtig verstanden habe wäre sehr hilfreich.

    Organigramm für Kartenspiel
    Level 1 = Hauptmenu mit Levelauswahl, Ladefunktion und quitgame-funktion

    Level 2-5 sind die verschieden Spieltische die mit open level vom Hauptmenü angesteuert werden

    Wurde ein Level ausgesucht, wird das dazugehörige standard HUD mit Speicherfunktion angezeigt und eine gameinstance mit construct eröffnet (wie im screenshot)

    In der gameinstance findet die meiste Arbeit statt: Es spawnen alle actors, also der eigene und die Gegnercharaktere, sowie der Kartenstapel und die einzelnen Karten aus diesem. Auch die verschiedenen Runden werden hier mit einem Klick auf einen ui Button ausgelöst

    Jeder Gegner ist an jedem Spieltisch verfügbar und deshalb eine eigene Klasse, Verhalten (aggressiv/passiv), und Geldeinsatz werden über Variablen in der Charakterklasse gesteuert.

    Die Mechanik zum steuern des Einsatzes ist ein slider im standard HUD der über eine Variable den verfügbaren Einsatz in der Charakterklasse feststellt.

    Danke für eure Geduld, bin noch ein junger Padawan...
    Bilder
    • buttononclick.png

      223,93 kB, 1.366×768, 9 mal angesehen
    • gameinstance.png

      211,79 kB, 1.366×768, 8 mal angesehen
  • Christian Lopez schrieb:

    In der gameinstance findet die meiste Arbeit statt: Es spawnen alle actors, also der eigene und die Gegnercharaktere, sowie der Kartenstapel und die einzelnen Karten aus diesem. Auch die verschiedenen Runden werden hier mit einem Klick auf einen ui Button ausgelöst
    Vorsicht! Machst du ein Singleplayer Spiel doer soll das Multiplayer werden?
    Wenn MP, dann musst du das Spawnen aller spieler im GameMode machen, weil dieser auf dem Server läuft und alles an alle Spieler verteilt.
  • Hallo zusammen
    Ich will dich eigentlich nicht nochmal damit langweilen, aber diese Regeln gehören meines Erachtens in den GameMode und nicht in die Gameinstance.
    Ehrlich gesagt weis ich auch nicht ganz was du da vor hast. Aber ich behaupte, dass der Grund das dein Klick event nicht funktioniert, ist das es schon nicht mehr im Speicher ist, also dass das Objekt das du bei "Round1" übergibst nullptr, also sozusagen leer ist.
    Um das zu reparieren musst du es in einer Variablen speichern. Also einfach Rechtsklick auf den return Wert vom Construct und to Variable klicken. Diese kannst du nun verwenden für das "Round1" Übergabe Event.

    Wie @Darkentik schon erwähnt hat, gibt es viele, viele verschiedene Wege um dein Spiel umzusetzen, also vom Aufbau her.
    Hier mal mein Vorschlag.
    1. Erstelle ein Hauptmenu Widget mit Buttons zu den verschiedenen Tischen.
    2. Adde dieses Widget im Levelblueprint von deiner Hauptmenu map.
    3. Erstelle für jeden Tische eine Map.
    4. Verknüpfe diese Maps mit dem Hauptmenu, also per Button sollte jeder Tisch / Map geöffnet werden.
    5. Erstelle einen GameMode in dem die Turnorder geregelt wird, also wer wann dran ist.
    6. Erstelle einen PlayerController in dem du die möglichen Aktionen vom Spieler definierst.

    Wie gesagt kann man über die Architektur immer streiten - oftmals auch zurecht :D
Unreal®, Unreal Engine, the circle-U logo and the Powered by Unreal Engine logo are trademarks or registered trademarks of Epic Games, Inc. in the United States and elsewhere.