Multiplayer Fahrphysik performant und modular

  • Hallo zusammen!


    Ich suche schon seit längerem nach einer Fahrphysik die sehr performant im Multiplayer ist und modular zugleich.

    Mit modular meine ich das die Fortwebungsmittel (Reifen, Kette, Beine usw.) für sich selber stehen.

    Das bedeutet wenn man 2 Reifen + 2 Ketten an das Fahrzeug dran baut, steuert man natürlich alle Fortbewegungsmittel gemeinsam, jedoch wenn man im laufe des Spiels die 2 Reifen verliert, soll das Fahrzeug trotzdem noch steuerbar sein. Auch wenn es nur ein Reifen oder nur eine Kette am Ende übrig bleibt (die Steuerung ist natürlich dann schwierigier).


    Im Grunde soll das Fortbewegungsmittel alleine funktioniert und nicht als ganzes Fahrzeug wie es üblicherweise so gemacht wird.

    Habe schon ein paar Fahrphysiken aus dem UE 4 Marketplace gekauft und eingebaut, jedoch funktionieren die nicht so wie gewünscht.

    Es funktioniert zwar als ganzes, aber nicht für jedes Teil selber.


    Gekauft habe ich nun: "Modular low poly robots"

    https://www.unrealengine.com/m…s?sessionInvalidated=true


    Das ist genau das wonach ich gesucht habe, auch wenn die Teile nicht einzeln sind, jedoch die Funktion ist soweit super.

    Leider ist es überhaupt nicht angepasst an den Multiplayer, was ich dann gemacht habe, nur leider funktioniert das nicht so wie es sollte und wenn, dann verbraucht das zu viel performance, was zu starken rucklern führt, obwohl die Karte leer ist. Bei 2 Spielern wohlgemerkt.


    Es sollen im Spiel später max 100 Spieler gleichzeitig (50 pro Seite) spielen, weshalb das so nicht funktionieren kann.

    Hat hier jemand eine Idee wie ich das gewünschte Ziel von mir erreichen kann und wie ich das mache?


    Man soll im Spiel sein eigenes Fahrzeug bauen können. Eine Fahrerkabine (die fest vorgegeben ist) dient als Basis und Kommunikationsplatform für alle anderen Teile (Pawn Blueprint), daran setzt man das Fahrgestellt und dort die Fortbewegungsmittel seiner Wahl. Ob Reifen, Ketten, Beine oder fliegende Dinge.

    An dem Fahrzeug montiert man zuletzt frei die Waffen die man möchte (es gibt natürlich entsprechende Einschränkungen das man nicht zu viele Waffen nutzen kann).

    Das ganze soll entsprechend über die Physik funktioniert, wodurch das Gewicht des Fahrzeugs (anhand der Bauteile) auch die Fahrmöglichkeit beeinträchtigt, so wie die Rammfähigkeit im Kampf usw.


    Freue mich auf Antworten!

  • Hier musst du etwas anders denken. Das Problem ist, das bei Physik nur der Server berechnen darf. Wenn der Server die Sachen berechnet, darf nicht jeder Kram repliziert werden. Der Client muss dann alles simulieren. Ich könnte mir vorstellen, dass der Client nur Daten senden muss, sowas wie ich fahre los, und ich bremse. Der Server berechnet komplett die Physik und gibt nur Location und Rotation raus für die Karosserie. Die Reifen hängen nur herunter und drehen sich. Die Schwerkraft macht dann alles. Sodass es nur visuell gezeigt wird. Es darf kein Objekt mit movement repliziert werden, ansonsten fließen Unmengen an Daten.

  • Im Grunde ist vieles soweit richtig gemacht.

    Hierzu einige Bilder.

    Wenn ich das soweit replizieren könnte, wäre das super.

    Leider sind viele Variablen LOCAL :(


    Die Rotation des Geschützturmes:


    ---

    Die Kettensteuerung:


    Welches Multiplayer Tutorial für diese Art von Fahrzeugsteuerung gibt es?

    Es gibt unzählige aber häufig nicht das womit ich die Bewegungsteile einzeln steuern kann.

  • Also ich habe mir die ganzen BP's jetzt nicht genau angeschaut, aber ich zweifle etwas daran, ob sie die vielleicht notwendige Komplexität aufweisen um ein Spiel daraus zu machen, in dem es auch oder nur darum geht Fahrzeuge zu bauen und zu steuern. Oder denke ich da ungerechtfertigter Weise bei Lowpoly an etwas RTS- artiges?

  • Die lokalen Variablen habe ich natürlich auch schon ausgetauscht und getestet, es brachte leider keine Besserung.


    Das Low Poly Paket ist inhaltlich extrem gut und beinhaltet fast alles wichtige.

    Im offline Modus funktioniert das ganze System extrem gut, nur brauche ich das eben für den Multiplayer.


    Darin enthalten.

    Reifen, Ketten, Spinnenbeine, Hover und Schneckenantrieb. Alles wichtige für diverse Kombinationsmöglichkeiten.

    ---

    ... Die nur auf dem Server ablaufen, brauchen zb nicht repliziert werden. Soll der Client mit den Daten etwas anfangen, dann muss es repliziert werden.

    Verstehe ich das richtig. Blueprint ist Replicated und das mit dem Server wird entsprechend über "CustomEvent" -> Server im Blueprint abgespielt (HasAuthority) -> remote und die Variablen für die Rotation bzw. für die Beschleunigung (Float aus InputAxis) ebenso replizieren.


    Oder meinst du mit "Server" anderweitig?

  • Ein Ausschnitt aus meinem alten Projekt. Da sind alle StaticMeshComponents wichtig und müssen unabhängig repliziert werden, deswegen ein Array. Ansonsten ohne Loop. Einmal den kompletten Wagen replizieren und die Reifen auf dem Client berechnen lassen, sodass es aussieht, als würden die etwas tun. Auf dem Server haben die Reifen tatsächlich eine Funktion. Die Drehung der Reifen werden also nicht repliziert. Wenn du das nicht so programmieren kannst, dann würde ich nicht jedes Rad replizieren, sondern die Achse. Aber ich glaube du schaffst es mit einer transform variable alles zu replizieren. Die Reifen können auf dem Client durch ihren eigenen Gamepad Input und Geschwindigkeit vom Actor berechnet werden und können somit drehen.

    Das wäre eine Variante, die billig ist. Da wäre replicate Movement viel besser. Aber damit lässt sich schlecht an den Daten manipulieren. Falls eine Rotation nicht so gewünscht ist.

  • Habe leider ein paar Fehler in der komischen Datenbank gehabt die mich daran gehindert haben hier weiter zu machen.


    Um das ganze besser analysieren zu können.

    Wie kann man in einem Array die Namen in der Reihenfolge anzeigen lassen, ohne ein Print String zu verwenden?

    Ich möchte gerne im Spiel in einem Widget den Inhalt eines Arrays (z.B. Anzahl der Reifen) anzeigen lassen, mit dessen Namen und Umdrehungen.


    Array -> ForEachLoop und das Ergebnis muss in einen String zum Return Node, leider zeigt der immer nur eines an und nicht alle in Reihenfolge.

    Kann man da irgendwie ein Add-String machen, so das die Namen in Reihenfolge gesetzt werden?


    Beispiel:

    ReifenLinksVorne

    ReifenRechtsVorne

    ReifenLinksHinten

    ReifenRechtsHinten

    usw.


    Das soll entsprechend nacheinander angezeigt werden, aber das tut es nicht da man immer nur eines anzeigen lassen kann.

    Am besten ohne Variable damit es sauber bleibt, wie geht das?

  • Es kommt darauf an wo es angezeigt werden soll.

    Ist es nur ein Text oder Rich Text, dann sollte ein Zeilenumbruch funktionieren. Die einfachste Methode ist mit Shift+Enter in einer Append. https://answers.unrealengine.c…ne-inside-a-text-var.html . Praktisch gesehen musst du erstmal dein String vorher bauen und dann anzeigen lassen.

    Ist es eine Scrollbox oder ähnliches, dann als children hinzufügen. Dafür muss man aber ein widget erstellen, dass nur text enthält und es als children zur box hinzugefügt wird und das für jeden loop vorgang. Die Childrens werden vorher mit SetText verändert.

  • Das soll entsprechend nacheinander angezeigt werden, aber das tut es nicht da man immer nur eines anzeigen lassen kann.

    Wenn du das komplette Array ausließt und den Inhalt in einem Printstring oder einem Widget anzeigen lässt, werden die Einträge so schnell angezeigt dass du immer nur den letzten Eintrag siehst.


    Vielleicht postest du einen Screenshot deines Blueprints ?

  • Ich weiss leider nicht wie man das nennt wenn etwas mehrfach wiederholt in einer Funktion einzeln angezeigt werden soll.



    Im Grunde ist in diesem Beispiel zu den Waffen (was auch bei dem Fahrzeug für die Reifen zählt) in einem Array mehrere "Dinger" vorhanden und diese müssen entsprechend einzeln aufgezählt werden.


    Bei dem Waffenbeispiel im Bild geht es um die "Waffenkunde", das wäre Einhändig + Schwert, das beides soll angezeigt werden, tut es aber nicht. Da immer nur das erste angezeigt wird. Da das erste immer auch das zweite überschreibt.

    Das in eine Variable zu packen macht auch keinen Sinn, da die Variable auch wiederum überschrieben wird.


    Bei den Reifen brauche ich das, um zu wissen wie der Antrieb zum Bodenkontakt der Reifen ist, da es eine größere Anzahl an Reifen gibt (mehr als 4 oder unbekannt X) muss jeder einzelne mit seinen Werten angezeigt werden.

    • Hilfreich

    oh gott, exaran, was los mit dir ^^

    Das was du hast ist Binding zu einem Text bestimmt. Dieser Return von deiner Funktion ist in einer Loopschleife und zeigt somit nur das letzte an. Da musst du schon "complete" vom loop nutzen. Nur dann zeigt es trotzdem das letzte an, denn dafür musst du auch was bauen. Sowas hier zb. Ich habe kein Binding genutzt, ist aber das selbe. {String}Shift+Enter{Enum} eingeben, dann bekommste die eingänge. Geht auch mit Append für String.


    Dann bekommste das hier: