InputMode und andere Widgetgeschichten

  • Heyho,


    Ich habe mich jetzt mal damit befasst, meine Menüs und andere Widgets sinnvoller zu implementieren als das alles zum testen einfach ins LevelBlueprint zu schieben.
    Ich möchte zwar weiterhin UMG nutzen, aber die Implementationsdetails in meine PlayerController- bzw. HUD-Klasse (also cpp) verschieben. Doch ich renne hier in ein paar Probleme, zu denen die Dokumentation leider extrem schlecht ist.


    Aber nun mal zur Sache. Ich will das FInputMode-Struct des PlayerControllers nutzen, um den Input zu ändern. Wenn ich ins PauseMenü komme will man ja schließlich mit der selben Taste wieder das Menü schließen, und evtl. mit Pfeiltasten durch die Auswahlmöglichkeiten scrollen. Unabhängig von der Implementierung solcher Sachen, weiß ich aber nicht, wo ich die KeyEvents abfangen soll. Nachdem ich den InputMode auf FInputModeUIOnly ändere, werden automatisch wie gewünscht alle Inputs für den Charakter nicht mehr aufgenommen, aber leider auch alle anderen Inputs die ich versucht habe zu implementieren. Weder vom HUD Blueprint noch von sonst wo kriege ich mehr Zugriff auf KeyEvents (bzw. sie werden nicht mehr aufgerufen). Ich komme mit Esc noch nichtmal mehr aus dem Spiel im Viewport. Allerdings besagt der Kommentar in der PlayerController.h zu dem Struct ausdrücklich, dass UI-Inputs erlaubt und möglich sind, nur eben keine Game-Inputs mehr.
    Hier nochmal ein kleiner Codeschnipsel aus meiner PlayerControllerklasse:



    Die Playerstatesache könnt ihr ignorieren, hat mit der Problemstellung nichts zu tun.


    Der zweite Punkt wäre, ich bin mir nicht sicher wie ich das Widget aufbringen soll. Mein Plan wäre es, die Widgets als TSubclassOf<UUserWidget> in meine HUD-Klasse zu implementieren, wo ich dann im BP_HUD die gewünschten Widgets auswählen kann. Dann die HUD in den PlayerController bringen, das passende Widget zum jeweiligen Menü holen, den Fokus vom InputMode draufsetzen und .AddToViewport darauf bzw. eine Funktion in der HUD-Klasse aufrufen. Die Funktionalität des schließens des Menü ist ja mit dem ersten Problem verknüpft, andernfalls kann ich ja einfach mit einem Button das Menü wieder verlassen. Wie auch immer scheint mir das recht umständlich, vor allem weil ich das Widget in den PlayerController holen muss, um den Fokus darauf über den InputMode zu setzen. Vielleicht hat da jemand eine klügere Lösung parat, ich mach das schließlich zum ersten Mal. :P


    Soweit erstmal, ich glaube zwar nicht, dass viele hier schon damit gearbeitet haben, aber leider ist die Dokumentation für solche Detailfragen sehr schlecht und UMG-Tutorials kommen nunmal leider selten darüber hinaus, ein Widget übers LevelBlueprint zu erstellen und Buttons mit Minifunktionen zu versehen.

  • Ok ich habe inzwischen herausfinden können, wie ich die KeyEvents abfangen kann. Falls jemand mal in solch ein Problem rennen sollte kommt hier eine kleine Erklärung.
    Die KeyEvents werden vom Widget abgefangen, allerdings muss man dafür 1. Den InputMode auf "InputModeOnlyUI" oder "InputModeGameAndUI" stellen. 2. Muss der Fokus auf dem Widget liegen, welches die Steuerung übernehmen soll. 3. Muss im Widget eine Funktion überschrieben werden "OnKeyUp" bzw. "OnKeyDown". Dort kann man dann die gewünschten Keys abfangen und mit Funktionen versehen. Dabei ist man übrigens nicht an die festgelegten Inputs in den Project Settings gebunden. Ist leider alles ein bisschen umständlich für UMG. Wie auch immer, das Problem ist gelöst.