[UE 4.25.3] Hitboxen (Trefferzonen) anders gestalten

  • Hallo zusammen!


    Ich möchte gerne mein Hitboxen System erweitern und nun bin ich etwas am rätseln wie ich das am besten anstellen kann.

    Das gilt natürlich für Multiplayer über einen deticated Server! Also das ganze muss replizierbar sein!


    Es geht darum:
    Ich möchte 6 Trefferzonen am Körper haben mit unterschiedlichen Multiplikator (mal X), das soll auch für NPCs gelten. Die Schadensberechnung ist einfach.

    Kopf : 200% Schaden

    Torso : 100% Schaden

    Linker/Rechter Arm: 50% Schaden

    Linkes/Rechtes Bein: 50% Schaden


    Nun möchte ich KEINE Hitboxen haben, wie namentlich erwähnt, sondern der Körper selber soll die Hitbox sein, entsprechend der Körperteilen. Dadurch sollen die Hitboxen einfach kleiner ausfallen.

    Dazu kommt noch das die Rüstung die über dieser Hitbox (Körperteil liegt) den Schaden reduzieren soll, oder ganz aufhalten. Die Schutzwerte mit den Schadenswerten zu prüfen ist auch hier kein Problem.

    Aktuell zählen alle Rüstungsteile zusammen was das ganze ziemlich schlecht macht, weshalb ich das ganze gerne in Trefferzonen/Regionen/Bereiche unterteilen will. So das auch eine schwere Beinpanzerung mehr oder weniger Sinn macht, je nachdem.



    Wie macht man diese Körper-Passgenauen Trefferzonen?

    Aktuell habe ich nur eine Trefferzone, der Character Mesh. Das geht auch ganz gut aber das ist mir zu allgemein, leider weiss ich nicht wie ich genau ein Bein (als Beispiel) als eigene Trefferzone definieren kann.

    Kann man das über die Bones machen oder wie genau?


    Das Problem dabei ist, bei Schusswaffen ist das ganze total easy, aber bei Nahkampfwaffen kann es aufgrund der Kollision schwerer werden.

    Das Ziel beim Kämpfen sollte sein das man möglichst die Schwachstellen des Gegners trifft, Siehe oben bei Tabelle und entsprechend der Rüstung.


    WICHTIGE FRAGE:
    Welche Art der Kommunikation verwende ich am besten (bezüglich Multiplayer) für die Schadensübertragung?

    Derzeit benutze ich "Event AnyDamage" weil man damit schon viele Informationen übermitteln kann die echt hilfreich sind, aber ist das auch wirklich das Beste?


    Hier ein Bild wie der Schaden der Waffe übermittelt wird:
    ItemDataBaseAusruestung = Struct der Waffe mit den ganzen Werten darin.
    DamageTypeClass ist derzeit noch einzeln gemacht, also ich habe bisher 3 solcher Blöcke für das Schadenssystem.


    ---


    Hier ein Bild wie der Schaden am MyCharacter ankommt und entsprechend gefiltert/reduziert wird (etwa durch die Rüstung Schnittschutz usw.).

    Derzeit gibt es nur 3 Schadensarten, aber es sollen noch weitere 12 dazu kommen.



    ---


    Ich habe mal irgendwo in einem Video gesehen das jemand vom Mesh z.B. ein Bein abschneidet und dieses Bein (unsichtbar) über das original Bein stülpt und dieses "Fake-Bein" dann mit einer Trefferzone belegt.

    Das klingt schon nicht schlecht aber nicht unbedingt die Lösung wonach ich suche (das wäre recht umständlich).

    In diesem Video (als Beispiel) verwendet dieser das Physics Modell für die Trefferzonen, aber das ganze erscheint mir doch größer (zu große Hitbox) für den Kopf. Der Kopf soll sehr schwer zu treffen sein, dafür macht man auch den doppelten Schaden daran.

    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.



    Freue mich auf Infos von euch, danke!


    Euch allen ein schönes sonniges Wochende!

  • Wenn du es nicht übers Material lösen willst, was meiner Meinung nach noch das genaueste System ist, dann kannst auch dein Skellet nehmen, welcher Bone wird getroffe? Sollte ja jeder Spieler und jeder NPC eins haben? Abweichungen kannst ja über das Trace regeln.


    Was auch geht sind getrennte eigenständige Hitboxen. In Blender kannst Körperteile einfach markieren, duplizieren und dann als Hitbox abspeichern. Da leidet dann aber die Performance etwas drunter. Allerdings ist die Methode sehr genau. Ob ein Charakter ne Rüstung trägt, wäre mir bei der Berechnung egal, da die Rüstung eh irgenwo im BP hinterlegt ist, die würde ich erst bei der Berechnung des Schadens berücksichtigen (gilt nicht für Schilde)

  • Wenn du es nicht übers Material lösen willst, was meiner Meinung nach noch das genaueste System ist, dann kannst auch dein Skellet nehmen, welcher Bone wird getroffe? Sollte ja jeder Spieler und jeder NPC eins haben? Abweichungen kannst ja über das Trace regeln.


    Was auch geht sind getrennte eigenständige Hitboxen. In Blender kannst Körperteile einfach markieren, duplizieren und dann als Hitbox abspeichern. Da leidet dann aber die Performance etwas drunter. Allerdings ist die Methode sehr genau. Ob ein Charakter ne Rüstung trägt, wäre mir bei der Berechnung egal, da die Rüstung eh irgenwo im BP hinterlegt ist, die würde ich erst bei der Berechnung des Schadens berücksichtigen (gilt nicht für Schilde)


    Über Material müsste jedes Körperteil ne eigene Material haben?

    Linker Arm = Material 1

    Rechter Arm = Material 2

    Kopf = Material 3


    Usw.?


    Das mit den Körperteilen aus Blender ist nicht gut finde ich, am besten wäre eine einfache und präzise sowie performante Lösung. Sofern ich richtig verstehe was du meinst. Das wäre sozusagen den Kopf noch mal einzeln als Mesh zu machen und diesen unsichtbar über den eigentlich Kopf zu setzen? Sozusagen ein Kopf im Kopf der dann die Hitbox ist.


    Ursprünglich war gedacht das so zu machen, das wenn eine Lücke in der Rüstung ist und man dazwischen sticht/schießt das die Rüstung dann umgangen wird, aber da ich so viele Rüstungsregionen habe ist das doch nicht so gut.


    Also was Annubis gesagt hat, funktioniert auf alle Fälle.


    Meine Idee wäre noch, dass du die Sockets der Körperregionen in nem Array speicherst, und dann mit For-each bei jedem Treffer guckst, welche Körperregion das ist, und dann deinen Schaden berechnest.

    Wie genau macht man das und wie präzise ist das ganze?

    Das mit den Bones wäre super, weil dann auch alles in den Animationen soweit passen würde.


    Bin mir da auch nicht so ganz sicher, deswegen.



    Wenn man BOX oder Zylinder usw. als Hitbox verwendet, dann verursacht das Fehler in diversen Animationen (wenn die sich überlappen).


    Daher wäre Material schon das beste, aber wie mache ich das so das es zu keinen Problem führt?


    Der Grund ist, dass man besonders viel Einstellungen am Character vornehmen kann (extrem viele optische Veränderungen), über Haut, Tattoo, Schminke usw. sowie auch die Morphs (also Größen von Körperteilen) das muss alles mit in den Schadensbereich berechnet werden.


    Sprich, eine große Person hat auch eine größere Hitbox, während eine schlanke eine kleinere hat usw.

  • Am optimalsten wäre es, wenn du im PhysicsAsset deines Characters, jedem Body ein PhysicsMaterial verpasst und bei "Hit" dann einfach das PhysicsMaterial abfragst (dafür ist es ja da).



    Annubis hat dir den anderen Weg gezeigt, nicht ganz so performant, aber auch noch ok.

    Einfach ein paar Meshes für die verschiedenen Zonen erstellen und dann auch mit Morph-Targets scalen^^


    Mir ist kein Shooter bekannt, der Morph-Targets benutzt, wenn es nen fetten und nen dünnen Character gibt, dann sind das alles selbständige Modelle.

  • Danke dir, werde es soweit ausprobieren und integrieren!

    Diese Variante ist dann auch wirklich soweit am performancesten im Multiplayer?

    Bzw. wie machen das die großen Herstellen für ihre Call of Dutys usw.?



    Was ich mit Morph Target meine ist, das die Hitbox auch mit der tatsächlichen Größe des Characters sich verändert.

    Es gibt Spiele da können die Charaktäre unterschiedlich groß sein, aber die tatsächlich Hitbox bleibt gleich (um es balanced zu machen). So als würde man einen winzig kleinen Character machen aber die echte Hitbox gilt für die normale Größe.


    Wäre ja auch unfair wenn der Character winzig klein ist (ebenso die Hitbox) aber genau so viel Schaden austeilt und aushält wie ein großer mit größerer Hitbox.

  • Danke dir, werde es soweit ausprobieren und integrieren!

    Diese Variante ist dann auch wirklich soweit am performancesten im Multiplayer?

    Bzw. wie machen das die großen Herstellen für ihre Call of Dutys usw.?

    Wie performant das ist kann ich dir nicht sagen, aber da es bereits in der Engine integriert ist, wird es schon das beste sein^^

    Ich spiele kein COD, daher auch keine Ahnung ob es da überhaupt MorphTargets gibt...

    Mit C++ wird aber bestimmt noch mehr möglich sein, kann ich aber nicht, also keine Ahnung^^


    Was ich mit Morph Target meine ist, das die Hitbox auch mit der tatsächlichen Größe des Characters sich verändert.

    Hab ich schon verstanden, hab die Lösung oben genannt^^

  • Das Material ist unwichtig, kannst du machen wie du willst, das wichtige ist das Physics-Material, denn auf dessen Basis wird ja der Schaden berechnet^^



    Eigentlich reichts auch, wenn du das Mesh des Characters in mehrere Teile splittest (nicht auseinander schneiden, sondern einfach verschiedene Materialien den Regionen verpassen), also Rumpf, Kopf, Beine und Arme und jedem der 4 Bereiche, eine eigene Material Instance des bisherigen Materials gibst, die sich alle die gleiche Textur teilen, aber alle ein anderes Physics-Material haben.



    Der Polycount würde gleich bleiben^^


    Das einzige Problem was ich gefunden hab, ist dass wenn ein Mesh mehrere Materialien hat, nur das PhysicsMat von dem ersten Material (Index 0) nimmt, somit eher schlecht für deine Zwecke...

    Reicht mir für heut aber auch mit dem testen, vielleicht morgen wieder^^




    Edit:

    In der 4.25 braucht man nicht mal mehr mehrere Materialien auf dem Skeletal, das ganze funzt dort über ne Maske im Material:

    Aber gleiches Problem wie oben, mit erstem Material...

    Vielleicht kapier ichs auch einfach nicht^^

  • Das mit dem physic Dingsbumbs wäre schon prima, aber wie kann man dann im MyCharacter entsprechend feststellen welches Teil (am Körper) getroffen wurde.

    Mit dem "Hit" Event gehts nicht:

    Da kommt immer nur "Default" raus...


    Wenn man vors Print noch ein Trace macht, kriegt man vom ersten Material das PhysMat raus:

    Weiter bin ich noch nicht beim testen, wobei mir grad auch nix mehr einfällt...


    Übrigens gleiches Problem, wenn man noch "Break Hit" dazwischen schaltet und von dort den Surface Type nimmt oder das mit dem Face-Index macht^^


    Habs auch mit nem Static Mesh getestet, selbes Problem...

  • Hab mich nochmal daran versucht, kriege inzwischen 2 verschiedene Physical Materials raus, wobei eins davon nur "Default" ist...


    Habe im Character, Dynamic Material Instances eingebaut, statt verschiedene Materials direkt im Skeletal zu setzen:

    Aber keine Ahnung wieso jetzt nur eins geht, bei nem Print-String (welcher bei mir in der UE4.25 übrigens endlich auch im ForEachLoop funzt), werden für jede Region verschiedene Physical Materials angezeigt...

    1=Augen^^


    Weiter teste ich aber auch nicht, ist mir zu blöd, außerdem brauch ich auch nur 2 Regionen...

  • Geloscht

    Vielen Dank!

    Das sieht erfolgsversprechend aus, genau wonach ich suche!


    Das was ich bisher in Tutorials gesehen habe war alles nicht gut oder für mich unbrauchbar.

    Sobald ich die Schusswaffe fertig habe (auch mit Funktion) kann ich das besser testen.

    Mit Event Any Damage geht das auch?

    Bzw. wie hast du die Dynamic Material instances gemacht/gesetzt und funktioniert das auch problemlos im Multiplayer?





    Dj EKI
    Eine sehr gute Frage!


    Waffe:

    Aktuell ist es so das ich mehrere Schwerter habe (da geht es am einfachsten).

    Diese haben EINE "Capsule Collision"

    Waffen Blueprint -> Collision -> Collision Preset -> Collision Object Type = SCHADEN (habe ich nur so genannt)

    Collision Responses -> SCHADEN -> Overlap

    Schadensübertragung ist hier -> "Apply Damage"


    Also ziehe ich bei jeder Waffe einfach die Capsule Collision über den Bereich der Schaden machen könnte (in dem Fall die Schwertschneide) und fertig. Bei einer Axt geht das auch noch, so wie Hammer usw. Aber je kleiner und fummelliger die Waffe (z.B. als Doppelklingen-Schwert) da geht das wiederum nicht. Da müsste ich die ganze Capsule Collision über die ganze Waffe ziehen, was eigentlich für Präzisions-Fehler sorgt (eben weil die Hitbox dann größer ausfällt als eigentlich sollte).

    Daher wäre so gesehen eine Schadens-Treffer Alternative sehr wichtig.


    Darum auch das Thema hier.


    Ich glaube das ich beides falsch mache, aber trotzdem funktioniert es soweit gut.



    MyCharacter / Monster:

    My Character Blueprint -> Mesh -> Collision -> Object Type = PhysicsBody.

    Collision Responses -> SCHADEN -> Overlap


    Also wenn die Waffe den Character Mesh trifft und beide haben SCHADEN Overlap, erleidet der Spieler Schaden.

    Das gilt auch für Monster.


    Bei einem Angriff wird für die Dauer der Animation die Capsule Collision aktiviert und entsprechend wird der Schaden übermittelt. Leider kann es auch mal vorkommen das doppelter Schaden gemacht wird (wegen Verzögerung oder irgendwas).


    Bei Schusswaffen ist das Schadenssystem easy aber für Nahkampfwaffen gibt es nichts gescheites.

    Tab-Targeting muss vermieden werden!

    Die meisten Tutorials haben eine Art Target-System und genau das möchte ich vermeiden.

  • Du machst erstmal ein Event Hit, in deinem Projektil, wobei das auch mit nem Trace gehen würde, falls keine Projektile verschossen werden (wie in CS), danach berechnest den Schaden und gibst ihn per "Apply Damage" weiter^^

    Oder du gibst einfach nur die getroffene Region und den Schaden mit nem Interface an den getroffenen Gegner weiter und dort wird alles berechnet.

    Geht beides, wie du es machst, bleibt dir überlassen^^


    Dynamic Material ist so wie oben beschrieben, das "Set Vector Parameter" kannst weg lassen, ist nur da um die Regionen in anderen Farben darzustellen ... falls du es zum testen trotzdem drin haben willst, machst ein Vector3-Node, als Parameter, nennst ihn "Color" und stöpselst ihn in "Base-Color" ein.


    Müsste wie alles andere auch im Multiplayer gehen, hab ich nicht getestet, hab noch meine Probleme mit Multiplayer-Zeug...

    • Offizieller Beitrag

    Wenn du mit Overlap arbeitest, dann muss dir klar sein, dass einige mit ein schlechteren PC die Körperteile nicht treffen. Overlap ist FPS abhängig. Die Waffe überspringt praktisch die Körperteile.

    Arbeite da lieber mit Traces. Collisionsboxen kannst du trotzdem verwenden und auf Waffen ausreichten und die dann per interface die größe und Position auslesen. Damit ist es aber nicht getan, traces sind ja auch FPS abhängig, aber man kann damit Lücken füllen. So könnte ein BP aussehen. An ein Tickrate natürlich. Lass hier ruhig den Server alles machen und gebe nur die Position deine collisionsbox weiter oder nutze die aniamtion, die auf dem Server läuft aus und lese dort die Daten ab. Der Spieler soll am besten nur senden, dass er die Maustaste gedrückt hat.

    Und hier sieht man, wie die BoxTraces fast Lückenlos alles ausfüllt. Da sind 2 boxen nebeneinander und versuchen eine ganze Animation auszugleichen bei 15FPS. Da sind evtl fast 4 FPS zusehen bei einem schlag.


    Bei Overlaps hast du ja das Problem, wenn es keine Physik ist, generieren sie kein Hit Event, somit auch kein Hit Result. Traces können aber Hit Results erzeugen. Da ist wieder ein Vorteil darin. Hit Result kann dir Bones auslesen (physikassets Bodies)

    Solltest du trotzdem Overlap nutzen wollen, dann kann man auch die bones auslesen, also die collisionsboxen in Physikassets, indem du in der Mesh MultiBodyOverlap aktivierst.


    Um deine Rüstung abzufragen, versuch bitte nicht die Collision von den Rüstungen mit abzufragen. Das geht voll in die Hose. Die brust kann also nur Brust Rüstung tragen, (alles Bodies die zur Brust gehören) also wird darüber die Rüstung angefragt, was für werte sie hat und dann berechnet.

  • Oh weiha ist das kompliziert. :(


    Derzeit hänge ich noch total hinterher, die Schusswaffen sind schon drinnen aber das Zielen (also die Animationen sind nicht dafür gemacht).


    Es gibt da ein Battle Royale Multiplayer Spiel in dem man Z.B. Töpfe als Rüstung nehmen kann und da ist es so, dass wenn man ein Top als Knieschutz verwendet und man schießt auf den Topf, gibt es einen ensptrechenden Leuchteffekt und der Schaden wird auch reduziert.

    Schießt man oberhalb oder unterhalb des Topfes (also auf das Bein), trifft man auch das Bein ohne den Schutz des Topfes am Bein.


    So wie das derzeit wäre oder geplant ist (laut dem obrigen Text), würde ein Geschoss das Bein meines Characters treffen (anhand einer Colission oder Hit oder Physic Material) und dann würde der Schaden durch die getragene Rüstung reduziert werden.

    Befindet sich am Bein folgende Ausstattung:

    1 - Stiefel (2 Rüstung)

    2 - Knieschutz (4 Rüstung)

    3 - Oberschenkelschutz (4 Rüstung)


    Würde alles drei zusammen gezählt werden (2+4+4) = 10 Rüstung, obwohl man vielleicht nur das Knie treffen würde.


    Versteht ihr was ich damit sagen will?

    Man würde etwas berechnen was man vielleicht nicht trifft... ANDERERSEITS, müsste man nicht jedes Rüstungsteil einzeln berechnen sondern das gesammte Bein an sich, aber was davon ist derzeit interessanter zu spielen?


    - Ein einfaches Hitbox System wo der ganze Charakter gezählt wird.

    - Die 6 Trefferzonen (soweit ich geplant habe)

    - So viele Trefferzonen wie Rüstungsteile (das wären aktuell 32 Rüstungsteile die man Anziehen könnte)


    Bei dem letzteren vermute ich starke Server/FPS Probleme beim Spielen wenn mehrere Spielfiguren aktiv sind.



    Das ist wieder so eine "Qual der Wahl" Frage.




    Wenn ich das 6 Trefferzonen System verwende (Kopf, Torso, Arm (L+R) und Bein (L+R)) wäre es dann nicht sinnvoller das Character Modell so zu gestalten das man theoretisch die Körperteile abschießen könnte (also von der Logik her) vom Körper getrennt sind?

    Und jedes getrennte Körperteil könnte man als Material betrachten.

    Als Beispiel, wenn der linke Arm zu viel Schaden nimmt oder durch eine Explosion, wird dieser abgerissen und somit wird dieser vom Körper entfernt.


    Kann man das nachträglich einrichten? Weil derzeit ist meine Character-Modell nur ein gesamtes Teil.

    Denn wenn das mit den einzelnen Körperteilen sinnvoller wäre, müsste ich ja zuerst ein neues Character Modell finden, bevor ich jetzt so viel Zeit darin versenke und es dann eh nicht so klappt wie gedacht/gewünscht.



    Natürlich werde ich eure beiden Vorschläge mir vorher genauer anschauen und testen! :)

    Vielen Dank dafür!




    PS:

    Frage1:

    Ich muss im AnimGraph (beim AnimationBlueprint) ein "BlendPosesByBool" machen, aber wie teile ich "LocalToComponent" auf zwei Wege auf?

    Ich kann entweder nur eines von beidem machen und bei BlendPosesByBool soll ja entweder das eine oder andere gemacht werden und nicht beides gleichzeitig.


    Die einzige Möglichkeit das Zielen mit der Waffe einzubauen ist genau dort im AnimGraph!

    Weil dort alle wichtigen Informationen zusammenlaufen (Siehe: KopfRotation).


    ---


    Frage2:

    Ich muss ein ObjectReference -> Replication = RepNotify -> Replication Condition = Custom (z.B. Rüstung/Waffe usw.) mithilfe von "SetMasterPoseComponent" anbringen.

    Leider dauert das etwas bis der Server dies abgeschlossen hat und ich muss irgendwie überprüfen oder das ganze anhalten/stoppen bis die Rüstung am Character richtig angebracht ist, erst dann darf etwas anderes passieren.

    Wie überprüfe ich so etwas und vor allem wie setzte ich eine Art STOPP/PAUSE ein, bis das überprüft und abgeschlossen ist, damit weiteres Funktionen wieder normal ausgeführt werden können?



    Danke für eure Hilfe!

    Ich weiss leider sonst nicht wo ich nachfragen könnte :(

    • Offizieller Beitrag

    Frage 1: Verwende deine erstellte CachedStateMachine. Dafür ist der da um mehrmals verwendet zu werden. Ist sowas wie ein Aufteilen.


    Frage 2: Set Master Pose, muss das jeder Client ausführen? Reicht das nicht für den Server? Sind die Sachen, die angesetzt werden repliziert? Was passiert wenn der Server zu langsam war?

  • Frage 1: Verwende deine erstellte CachedStateMachine. Dafür ist der da um mehrmals verwendet zu werden. Ist sowas wie ein Aufteilen.


    Frage 2: Set Master Pose, muss das jeder Client ausführen? Reicht das nicht für den Server? Sind die Sachen, die angesetzt werden repliziert? Was passiert wenn der Server zu langsam war?

    Meine Güte das zu Frage 1 war ja echt einfach ^^

    Super danke dir, wusste nicht dass das so einfach ist!



    Zu Frage 2:


    Wie meinst du das mit "Muss das jeder Client ausführen?"

    Wenn ich dieses MasterPostComponent weglasse, schwebt die Rüstung/Waffe angeklebt am Character in der Luft = funktioniert nicht.


    Da geht es um Rüstungen und Waffen.

    Inventar Widget -> MyCharacter Blueprint (to Server + Multicast) -> ActorReference, SetMasterPoseComponent.


    Bis ich da ein Ausrüstungsteil angezogen habe, vergehen schon mal 4-6 Sekunden.

    Das dauert extrem lang aber ich weiss nicht warum.

    Im Grunde wird das Static Mesh unsichtbar und das SkeletalMesh sichtbar, dann an den Character attached und eben mit der Spielfigur synchronisiert. Damit die Rüstung auch am Körper bei den Animationen richtig ist.


    Vor allem auch für die Waffen wichtig, besonders bei den Nahkampfwaffen damit das mit dem ganzen Schadens-System und Colission funktioniert.