Schwertangriff. Wie am besten machen?

  • Hey,
    Ich erstelle gerade ein Schwert, das man als Nahkampfwaffe benutzen kann. Leider bin ich mir nicht sicher, wie ich das mit dem Schaden beim Angriff machen soll. Mir sind da jetzt zwei Ideen gekommen:

    • Im Schwert-BP ein Hit Event (oder OnCollision) erstellen. Jedes mal, wenn das ausgelöst wird, wird der Schaden an den getroffenen Character weitergeben
    • Jedes mal, wenn man die Taste für Schlagen drückt, wird die Animation ausgeführt und danach im Character BP ermittelt, ob ein Character vor einem steht und wenn ja Schaden zugefügt

    Mir sind da jedoch bei beiden Ideen Nachteile aufgefallen (z.B. der Character, der das Schwert ausgerüstet hat, löst selber das Event aus; ein Character kann an beiden Armen gleichzeitig von einem Schwert getroffen werden (wenn jedes Körperteil eine eigene Collision Box hat)||verschiedene Schwertlängen müssen jedes mal genau festgelegt werden; wenn zwei Leute vor einem dicht hintereinander stehen, kann es sein, dass der Hintere getroffen wird, der Vordere jedoch nicht)
    Ich habe leider kein gutes Tutorial für Schwerter o.ä. gefunden (nur welche in denen das Schwert fest im Skelett befestigt ist und nicht ausgetauscht werden kann und dann die 1. Möglichkeit von oben verwendet wird)
    Hat jmd ein Tutorial oder ne Idee, wie man das einigermaßen hinbekommen kann?

  • Also ich halte auf jeden Fall die erste Methode für sinnvoller.


    Sprich der Schwert-Klinge eine eine eigene Hitbox geben und dann per OnCollision oder BeginOverlap mit Cast to other Actor den Schaden weitergeben.


    Kann natürlich passieren, dass je nachdem wie groß die eigene Hitbox ist, der Character das selber auslöst, aber das kann man relativ einfach verhindern, im Zweifelsfall machst du bei hereinkommenden Schaden immer ne Abfrage, woher bzw. von welchem Actor der Schaden kommt und bei Self ignorierst du den Schaden halt.


    Wenn der andere Actor jetzt natürlich mehr als eine Hitbox hat, z.B. für verschiedene Körperteile, kann es natürlich zu der Situation kommen, dass ein Schwertstreich mehrere Hitboxen trifft und dann mehrmals Schaden macht. Spontan würde ich da glaube ich (abhängig davon, wie komplex dein Projekt ist) mit nem Timer arbeiten, sprich Einstellen, dass man von einem Actor nur einmal alle 3 Sekunden oder so Schaden kriegen kann. Wenn mit einem Schwerhieb 3 Hitboxen getroffen werden, registriert die erste den Schaden, schaltet auf "Schaden ignorieren" und die anderen beiden ignorieren den Schaden, und nach 3 Sekunden schaltet er dann wieder auf "Kann Schaden bekommen" und beim nächsten Hieb geht es von vorne los.


    Das klappt aber halt nur, wenn du keine schnell schießende Waffe im Spiel hast, die innerhalb von 3 Sekunden mehr als 1x Schaden machen kann.

  • Ich hatte jetzt erst Zeit das umzusetzen. Ich habe jetzt das Problem, dass die 1. Möglichkeit zu folgenden Problemen führt:

    • Performance Probleme, da das On Overlap mindestens 20 mal pro Sekunde ausgeführt wird (durch sich selber ausgelöst und dann durch ein Branch als Eigen-Schaden markiert --> kein Schaden)
    • Wenn man gar nicht schlägt, sondern nur gegen einen anderen Gegner läuft, wird es trotzdem ausgelöst

    Ich mach jetzt wohl doch die zweite Methode. Habe nur noch ne Frage: Wie kann ich ermitteln, ob ein Character (und wenn ja welcher) vor einem steht?

  • Es gibt auch dafür (wie fast immer) verschiedene Möglichkeiten.


    • (Würde ich versuchen) Line Trace by Channel
      Siehe hier. Da tracet du z.B. von der Camera und stellst ne niedrige Entfernung ein und über Break Hit Result → Hit actor gibt dir die das dann den ersten getroffenen Actor zurück, der vor dir steht. Relativ einfach zu bauen, wird aber nervig, wenn ein Schlag mal mehrere Gegner vor dir treffen soll.
    • Eine andere Möglichkeit wäre, ne eigene Hitbox "vor" dem Charakter zu machen und dann immer abzufragen, welche Actors grade mit der Hitbox vor deinem Charakter kollidieren. So kannst du den Schaden auch an mehrere Gegner weitergeben, die vor dir stehen.

    Grundsätzlich könntest du dich, weil es ja das Problem gibt, dass die Collision bzw. Overlap Events falsch auslösen, außerdem auch mit Collision Filtering auseinandersetzen (siehe hier). Du kannst in den Project Settings eigene Channel erstellen, da kannst du z.B. einen Channel "Waffe" erstellen und dann ganz genau auswählen, welche Actors reagieren sollen und welche ignorieren sollen.

  • Mach es am besten wie folgt:
    1. Du drückst eine Taste und die Animation für dein Schwert wird logischerweise ausgeführt.
    2. Dein Schwert hat ein Hit Event, sobald es also etwas berührt wird dieses ausgelöst.
    3. Im Hit ünerprüfst du ob das getroffene ein Character ist.
    4. Wenn ja hat er ein Physical Material? Kopf Schlag sofort Tod, Bauch nicht etc...damit kannst du solche Sachen machen.
    5. Apply Damage und der Gegner erhält Schaden.

  • @headrunner
    Ungefähr so hatte ich es gemacht. Da gab es die oben genannten Probleme

    • Performance Probleme, da das On Overlap mindestens 20 mal pro Sekunde ausgeführt wird (durch sich selber ausgelöst und dann durch ein Branch als Eigen-Schaden markiert --> kein Schaden)
    • Wenn man gar nicht schlägt, sondern nur gegen einen anderen Gegner läuft, wird es trotzdem ausgelöst
  • @headrunner
    Ungefähr so hatte ich es gemacht. Da gab es die oben genannten Probleme

    Du brauchst ein collision Preset was nur für die Waffe gilt und dort aud Overlap stellen.
    Bei Project Settings -> Collisions -> da ganz runter scrollen bei custom presets und dort entsprechend ein neues erstellen.
    Z.B. Collision Preset = Waffe mit Collision Responses (entsprechend vom Collision Object)


    Danach speichern, UE4 beenden und neu starten.



    Wie kann man am sinnvollsten eine Art Combo-System einbauen was sich einfach bedienen lässt und aufeinander aufbaut?
    Bei mehreren Angriffsanimationen usw. funktioniert das einfache System nicht mehr und ist meist auch recht anfällig.



    Schau dir hier die Bilder an.


    Hitbox: Welche Lösung ist die beste?


    Sweep Results -> HitActor mit dem Instigator im Branch überprüfen (Instigator ist grob gesagt dein Character, der dann die Waffe hält).
    Dadurch kann man sich selber nicht mehr Treffen!