[UE4.25.3 + Multiplayer] Beste Präzision für Geschosse

  • Hallo miteinander!


    Derzeit füge ich Schusswaffen in mein Projekt ein, nun habe ich dazu ein paar Fragen.

    Es geht vor allem um Multiplayer!


    Derzeit kenne ich 3 Wege:

    Im Projektil Blueprint:


    1. OnComponentBeginOverlap (Colission)


    2. OnComponentHit


    3. LineTrace -> HitActor/HitComponent (dabei über EventTick oder BeginPlay?)



    Habe die 3 System kurz angetestet und alle haben gewissen Präzisions-Probleme.


    1. OnComponentBeginOverlap hat Probleme wenn sich beide Actoren dazu bewegen, also es wirkt am unpräzisesten von allen 3 Systemen.


    2. OnComponentHit hat irgendwie allgemein Trefferprobleme...?


    3. LineTrace ist schon präzise auf kurzer Reichweite, aber auf großer Reichweite funktioniert es nicht mehr.



    Welches ist das beste allround Treffersystem für alle möglichen Schusswaffen?

    Schrotflinte, Gewehr, Scharfschützengewehr, Raketenwerfer, Granatwerfer, Energiewaffen usw. + diverse Nebeneffekte je nach dem.


    Danke für eure Infos!


    Derzeit habe ich scheinbar noch ComponentReplication Probleme bei einigen Gegenstände, das würde ich gerne dann näher damit testen wollen.


    Aktuell verwenden alle meine Nahkampfwaffen "OnComponentBeginOverlap" mit einer Colission Sphere.

    Das funktioniert auch soweit gut, aber vielleicht gibt es noch besseres?

  • Wie weit ein Line Trace geht setzt du selber mit dem End Parameter. Da kannst du ja auch nen Faktor einbauen um es zur Laufzeit zu justieren. Für sehr schnelle Projektile wie ne Pistolenkugel eignet sich ein LineTrace am besten da du ja die eigentliche Kugel gar nicht berechnen brauchst, die trifft ja (zumindest auf ein paar Meter) in ner Milisekunde. Für nen Raketenwerfer oder andere eher langsame Geschosse geht overlap normal sehr gut, was für Probleme hast du denn damit?

  • Rein theoretisch, könntest du alles mit nem LineTrace machen. Damit kannst du auch Bullet Drop berechnen, aber da müsstest du dann eben alles mögliche an Formel auspacken etc. was nicht nur ewig dauert, sondern auch den Server unnötig belastet. Wäre halt am präzisesten.


    Um kyodai aber kurz zu korrigieren: Ich würde nicht nach Geschwindigkeit entscheiden, welche Kollisionsart du nimmst, sondern nach Entfernung, da z.B. .50 BMG Munition, um einiges schneller ist als eine Pistole, aber auf Entfernung benutzt wird. Aber bei so fetten Wummen, wie ne Bazooka o.ä. würde ich genau so wie kyodai auf overlap bzw. eher auf Event Hit setzten.


    Hier mal zur Veranschaulichung:

    Das wird zwar in 99% der Fälle egal sein, aber wenn du beispielsweise auf einen Gegner schießt, kann es sein, dass ein Hit ausgeführt wird, aber es keinen Overlap gibt, weil der Gegner schon wieder weiter gerannt ist, und somit KEINEN Schaden nimmt.

    Look behind you! A three-headed monkey!

  • Line Trace ist halt nicht ballistisch sondern immer eine gerade Linie. Bei Pistolen und Gewehren spielt die Ballistik aber erst nach einer gewissen Weite eine Rolle, also daß die Kugel durch die Gravitation merklich nach unten geht.


    Bei sowas wie ner Bazooka ist der Line Trace zumindest ab einer gewisen Entfernung wegen der niedrigeren geschwindigkeit unbrauchbar. Was nützt es dir wenn ein fahrender Panzer in 200 Metern Entfernung den Line Trace positiv bestätigt dann aber zum Zeitpunkt des Eintreffens (1 bis 2 Sekunden später) soweit gefahren ist daß die Rakete vorbeifliegt.


    Bei anderen Waffen wie Granatwerfer muss das ganze per Physics und collission bzw overlap realisiert werden.


    Line Trace ist halt von den Ressourcen her sehr viel schonender da hier weder eine Kugel animiert noch Physik herangezogen werden müssen. Lass mal ein paar Spieler mit MGs hunderte Kugeln gleichzeitig durch die Luft feuern, da geht die Performance je nach Simulationstiefe und Rechenaufwand schnell runter.

  • Ich weiß schon was du meinst kyodai , aber wenn jetzt beispielsweise jemand mit dem MG auf Entfernung schießt, was zwar sinnlos ist, aber kommt ja vor, dann wird es mit LineTraces kompliziert.


    Was man machen könnte, ist, dass man wenn man die Schusstaste drückt, erstmal ein LineTrace abgefeuert wird, der die Entfernung mist, und anhand dessen entscheidet, welche Kollisionsart benutzt werden soll. Also als Beispiel: Ziel ist 5 Meter entfernt, dann LineTrace. Ziel ist 1 Kilometer entfernt, dann Projektil als Actor etc.

    Look behind you! A three-headed monkey!

  • Danke für eure Antworten!


    Ich hätte dazu schreiben sollen was ich damit alles machen möchte, um für euch besser verstehen zu können was für mich dann am besten geeignet wäre.

    Im Grunde haben derzeit alle Waffen das gleiche Schadenssystem wie die Panzergranate, das gilt auch für die Nahkampfwaffen (mit ActorBeginOverlap).


    Der Spieler wird Fahrzeuge selber bauen können, auf denen diverse Schusswaffen installiert werden können (mehrzahl).

    Von leichten bis schwere Maschinengewehre.

    Automatische Schrotflinten.

    Geschütze (kleines bis zu Schlachtschiff Geschützen)

    Artillerie

    Flammenwerfer

    Raketen

    usw.


    Ein Testpanzer mit Geschützturm + MG mit Zielvorrichtung usw. habe ich schon testweise eingebaut und das funktioniert auch soweit relativ gut! Aber ich befürchte das ich dort schon Fehler gemacht habe.

    Hier ein Bild von der Panzergranate:

    SCHADENSBEREICH:

    ---

    HAFTET AM ZIEL + EXPLOSION (+ entfernung des Actors)


    ---

    Dazu gibt es viele Bodenwaffen für die Spielfigur in Third- oder First-Person.

    Raketenwerfer (Anti-Fahrzeug Waffen)

    Armbrust

    Waffen gegen andere Spieler, MGs, Schrotflinten, Scharfschützengewehre.

    Also das komplette Sprektrum an diversen Waffen.

    Die Nahkampfwaffen sind bereits schon implementiert und diese sind auch noch etwas fehlerhaft.


    Später sollen noch Flugzeuge dazu kommen.


    Das alles im Multiplayer entsprechend auf einer "Open World".


    Vieles davon soll Leuchtspur Munition verwenden (weil das von den Effekten her viel schöner ist, vor allem wenn es etwas dunkler im Level sind).


    So wie sich das anhört wie das berühmte "Schlachtfeld" Spiel, was gefühlt jedes Jahr neu erscheint, nur eben anders.

    Daher wäre mir eine gute Präzision/Performance sehr wichtig!


    Vielen Dank für eure Infos! :)

    • Offizieller Beitrag

    Wie hast du dir den das Zielen schießen und treffen vorgestellt ?


    Ich stelle es mir schwierig vor zu fahren gleichzeitiig zu zielen und dann auch noch zu treffen ?


    Wovon hängt es ab ob man trifft oder nicht ?


    Ich finde die Idee im Still von Rocl`n Roll Racing übrigend sehr cool hab das spiel auf dem Nintendo sehr gerne gespielt.

  • Hi Sleepy, ich verstehe deine Frage nicht.


    Zielen und schießen ganz normal, genau so wie beim fahren.


    Spielfigur: Linke Maustaste ist schießen aus der Hüfte, rechte Maustaste ist Zielen und linke Maustaste zum schießen.

    Fahrzeug: Das gleiche.


    Auf dem Server wird an der Waffe das Geschoss gespawnt (SpawnActorFromClass) und dieses fliegt in entsprechender Richtung... wenn es einen Gegner trifft, richtet es Schaden an, oder nicht, je nach Panzerwungswerte am Ziel.

  • Wenn ich die Screenshots richtig sehe, dann hängst du an einer realen/physikalischen Umsetzung. Die Berechnung des Schadens läuft auf dem Server, soweit ich das erkennen kann.


    Irgendjemand schrieb es schon mal, da könnte der Server irgendwann in die Knie gehen. Natürlich wird das cheaten etwas verringert.


    Von der Performance halt ich die Rangehensweise allerdings für fragwürdig. Wenn die Pings nicht mehr stimmen, wird das schnell undurchsichtig. Hast du Lags auf Client und Serverseite, warum auch immer, dann werden Treffer zum Glücksfall und eventuell auch zum cheaten.


    Die Trefferabfrage benönigte eine sehr hohe Priorität und möglichst wenig Traffic. Abstrahiere dein Problem. In einer Client/Server Beziehung spielt erstmal nur eine Rolle, ob du getroffen hast, die Schadensberechnung kannst ja auch im Anschluss durchführen. Ein LineTrace dürfte am schnellsten sein.


    In den Screenshots seh ich noch, das du Actor zersörst. Generell würde ich Geschosse mit Niagara machen, allein wegen der Performance und hier keine Meshes zum Einsatz bringen. Das was du optisch als Spieler wahrnimmst, solltest als Entwickler eher faken und nicht real abbilden.


    Wenn man wirklich Kugeln und andere Geschosse als Mesh mit einer Physik darstellt und daran eine Treffer und Schadensberechnungs machst, wird dir das nur bedingt gelingen, weil es kein Singleplayer ist. Nicht jeder hat die selben Frames und willst du die Flugbahn tatsächlich zwischen Server und Client abgleichen. Ich denke, das zwingt den Server in die Knie und dein Netzwerk auch.

    • Offizieller Beitrag

    Hi Sleepy, ich verstehe deine Frage nicht.


    Zielen und schießen ganz normal, genau so wie beim fahren.


    Spielfigur: Linke Maustaste ist schießen aus der Hüfte, rechte Maustaste ist Zielen und linke Maustaste zum schießen.

    Fahrzeug: Das gleiche.


    Auf dem Server wird an der Waffe das Geschoss gespawnt (SpawnActorFromClass) und dieses fliegt in entsprechender Richtung... wenn es einen Gegner trifft, richtet es Schaden an, oder nicht, je nach Panzerwungswerte am Ziel.

    Ich glaube du hast ne sehr gute Vorstellung wie das aussehen soll ich als Außenstehender weiß natürlich was du denkst bzw was du als normal bezeichnest.


    Ganz normal würd ich mir so vorstellen: Thirdperson, du drückst die Taste W um gerade auszufahren auf dem Dach hast du ein MG das du mit der Maus drehen kannst und mit der vorderen Maustaste schießen musst. Oder druckst auf die Maustast und vorne am Auto kommt ne Rakete raus.


    Das alles ist wichtig um auch wirklich den performanten Weg zu finden.


    Vielleicht erklärst du erstmal grundsätzlich wie du dir die Perspektive und die Steuerung vorgestellt hast.


    Wie gesagt, mir fehlt dazu komplett der Bezug.

  • Soweit bin ich aktuell gerade nicht.

    Der Panzer funktioniert schon aber das ist nicht das was ich suche.


    Es ist schwer zu sagen weil das erst kommt, nachdem ich die Bodenwaffen für den Charakter fertig gemacht habe.

    Ich schaffe es leider nicht alles gleichzeitig zu machen.


    Im Grunde funktioniert das ganze so, das wenn man ein Fahrzeug steuert, so wie du schon beschrieben hast. Das entsprechend (egal wo) am Fahrzeug mehrere Waffen angebracht sind, die werden dann mit der Maus gesteuert und abgefeuert.


    So kann man ein MG + Raketenwerfer + Panzergeschütz miteinander kombinieren oder separieren (alternative Feuertasten) und entsprechend in der Mausbewegung.



    Annubis

    Habe heute eine Schießwand eingerichtet, bei der ich genau schauen kann wo getroffen wird, mit wie viel Schaden und vor allem was da trifft + Haftungseffekt. So kann ich auch besser sehen wo das Projektil stecken bleibt.

    Leider bleibt das Projektil richtig im Charakter stecken, aber es wird nicht mit der Animation synchronisiert. Da muss ich gucken ob es da noch eine Lösung gibt.

    Derzeit ist es mit "AttachActorToActor" gemacht. (Projektil Actor an MyCharacter Mesh Actor)

    Da habe ich es so gemacht das mein Projektil mit einem "OnComponentHit" startet, wenn es getroffen wird, wird ein "LineTraceToChannel" gestartet, beides miteinander geprüft und das ergibt das Endresultat.


    Bisher funktioniert es sehr präzise und so wie ich mir das vorgestellt habe.

    Ich werde noch weiter testen müssen, vor allem mit einer Minigun (oder allgemein Waffen die schneller feuern).

    • Offizieller Beitrag

    Okay genau:


    Ich sehe zwei Möglichkeiten:


    1. DU zielst, du drückst eine Taste (Feuer) ein Raycast wird wird abgeschossen und misst ob du getroffen hast. Fahrzeug Kaputt.

    Ist zb ein anderen Fahrzeug dazwischen oder fährt in die Schussbahn, könntest würde dann dieses zerstört werden. Das kannst du über den Raycast feststellen.


    2.Du könntest natürlich auch ein Geschoss (Mesh) abfeuern. Dann wäre Kollision des geschossen die Zerstörung. Wenn ein anderes Fahrzeug in die quere kommt würde dieses zerstört werden.


    Ich könnte mir außerdem feststellen das du am Einschlagspunkt ein paar Raycasts in alle Richtungen schießen um zu prüfen ob noch andere Fahrzeuge in Damage Bereich sind. zb für Flächenschäden. Die Länder der Casts wäre dann dann der Radius des flächenschadens.

    • Offizieller Beitrag

    Ich hab jetzt mal nach Raycast gegoogelt, weil ich mit dem Begriff echt überhaupt nix anfangen konnte...

    Ein Raycast ist ein für den Spieler unsichtbarer Stahl, mit ihm kann man zb abfragen ob etwas getroffen oder ob etwas im Weg ist man kann zb auch abfragen auf was ein Spieler zielt um dann zb ein Rahmen um das Objekt zu zeichnen.

    https://docs.unrealengine.com/…TraceByChannel/index.html

  • Das ist wie ein Laserpointer sozusagen ^^


    Ja ich mache mehr so in die Richtung MMO, wobei es korrekt ausgesprochen "Active Online Role Play Game (AORPG)" ist.


    Erstmal den Schaden an ein Object und dann weitere Schadensmöglichkeiten.

    Weil der Schaden an mehreren Actoren in diesem Bereich, würde grob gesagt über eine Explosion erfolgen, die dann in einem bestimmten Bereich alle möglichen Trefferziele ermittelt.


    Vielen Dank für eure tollen Informationen! :)