[4.23] Moving Forward - Rotations Problem

  • Ich grüße euch alle!


    Bin von der UE 4.22 auf 4.23 umgestiegen und häufig ist es so das alte Dinge wieder angepasst werden müssen, damit diese in der neuen Engine Version funktionieren.


    Nun habe ich wieder ein Problem mit dem Movement, vor allem mit "MoveForward" (kurz vor- und zurücklaufen).


    Dazu hier ein Screenshot von dem Script, dazu anzumerken das die Variablen komischerweise nicht auf dem Server verändert werden, auch wenn ich ein CustomEvent mit Server -> MultiCast davor setzte, es verändert sich nichts.

    Alles weitere ist Replicated, also DEDICATED SERVER.


    Das hier ist im MyCharacter (Spielfigur) Blueprint. (Das rote ist das Fehlerhafte)




    Egal wie sehr ich das verändere ich drehe mich (sprich wörtlich im Kreis, nicht im Spiel ^^).


    Kurz zur Info wie ich es haben will:


    MoveForward Value == 0 = Stillstand, der Character rotiert nicht aber die Kopfbewegung ist frei verfügbar. Also man sieht im Spiel wohin die Spielfigur schaut, daher ist das mittlere RICHTIG.


    MoveForward Value == -1 = Rückwärtslaufen, der Character läuft mit dem Rücken nach hinten (eben das echte Rückwärtslaufen). Der Körper ist nach vorne gerichtet und man läuft ganz klassisch zurück, dabei wird auch die Rotation im Rückwärtslaufen berücksichtigt, also man kann Rückwärts um ein Objekt herumlaufen.

    Das ist auch RICHTIG.


    MoveForward Value == +1 = Vorwärtslaufen, der Character soll nach vorne laufen und das auch nach vorne gerichtet um ein Object herum (so wie man im echten leben normal nach vorne geht). Das ist FALSCH, weil die Weltrotation (Yaw) immer -90 Grad ist und ich weiss nicht warum.

    Es wird auch nicht auf dem Server die Veränderung durchgeführt und das ist extrem verwirrend, obwohl Movement immer automatisch Replicated ist (steht extra in der Variablebeschreibung)!


    Egal was ich umstelle oder verändere, es bleibt immer der gleiche Fehler.

    Ändere ich die Werte bei den anderen Bereichen (0 oder -1) dann gibt es dort andere Probleme, etwa die Spielfigur ruckelt usw.



    Irgendwie sehe ich den Fehler nicht und anscheinend (laut anderen Leuten) soll das Angeblich nur in C++ lösbar sein (habe keine Ahnung von C++). Das kann ich mir aber irgendwie nicht vorstellen.


    Wäre sehr dankbar über eure Hilfe, denn eine korrekte Bewegung ist für mein Projekt extrem wichtig.

  • Der Axis Value ist korrekt.

    Sowohl am Event Tick (Print String) + auch direkt hinter dem InputAxisMoveForward (Axis Value)
    Das Problem liegt meiner Meinung nach in der Rotation der Spielfigur, denn diese ist in eine Richtung "gebunden"


    Wenn vorne -90 Grad ist, dann bleibt die Figur immer -90 Grad, obwohl ich um ein Objekt herumlaufe.

    Wenn vorne 0 Grad ist, bleibt die Figur immer bei 0 Grad ausgerichtet, egal wie ich mich bewege.

  • Habe das Problem lösen können das ich mit der Spielfigur nun komplett frei bewegen kann und das auch auf richtige Art und Weise, nun bleibt das Problem bestehen das sich die Spielfigur im Stillstand im Kreis dreht, was total bescheuert ist.


    Ich bekomme das auch nicht weg, denn egal was ich einstelle (Auch über Event Tick mit und ohne CustomEvent -> SERVER -> MultiCast) es enstehen weitere Fehler. :(





    "Use Controller Rotation Yaw" ist schuld daran das man sich im kreis dreht, aber es lässt sich auf dem Server nicht abstellen!

  • Das Axis Input Event wird in jedem Tick auf dem Client ausgelöst. Von dort kannst du nix Multicasten und die Variablen werden auch nicht einfach an den Server gesendet, wenn man sie Replicated=true setzt.


    Du kannst vom Client ausschließlich an den Server senden via RPC. Also Input Event erstmal in ein weiteres Event, welches auf dem Server laufen soll senden. Von dort funktioniert deine Ursprüngliche Logik vielleicht. Prüfe auf jeden Fall, ob Input == 0 ist, bevor du was an den Server sendest, so sparst du dir einige calls. Oder du sendest dem Server nur Änderungen hoch und handelst alles onTick auf dem Server ab, wenn der Wert != 0 ist.

    Bei Float Vergleichen auf == würde ich Nearly Equals nehmen, so vermeidest du, dass es nicht auslöst (kann passieren), wenn Float mal wieder nicht soo genau gerechnet wird.

  • Das Axis Input Event wird in jedem Tick auf dem Client ausgelöst. Von dort kannst du nix Multicasten und die Variablen werden auch nicht einfach an den Server gesendet, wenn man sie Replicated=true setzt.


    Du kannst vom Client ausschließlich an den Server senden via RPC. Also Input Event erstmal in ein weiteres Event, welches auf dem Server laufen soll senden. Von dort funktioniert deine Ursprüngliche Logik vielleicht. Prüfe auf jeden Fall, ob Input == 0 ist, bevor du was an den Server sendest, so sparst du dir einige calls. Oder du sendest dem Server nur Änderungen hoch und handelst alles onTick auf dem Server ab, wenn der Wert != 0 ist.

    Bei Float Vergleichen auf == würde ich Nearly Equals nehmen, so vermeidest du, dass es nicht auslöst (kann passieren), wenn Float mal wieder nicht soo genau gerechnet wird.

    Hi, könntest du das noch genauer beschreiben?

    RPC?

    Weitere Events = CustomEvents?

    Wie Input auf 0 überprüfen, reichen da Branches nicht aus? (Float == 0 -> True?)


    Wie wendet man onTick an usw.


    Wie fein sollte Nearly Equals (Fehlerbereich) sein?



    Wenn ich nach dem InputMoveForward ein CustomEvent mit Server + Axis Value mache, bewegt sich die Figur nicht mehr :(

  • Replicated Function Call -> Custom Event+Execute on Server


    Input auf 0 prüfen, genau mit if(Input==0) ignore, else call RPC


    Voraussetzung ist, dass es als Dedicated Server + Client läuft, dass dein Pawn vom Player Controller geowned wird(sollte standardmäßig so sein, wenn der Character via GameMode Startcharacter gesetzt ist)

    Falls das alles nicht läuft, schreib mich mal direkt an, dann kann ich auch via teamviewer helfen. Da sehe ich eher was nicht stimmt als Rätsel zu raten.


    Nearly Equal gibt schon ne Zahl vor, 0,00001 oder sowas, reicht völlig. Ansonsten immer mit >= oder => arbeiten, sollte auch keine Probleme geben.


    Evtl ist deine MovementComponent nicht Replicated? Wenn die Serverseitig Input bekommt, sollte das sauber an alle repliziert werden.

  • MAXX


    Replicated Function Call -> Custom Event+Execute on Server = Funktioniert nicht, da der Charakter sich nicht bewegt.


    Input auf 0 prüfen, genau mit if(Input==0) ignore, else call RPC = bitte ein Screenshot dazu geben, danke!


    Wie wird der Player Controller geowned? Ganz normal darüber das dieser als PlayerController gesetzt wird?

    Bitte auch mit Screenshot!


    Bei mir steht "CharacterMovement (Inherited)" das ist doch normal so, oder?

    Wie macht man "MovementComponent" Replicated?

    Es gibt da keine Funktion dafür, nur ein "Component Replicates" was aber keinen Zweck erfüllt. Ob da nun ein Haken drin ist oder nicht macht keinen Unterschied.


    Alles läuft über Dedicated Server.

    Ich benutze bevorzugt den "Single Process" weil das schneller geht, aber mit echter Dedicated Server Simulation (wo auch alles andere wunderbar funktion, Crafting, Kampf usw.) da ist der gleiche Fehler in der Bewegung vorhanden.




    Grob gesagt:

    MoveForward == 0 dann ist "UseController Rotation Yaw" (False) + "Use Controller Desired Rotation" (False) + "Orient Rotation to Movement" (True) RICHTIG.


    Im Stillstand lässt sich der Kopf bewegen und der Charakter dreht sich nicht mit, genau so soll es sein!


    Aber wenn ich mich bewege, dann stimmen die anderen Werte nicht. Also der Spiel schaltet einfach nicht um.

    Denn

    MoveForward == +1 oder -1 dann ist "UseController Rotation Yaw" (True) + "Use Controller Desired Rotation" (True) + "Orient Rotation to Movement" (False) RICHTIG.


    Aber beides geht nicht, obwohl beides genau so sein soll ?!?!?!?!?

    Im Grunde werden diese Einstellungen einfach nur umgeschalten, mal so, dann so aber nicht beides gleichzeitig... aber irgendwie macht der beides gleichzeitig, weshalb es fehlerhaft ist.



    ---


    get "UseController Rotation Yaw" -> Print String

    get "Use Controller Desired Rotation" -> Print String

    get "Orient Rotation to Movement" -> Print String


    Habe ich alle an einen Print String geheftet um zu sehen wo sich was ändert und es ändert sich NUR auf dem Client 1 etwas und NICHT auf dem Server oder Client 2 (also nichts wird replicated). Weshalb ich vermute das dort der Fehler liegt!

    Aber egal wie sehr ich das Movement replicated machen will, der Server will das einfach nicht akzeptieren.



    Ich bin gegen Teamviewer... noch dazu ist das hier ein öffentliches Forum und ich bin mir sicher das noch andere hier gerne wüssten wie man solche Art von Fehler beheben kann (sofern man diese Art von Fehler hat) :)




    • Offizieller Beitrag

    In der Version 4.22 gibt es tatsächlich ein bug, der mich zur Weißglut gebracht hatte. Ein custom Event von ein, oder in ein child actor kann verbugt sein. Ich wollte das noch simulieren wann es passiert, bin aber noch nicht dazu gekommen. Da musste man das Event löschen,compilieren, neu erstellen, wieder compilieren um es zu beheben.


    Dann wollte ich hier hinzufügen, der movement ist replicted, wenn man es einstellt. Da kennst Du aber den Weg. Aber im movement variable einzustellen, ist es notwendig zum Server zu schicken und den Server es machen zu lassen. Auf dem Bild da oben kann es also nicht funktionieren. Die Inputs zu nehmen ist sowieso ungünstig. Dafür ist die Velocity da. Da die Daten vom Server geholt werden müssen ist der Input von Client sinnlos. Dann entscheidet der Server, was mit den mocements passiert. Also alles wird am Server berechnet. Der Client läuft nur, wenn der Server es sagt. Und nicht umgekehrt.der Client gibt also nur ein Befehl an den movement Input und der Server entscheidet alles weitere.

  • Schau mal:


    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Schau mal:


    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Super mega von dir!

    Auf diese Art Lösung wäre ich niemals gekommen, ich dachte ständig daran das derzeit etwas nicht korrekt repliziert wird, da eigentlich alle Bewegungen immer korrekt sind... nur eben das eine (rückwärtslaufen) hat das (vorwärtslaufen) immer ausgehebelt.


    Mein Problem wurde damit gelöst, endlich nach so langer Zeit!


    Die Kopf Rotation im Stillstand funktioniert auch genau so, wie es sein soll. Echt prima!

    Im Kampfmodus funktioniert das auch prima.


    Das einzige was mir nun negativ aufgefallen ist, das wenn man still steht (nach vorne ausgerichtet) und man schaut nun nach hinten und drückt dabei Vorwärts, dann dreht sich der Spieler Character instant (sofort) in die entsprechende Richtung.

    Das muss auf jeden Fall noch behoben werden, damit es perfekt ist.


    Im Grunde soll man sich selber in die entsprechende Richtung (manuell) ausrichten.

    Ob man jetzt z.B. nach links schaut und sich in diese Richtung (nach vorne hin) ausrichten möchte, weil dort ein anderer Spieler steht welchen man direkt ansehen will. Dann sollte dafür ein weicherer Übergang vorhanden sein. Damit das nicht zu sehr unlogisch wirkt.

  • für singleplayer funktioniert das hier sehr gut:


    Tick Rotation sendet die Rotation an den Server, der auch nur setActorRotation macht.


    Ich hab noch nicht ganz raus, warum, aber dadurch ruckelt die Rotation bei client. Bei den anderen Spielern sieht es allerdings flüssig aus, nur man selbst sieht, wie die eigene Figur ruckelt -.-

  • Jo, deswegen war ich da sehr durcheinander mit der ganzen Bewegung und den Möglichkeiten.

    Weil irgendwie scheint da der Wurm drinnen zu sein, wobei ich gehofft habe es würde mit UE4.23 behoben werden.


    Ich weiss nur das "Orient Rotation to Movement" die Rotation in Bewegungsrichtung macht und man kann bei MovementComponent in MyCharacter auch einstellen, wie schnell die Beschleunigung zum wenden ist.

    Also mit welcher Geschwindigkeit der Character sich soweit dreht bis dieser in der Animation flüssig noch vorne (in gewünschte) Richtung laufen kann.


    "Use Controller Desired Rotation" überschreibt auch Orient Rotation to Movement, also die hebeln sich gegenseitig aus.


    "Use Controller Rotation Yaw" Yes hat immer dafür gesorgt das die aktuelle Rotation beibehalten blieb, aber das ganzen untereinander so zu timen usw. das war immer das Problem, obwohl es eigentlich möglich wäre.


    Bei All Points Bulletin (http://www.apb.com) (was von 2005 ist) da funktioniert das System, so wie ich es haben will.

    Es ist genau so wie ich, nur mit dem Unterschied das wenn man dort schießt, dann kann man seinen Charakter nicht mehr frei mit der Kamera von allen Seiten betrachten, sondern die Kamera ist dann in Schussrichtung fixiert.

    Das ist der einzige unterschied, also das letzte fehlende Element.


    Der Character dreht sich dort auch in die zu sehende Richtung und nicht instant so wie es derzeit ist.

    Und das war noch mit der Unreal Engine 3.