Touch Interface Object.

  • Touch Interface Object.

    Hey, für mein Spiel Jewel Snake, würde ich gerne das virtuelle JoyStick des Touch-Interfaces bearbeiten. Es geht darum, dass sich der Mittelpunkt des Virtuellen Joysticks zur Ausrichtung des Joysticks bewegt. Das Problem:

    Ich kann diese virtuellen Joysticks erstellen, allerdings kann ich nicht zu ihnen casten, um beispielsweise die Center-Position zu verändern. Das wäre eigentlich schon alles, was ich möchte, aber aus irgendeinem Grund funktioniert das leider nicht. Ich kann anscheinend auch kein Joystick @Runtime erstellen, Also habe ich gedacht, dass es irgendwie möglich ist, es mit C++ zu ändern. könntet ihr mir da helfen?
    Ich bin was C++ angeht leider totaler noob, und Unreal ist ziemlich komplex. Ich brauche nur einen ungefähren wegweiser, wie ich vielleicht eine Art Event erstellen kann, mit der ich die Center-Position des virtuellen Joysticks beliebig verändern kann. Die Variablen dafür gibts ja schon irgendwo, ich muss nur drankommen. Danke :)
    Mein UE-Marktplatz-Projekt: Surveillance Camera Madness
    Das beste Snake Spiel für Android: Jewel Snake
    jetzt auch für Windows: Jewel Snake
  • unter "\Epic Games\UE_4.18\Engine\Source\Runtime\Engine\Private\GameFramework\Touchinterface.cpp"
    habe ich glaube ich die richtige Datei gefunden. Darin gibt es die Methode "Activate". Ich weiß, dass es die Node "Activate Touch Interface gibt".

    Heißt das, wenn ich hier meine eigene Methode einfüge, die x und y verändert (also SlateControl->Center), wird diese auch in der Engine als Node verfügbar sein? ô.O Oder muss ich dafür noch andere Sachen machen? Oder muss ich dafür die Engine neu builden?

    Und wie genau kann ich diesem SlateControl->Center einen Wert aus x und y zuweisen? SlateControl->Center = {x,y} oder brauch ich sowas wie SlateControl->Center = SlateControl::MakeCenter(x,y)


    Sorry, sind grade vielen Fragen auf einmal :love:

    C-Quellcode

    1. void UTouchInterface::Activate(TSharedPtr<SVirtualJoystick> VirtualJoystick)
    2. {
    3. if (VirtualJoystick.IsValid())
    4. {
    5. VirtualJoystick->SetGlobalParameters(ActiveOpacity, InactiveOpacity, TimeUntilDeactive, TimeUntilReset, ActivationDelay, bPreventRecenter, StartupDelay);
    6. // convert from the UStructs to the slate structs
    7. TArray<SVirtualJoystick::FControlInfo> SlateControls;
    8. for (int32 ControlIndex = 0; ControlIndex < Controls.Num(); ControlIndex++)
    9. {
    10. FTouchInputControl Control = Controls[ControlIndex];
    11. SVirtualJoystick::FControlInfo* SlateControl = new(SlateControls)SVirtualJoystick::FControlInfo;
    12. SlateControl->Image1 = (Control.Image1 ? FCoreStyle::GetDynamicImageBrush("Engine.Joystick.Image1", Control.Image1, Control.Image1->GetFName()) : nullptr);
    13. SlateControl->Image2 = (Control.Image2 ? FCoreStyle::GetDynamicImageBrush("Engine.Joystick.Image2", Control.Image2, Control.Image2->GetFName()) : nullptr);
    14. SlateControl->Center = Control.Center;
    15. SlateControl->VisualSize = Control.VisualSize;
    16. SlateControl->ThumbSize = Control.ThumbSize;
    17. if (Control.InputScale.SizeSquared() > FMath::Square(DELTA))
    18. {
    19. SlateControl->InputScale = Control.InputScale;
    20. }
    21. SlateControl->InteractionSize = Control.InteractionSize;
    22. SlateControl->MainInputKey = Control.MainInputKey;
    23. SlateControl->AltInputKey = Control.AltInputKey;
    24. }
    25. // set them as active!
    26. VirtualJoystick->SetControls(SlateControls);
    27. }
    28. }
    Alles anzeigen
    Mein UE-Marktplatz-Projekt: Surveillance Camera Madness
    Das beste Snake Spiel für Android: Jewel Snake
    jetzt auch für Windows: Jewel Snake
  • Du könntest an der Engine rumspielen wenn du die Git Version nutzt. Nur die lässt sich compilieren. Auf meinem Ryzen werden alle 16 Threads ausgelastet und es dauert über 20 Minuten. Ist zum entwickeln also untauglich.

    Normalerweise geht man in den Editor. Macht Add c++ Class. Oben rechts "Show all ..." und wählt das Element bzw. die Klasse aus die man verändern will. Dort überläd man dann ggf. die Funktionen ect.. Ich hab leider keine Ahnung von Mobile Entwicklung in UE4. Hab gerade in den UMG Editor geguckt. Da ist nichts mit "touch". Wo wird das Ding erstellt?

    PS: Da ich gerad gesehen habe das du auch was im Marktplace hast. Die Wörter aus der Kurzbeschreibung werden für die Suche genutzt. Da solltest du das Wort "Camera" schon einbauen denke ich.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Socke ()

  • Danke, dann werde ich es so versuchen, wie du gesagt hat. Unter Project Settings -> Input kann man dieses Default Touch Joystick einstellen. Man kann auch eigene Touch Interface Objekte erstellen, aber es ist anscheinend eine besondere Klasse von Objekt. Man kann es zwar festlegen, aber hat mit Blueprints keine Möglichkeit, irgendeine Referenz zu bekommen, geschweige denn @Runtime so ein Objekt zu erstellen.

    Socke schrieb:

    PS: Da ich gerad gesehen habe das du auch was im Marktplace hast. Die Wörter aus der Kurzbeschreibung werden für die Suche genutzt. Da solltest du das Wort "Camera" schon einbauen denke ich.
    Merci.
    Mein UE-Marktplatz-Projekt: Surveillance Camera Madness
    Das beste Snake Spiel für Android: Jewel Snake
    jetzt auch für Windows: Jewel Snake
  • Okay, ich habe grad nach einigen Stunden endlich hinbekommen eine eigene C++ Klasse zu erstellen, und das Projekt komplett in VS2017 zu öffnen und zu rebuilden.

    Außerdem habe ich eine eigene Funktion, die ich über Blueprint aufrufen kann.
    Ich habe dazu eine child class von UTouchInterface erstellt, aber ich kann diese nicht als TouchInterface verwenden, denn es ist eine Blueprint Class und keine "Touch interface Object Class". Außerdem habe ich auch keine Möglichkeit, diese Klasse irgendwie im BP zu erzeugen, oder eine Referenz zu bekommen. Das heißt, so einfach wird mein Problem wohl nicht gelöst sein.

    Außerdem habe ich noch keine Ahnung, wie ich das Joystick neu positioniere.
    Ich habe VirtualJoystick->SetControls(SlateControls); gefunden, dafür müsste ich aber die SlateControls irgendwie neu erstellen, und dafür müsste ich die alten SlateControls auslesen, da ich ja nur einen Wert SlateControl.Center verändern möchte.

    Kurz gesagt: Ich habe keine Ahnung, wie ich weitermachen soll und brauche hilfe, ansonsten bin ich vielleicht in 2 Jahren fertig.

    Ich hab schon überlegt, ob ich mir nicht mit "normalen" actors irgendein joystick selber baue, weil das ist echt frustrieren. :(






    Bilder
    • first node.png

      12,68 kB, 255×149, 20 mal angesehen
    Mein UE-Marktplatz-Projekt: Surveillance Camera Madness
    Das beste Snake Spiel für Android: Jewel Snake
    jetzt auch für Windows: Jewel Snake
  • Tankbuster schrieb:

    Außerdem habe ich eine eigene Funktion, die ich über Blueprint aufrufen kann.

    Ich habe dazu eine child class von UTouchInterface erstellt, aber ich kann diese nicht als TouchInterface verwenden, denn es ist eine Blueprint Class und keine "Touch interface Object Class". Außerdem habe ich auch keine Möglichkeit, diese Klasse irgendwie im BP zu erzeugen, oder eine Referenz zu bekommen. Das heißt, so einfach wird mein Problem wohl nicht gelöst sein.
    Du musst eine Blueprint Function erstellen die eine Referenz von sich selber zurück gibt.

    C-Quellcode: MyTouchInterface.h

    1. // Fill out your copyright notice in the Description page of Project Settings.
    2. #pragma once
    3. #include "CoreMinimal.h"
    4. #include "GameFramework/TouchInterface.h"
    5. #include "MyTouchInterface.generated.h"
    6. /**
    7. *
    8. */
    9. UCLASS()
    10. class MOBILE18_API UMyTouchInterface : public UTouchInterface
    11. {
    12. GENERATED_UCLASS_BODY()
    13. public:
    14. static UMyTouchInterface *touchInstance;
    15. UFUNCTION(BlueprintCallable, BlueprintPure, Category = "MyTouchInterface")
    16. static UMyTouchInterface* getMyTouchInterface();
    17. };
    Alles anzeigen


    C-Quellcode: MyTouchInterface.cpp

    1. // Fill out your copyright notice in the Description page of Project Settings.
    2. #include "MyTouchInterface.h"
    3. UMyTouchInterface* UMyTouchInterface::touchInstance;
    4. UMyTouchInterface::UMyTouchInterface(const FObjectInitializer& ObjectInitializer)
    5. : Super(ObjectInitializer) {
    6. touchInstance = this;
    7. }
    8. UMyTouchInterface * UMyTouchInterface::getMyTouchInterface(){
    9. return touchInstance;
    10. }
    Alles anzeigen




    Jetzt müsstes du noch die Funktionen aus dem original Code eintragen. 1 zu 1 wird nicht gehen. Das Struct z.B. wird man wohl nicht brauchen. Naja probier jetzt weiter rum und melde dich wenn du nicht weiter kommst. Will aber net alles für dich machen. Sollst ja auch deinen Spass haben. :P
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.