Gute Techniken zum Synchronisieren von Gameplay-Aktionen mit bestimmten Animationszeiten?

10

Ich bin also auf ein Problem in dem Spiel gestoßen, an dem ich arbeite, aber es scheint eine ziemlich grundlegende Sache zu sein, die wahrscheinlich in vielen Spielen auftaucht.

Mein Spiel erfordert, dass einige Gameplay-Funktionen zu einem bestimmten Zeitpunkt während einer Charakteranimation ausgeführt werden. Wie der Titel schon sagt, frage ich mich, welche guten Techniken und grundlegenden Strategien es gibt, um spielbezogene Ereignisse / Funktionen / Aktionen mit bestimmten Punkten in der Animation eines Charakters zu synchronisieren.

Hier sind einige einfache Beispiele dafür, worüber ich in verschiedenen Arten von Spielen spreche:

  • Dein Charakter lädt seine Waffe in einem Schützen nach . Ihr Charakter spielt seine "Reload" -Animation ab, aber es ist wichtig, dass die Funktion zum Festlegen der currentAmmo-Variablen nur genau zu dem Zeitpunkt aufgerufen wird, nachdem das Magazin ausgetauscht und die Waffe gespannt wurde. Dies kann irgendwann in der Mitte der Reload-Animation sein.

  • In einem rundenbasierten Rollenspiel stehen deine Charaktere in einer Linie vor einer Reihe von Feinden. Wenn einer Ihrer Charaktere zum Angriff aufgefordert wird, rennt / springt einer Ihrer Charaktere auf einen der Feinde zu und zerschlägt sein Riesenschwert, bevor er zu seinem Stehplatz zurückläuft / springt. Sie möchten sicherstellen, dass der Feind genau in dem Moment beschädigt wird, in dem die Slashing-Animation abgespielt wird - irgendwann zwischen Hochlaufen und Zurücklaufen.

  • In einem Stealth-Spiel kann sich Ihr Charakter an Computer und Schaltflächen in der Welt anschleichen und mit ihnen interagieren. Möglicherweise gibt es einen Knopf, der die Stromversorgung der Lichter des Außenpostens, den Sie infiltrieren, ausschaltet. Wenn der Aktionsknopf gedrückt wird, streckt Ihr Charakter die Hand aus und drückt den Knopf und kehrt dann zu seiner Leerlaufhaltung zurück. Sie möchten, dass die Lichter genau an der Stelle in der Animation 'push_button' ausgeschaltet werden, wenn die Taste gedrückt wird.

Zugegeben, mein spezieller Fall ähnelt am ehesten dem zweiten Beispiel , in dem ich eine Animation erstellt habe, in der mein rundenbasierter Charakter während eines Angriffs nach vorne springt und ich möchte, dass der Schaden genau in dem Moment angewendet wird, in dem die Animation Kontakt aufzunehmen scheint . Da mein Spiel ein rundenbasiertes System verwendet (stellen Sie sich etwas wie Final Fantasy oder Fire Emblem vor), möchte ich den Schaden / die Heilung / die Magie / etc. Wird zur richtigen Zeit während jeder Charakteranimation angewendet, obwohl ich eigentlich keine Kollisions- / Hitboxen verwende.

Ich sollte erwähnen , dass ich mein Spiel in einem beliebten Spiel - Engine mache, und dass jetzt ich dies Handhabung durch ihre Animation mit Ereignissen oder benachrichtigt etwas in der Nähe der gewünschten Ergebnisse zu erzielen - mein Charakter führt einen bestimmten Befehl und Trigger ein Die befehlsspezifische Animation (dh: 'attack_command') und die Animations-Assets für jeden meiner Befehle müssen ein Animationsereignis enthalten / 'Rückruf' in die ExecuteCommand-Funktion meiner Charaktere benachrichtigen. Mit anderen Worten - der Charakter weist die Angriffsanimation an, abgespielt zu werden, und dann sendet die Angriffsanimation einen Ereignis- / Benachrichtigungsrückruf an den Charakter genau zu dem Zeitpunkt während der Animation, an dem der Schaden verursacht werden soll.

Ehrlich gesagt funktioniert das jetzt, aber es fühlt sich einfach falsch an - als würde mir hier ein Teil des Gesamtbildes fehlen! Ein Grund dafür, dass sich diese Methode falsch anfühlt, ist, dass sie die Spielelogik mit den Animationsressourcen koppelt. Wenn mein Animations-Asset vergisst, ein ExecuteCommand () -Ereignis / einen Rückruf einzuschließen, wird der Befehl nicht ordnungsgemäß ausgeführt, und es wird zusätzlicher Code benötigt, um zu überprüfen, ob eine Befehlsanimation beendet wurde, ohne den Befehl auszuführen. Es ist chaotisch und bedeutet, dass mein Gameplay eine seltsame Abhängigkeit von seinen Assets hat. Natürlich möchte ich, dass der Schaden an einem bestimmten Punkt während meiner Angriffsanimation auftritt, aber ich finde es wirklich komisch, Gameplay-Code in Animations-Assets aufzurufen.

Was übersehe ich hier? Was sind einige gute allgemeine Techniken für den Umgang mit solchen Situationen, in denen bestimmte wichtige Spielaktionen zu bestimmten Zeiten während der Animationen ausgeführt werden sollen?

Bearbeiten: Zur Verdeutlichung ist dies weder eine motorspezifische Frage noch suche ich nach motorspezifischen Designs / Techniken. Ich interessiere mich für allgemeine Animations- / Gameplay-Synchronisationstechniken, die Sie in Ihren Spielprojekten unabhängig von den verwendeten Technologien verwenden können.

MrKatSwordfish
quelle
1
Ich bin verwirrt. Sie möchten, dass das Gameplay von den Animationszeiten abhängt, möchten aber nicht, dass Ihr Gameplay von Ihren Assets abhängt, und Animationen sind eine Art Asset. Wie erwarten Sie, dass diese Wünsche kompatibel sind?
Anko
Ich möchte, dass einige Gameplay-Elemente mit der Animation synchronisiert werden. Die Synchronisation zwischen zwei Dingen impliziert jedoch nicht immer eine Abhängigkeit, oder? Ich interessiere mich für einige Techniken, mit denen Leute ihre Animationen mit ihrem Gameplay synchronisieren. Ich sagte, was ich versucht habe und was ich derzeit tue, um dies zu erreichen - und meine Frage ist, ob es eine andere / bessere / alternative Technik gibt, die man verwenden könnte, oder ist dies (Animationsereignisse / Benachrichtigungen / Rückrufe, die in das eingebrannt sind) Vermögenswerte) der Standardweg? Verwenden Sie das in Ihren Projekten?
MrKatSwordfish

Antworten:

5

Für die Synchronisation müssen Sie entscheiden, wer (Ihr Code, Ihre Animationen oder keine) die Timing-Autorität ist - der "Beat", zu dem alle anderen "tanzen".

Unterschiedliche Arrangements passen zu unterschiedlichen Spielen:

  • Animationen sind die Timing-Autorität (Ihr aktuelles Setup)

    Der Spielcode kann Animationen auslösen. Wenn Animationen bestimmte Punkte erreichen, lösen sie Ereignisse aus (z. B. Nachladen erfolgt), auf die der Spielcode möglicherweise reagiert (z. B. Zurücksetzen der verfügbaren Munition).

    Wenn das genaue Timing von Animationen (unabhängig vom Spielstatus) ein wichtiger Teil Ihres Spiels ist oder Sie möchten, dass Ihre Animatoren das Timing steuern, ziehen Sie diesen Ansatz in Betracht.

    Mit den Animationswerkzeugen Blender (3D) und Spine (2D) kann der Animator Ereignisse definieren, die der Spielcode abonnieren kann.

  • Code ist die Timing-Autorität

    Umgekehrt zu den oben genannten Ereignissen: Ereignisse in der Spielwelt (z. B. der Spieler, der seine Waffe neu lädt) führen dazu, dass Animationen ausgeführt und Parameter übergeben werden (z. B. Zeit bis zum Abschluss des Neuladens). Jede Animation verwendet die angegebenen Parameter, um das Aussehen zu ändern (z. B. Ausführen der Animation mit einer angemessenen Geschwindigkeit, sodass der "neu geladene Teil" bei Angabe erfolgt).

    Animationen warten möglicherweise auch auf Spielereignisse (z. B. bricht der Spieler das Nachladen ab oder duckt sich beim Nachladen in die Hocke) und ändern ihr Aussehen entsprechend.

    Wenn es sich Ihre Animationen leisten können, das Timing flexibel zu gestalten, Ihr Spiel stark von prozedural generierten Inhalten abhängt oder wenn Sie speziell möchten, dass Ihre Programmierer das Timing steuern, sollten Sie diesen Ansatz in Betracht ziehen.

    Die Charakteranimationen von Overgrowth sind weitgehend so strukturiert: David Rosen erklärt dies in seinem GDC 14-Vortrag (siehe speziell dieSegmente Bewegung und Bewegung Fortsetzung ).

  • Implizites Timing (externe Autorität)

    In Rhythmus-Spielen oder anderen Situationen, in denen das Timing von einer externen Quelle aus gesteuert wird (in Rhythmus-Spielen der Takt des Musiktitels), kann es sinnvoll sein, Dinge als solche zu modellieren. Der Spielcode und die Animationen können sowohl einen globalen Zeitstempel als auch einen Spielstatus lesen und sich dann ohne Kommunikation entsprechend verhalten.

    Wenn Ihr Spielstatus und Ihre Animationen weitgehend von einer externen Zeitsteuerungsbehörde abhängen, sollten Sie diesen Ansatz in Betracht ziehen.

Möglicherweise möchten Sie natürlich unterschiedliche Ansätze für unterschiedliche Systeme in Ihrem Spiel verwenden. (Beispielsweise verwenden Rhythmus-Spiele häufig den Takt des Songs als externe Autorität, aber Animationen hören immer noch auf Interaktionsereignisse der Spieler, um das Aussehen gehaltener Noten abzubrechen oder zu ändern.)

Anko
quelle
0

Ich habe irgendwo gelesen, dass fast alle Rechenprobleme mit einer zusätzlichen Abstraktionsschicht gelöst werden können, und ich sehe Ihren Fall nicht anders.

Für diese Anforderung sehe ich im Allgemeinen eine Ebene, um den Status des Charakters zu steuern. Auf diese Weise hat der Charakter eine aktuelle Animation und einen aktuellen Status. Jeder mit seiner eigenen Verantwortung.

Die Animation ist nur für das Visuelle verantwortlich, und der Status verwaltet die spielspezifische Logik für diese Aktion.

In meinem Kampfspiel ist der Status ein Objekt, das von der BaseState-Klasse erbt und über eine Update () -Methode verfügt. Jedes Zeichen verfügt über eine Sammlung von Status, es kann jedoch jeweils nur einer zugewiesen werden. Die Update () -Methode des aktuellen Status wird einmal pro Frame aufgerufen.

Es befindet sich im Update () des Status, in dem ich all diese Logik mache: Stellen Sie die Geschwindigkeit des Zeichens auf einen bestimmten Frame ein, erhöhen / verringern Sie den Zustand usw.

Emir Lima
quelle