Knochenbasierte Unity-2D-Animation Mecanim und Scripting

In dieser Serie konzentrieren wir uns auf die knochenbasierten 2D-Animationswerkzeuge der Unity Engine. Die Grundidee ist, die Grundlagen der 2D-Animation zu präsentieren und zu vermitteln, damit Sie sie auf Ihre eigenen Spiele anwenden können. In diesem Lernprogramm verwenden wir das hervorragende Mecanim-Tool von Unity, um Animationen zu mischen, und wir fügen einige einfache Skripts hinzu, um das Endergebnis zu demonstrieren.

Bevor wir mit dem Tutorial beginnen, möchten wir uns bei Chenguang (DragonBonesTeam) für die Bereitstellung der Game-Art bedanken, mit der diese Tutorial-Serie erstellt wurde.

Wo wir aufgehört haben

In den vorherigen Tutorials haben wir das Projekt eingerichtet, einen 2D-Drachencharakter zusammengestellt und drei verschiedene Animationen erstellt. Wenn Sie die vorherigen Tutorials noch nicht abgeschlossen haben, empfehlen wir Ihnen dringend, dies zu tun, bevor Sie fortfahren.

Endgültige Vorschau

Diese Demo zeigt den animierten Drachen, den wir treffen wollen Platz um es zum springen zu bringen:

Mecanim

An diesem Punkt haben Sie Ihren Drachen mit drei definierten Animationen komplett aufgebaut. Es besteht jedoch keine Verbindung zwischen ihnen. Unser erstes Ziel ist es also, die verschiedenen Animationsclips miteinander zu verbinden und sie miteinander zu verschmelzen. Zu diesem Zweck bietet Unity ein hervorragendes Werkzeug namens Mecanim, das genau das tut, was Sie brauchen.

Mecanim ist ein leistungsfähiges und flexibles Animationssystem. Da es in Unity integriert ist, ist keine Software von Drittanbietern erforderlich. Sie können alles leicht animieren, von Sprites über Formen oder sogar Lichter. Mit Mecanim können Sie Zustandsmaschinen erstellen und Bäume mischen, um Ihren Charakter zu steuern.

Bevor wir jedoch noch weiter gehen, sprechen wir ein wenig über das Mischen von Animationen und Zustandsautomaten, damit Sie ein besseres Verständnis für das bekommen, was wir tun werden.

Was ist eine Staatsmaschine??

In Unity können Sie zwei oder mehr ähnliche Bewegungen mischen. Zum Beispiel können Sie Lauf- und Gehanimationen abhängig von der aktuellen Geschwindigkeit des Charakters mischen. Grundsätzlich haben Sie zwei Möglichkeiten, Animationen in Unity zu überblenden. In einigen Situationen möchten Sie möglicherweise verwenden Übergänge; In anderen müssen Sie verwenden Bäume mischen:

  • Übergänge werden für den reibungslosen Übergang zwischen Animationen verwendet. Dies funktioniert normalerweise gut, wenn der Übergang schnell erfolgt.
  • Bäume mischen Mehrere Animationen lassen sich problemlos mischen, wobei Teile davon in unterschiedlichen Mengen enthalten sind. Diese Mengen werden durch numerische Parameter gesteuert. Um ein praktisches Beispiel zu geben, stellen Sie sich vor, wir hätten ein Shooter-Spiel; Vielleicht möchten Sie, dass der Charakter gleichzeitig feuert und rennt. Mit Mischbäumen können Sie die beiden Animationen zusammenfügen, sodass der Charakter gleichzeitig laufen und schießen kann, ohne dass eine dritte Animation für diese bestimmte Mischung von Aktionen erstellt werden muss.

Eine Zustandsmaschine speichert den Zustand einer Entität zu einem bestimmten Zeitpunkt und kann auf eine Eingabe reagieren, um den Zustand dieser Entität zu ändern oder eine Aktion oder Ausgabe auszulösen. Weitere Informationen finden Sie unter Finite-State-Maschinen: Theorie und Implementierung.

In Unity verwenden Sie Statusmaschinen, um den Status der Charaktere des Spiels zu steuern. Zum Beispiel könnte ein Zustand für ein Zeichen sein Gehen, und ein anderer könnte sein Springen. Der Charakter kann sich vom ändern Gehen Zustand zum Springen Zustand basierend auf der Eingabe des Players (wahrscheinlich Drücken der Jump-Taste). 

Hier finden Sie ein Beispiel für eine (komplexere) Zustandsmaschine aus der Unity-Dokumentation. Jedes Feld stellt einen Zustand dar und die Pfeile repräsentieren mögliche Übergänge zwischen ihnen:

Wir erstellen eine Zustandsmaschine mit unseren vorhandenen Animationen und verwenden dann Übergänge, um sie miteinander zu verschmelzen.

Unsere Staatsmaschine bauen

Wenn Sie das überprüfen Animationen Ordner, in dem Sie Ihre gespeichert haben .anim Dateien finden Sie eine Dragon Controller Datei. Dies ist die Mecanim-Datei, die dem Charakter zugeordnet ist, den Unity beim Speichern der ersten Animation automatisch generiert hat.

Doppelklicken Sie auf das Dragon Controller Datei und Unity öffnet eine Animator Ansichtsregisterkarte neben Ihrem Szene und Spiel Registerkarten.

Wie Sie sehen, fügte Unity der Datei bereits drei Animationen hinzu. Da die Animationen bereits vorhanden sind, müssen Sie sie nicht hinzufügen. Wenn Sie dem Controller jedoch eine zusätzliche Animation hinzufügen möchten, müssen Sie nur die. Ziehen .anim Datei an die Animator Aussicht. Wenn Sie eine vorhandene Animation aus dem Controller entfernen möchten, sollten Sie auf die gleiche Weise auswählen Animator anzeigen und drücken Löschen. Fühlen Sie sich frei, dies selbst auszuprobieren.

Wir haben vier verschiedene Boxen in der Animator:

  • Jeder Staat
  • Im Leerlauf
  • Springen
  • Fallen

Jeder Staat ist der Standardzustand, den mecanim erstellt, und Sie werden ihn nicht verwenden. Sie können es in jede Ecke des Fensters ziehen Animator Fenster und lass es dort.

Die anderen drei Felder beziehen sich auf die drei Animationen, die wir erstellt haben. Wie Sie vielleicht bemerken, Im Leerlauf ist orange gefärbt, während die beiden anderen grau sind. Das ist, weil Im Leerlauf ist die Grundanimation; Es ist die Animation, die der Charakter standardmäßig abspielen soll. Wenn Sie die Wiedergabetaste Ihres Editors drücken und testen, werden Sie feststellen, dass der Charakter dies tut Im Leerlauf Animation. In diesem speziellen Fall ist genau das Verhalten, das wir wollen; wenn Sie jedoch wollen, sagen Sie das Fallen Wenn Sie die Animation als Stammanimation verwenden möchten, klicken Sie mit der rechten Maustaste darauf Als Standard einstellen.

Wie Sie sehen können, die Fallen Animation ist jetzt orange und die Im Leerlauf ist grau.

Da willst du Im Leerlauf Um die Stammanimation zu sein, wiederholen Sie einfach den Vorgang, um ihn wieder orange zu machen.

Es ist jetzt Zeit, die Animationen zu verbinden. Rechtsklick Im Leerlauf und wählen Sie Übergang machen.

Dadurch wird ein kleiner Pfeil erstellt, der mit beginnt Im Leerlauf. Klicke auf das Springen Animation, damit der Pfeil die beiden Animationen verbindet.

Wenn Sie den soeben erstellten Pfeil auswählen, werden die neuen Eigenschaften im angezeigt Inspektor Tab.

Wie Sie sehen, haben Sie eine Zeitleiste und die Animationen Im Leerlauf und Springen. Es gibt ein blaues Band über den Animationen, das beginnt Im Leerlauf ändert sich dann aber zu Springen. Außerdem gibt es einen Zeitraum, in dem sich die beiden Animationen überlappen.

Seit der Vorschau Bereich ist leer, auch wenn Sie auf die Wiedergabeschaltfläche über der Vorschau klicken, können Sie nicht sehen, was passiert.

Um eine Vorschau des Übergangs anzuzeigen, an dem Sie gerade arbeiten, wählen Sie einfach die Option Drachen Spielobjekt aus dem Hierarchie Tab und ziehen Sie es auf die Vorschau Bereich. Jetzt können Sie den Charakter in der Vorschau sehen. Wenn Sie auf Play drücken, können Sie den Übergang zwischen den beiden Animationen sehen.

In dem Inspektor, der Bereich, in dem sich das blaue Band ändert Im Leerlauf zu Springen ist unser Übergang:

Sie können die Übergänge bearbeiten, indem Sie die zwei blauen Pfeile auf der Timeline ziehen, die den Übergangsbereich begrenzen. Durch Ändern der Position können Sie den Übergang schneller oder weicher machen.

Als nächstes müssen Sie definieren wann Sie möchten, dass dieser Übergang stattfindet. Erstellen Sie dazu einen neuen Parameter, indem Sie auf klicken + anmelden in der Parameter Liste.

Als nächstes wählen Sie die Schweben Option und nennen Sie es VerticalMovement:

Gehen Sie jetzt zurück zum Inspektor, und unter Bedingungen Die Variable VerticalMovement wird sich zeigen. Wählen Sie es aus.

Sie haben gerade die Bedingung definiert, um festzulegen, wann der Status in der Zustandsmaschine geändert werden soll: wenn der Wert von VerticalMovement ist größer als 0, dann startet der Charakter die Springen Animation. 

Wir wollen auch einen Übergang zwischen dem Springen Animation und die Fallen Animation:

Der Maximalwert der VerticalMovement wird zu erreichen ist 1, also für den Übergang zwischen Springen und Fallen, Wir können es aktivieren, wenn dieser Wert kleiner als ist 0,5.

Jetzt müssen wir den Charakter zum zurückkehren lassen Im Leerlauf Animation nach dem Herbst. Schon seit Im Leerlauf Wenn der Charakter gerade auf dem Boden ist, sollten Sie eine Überblendung schaffen Fallen und Im Leerlauf.

Zum Abschluss müssen Sie sicherstellen, dass sie aktiviert wird, wenn sich die Figur auf dem Boden befindet. Sie können dies tun, indem Sie den Übergangsparameter von einstellen VerticalMovement zu weniger als 0,1-das bedeutet im Grunde, dass die VerticalMovement ist 0, was bedeutet, dass der Charakter am Boden ist.

Wir müssen jetzt sicherstellen, dass wir keine sehen Im Leerlauf Animationen, während sich der Charakter in der Luft befindet Springen und Fallen Animationen. Erstellen Sie dazu einen neuen Parameter, diesmal a Bool.

Nennen Auf dem Boden.

Wählen Sie den Übergang zwischen Springen und Fallen. Sie möchten, dass dieser Übergang stattfindet, wenn der Charakter noch in der Luft ist, richtig? Also geh zum Inspektor, drücke den +, und fügen Sie dem Übergang einen neuen Parameter hinzu. Grundsätzlich soll dies geschehen, wenn der Wert von Auf dem Boden ist falsch.

Als nächstes über den Übergang von Fallen zu Im Leerlauf, fügen Sie den Parameter hinzu Auf dem Boden und setzen Sie den Wert auf wahr:

Unsere Arbeit mit Mecanim ist beendet. Nun ist es an der Zeit, mit dem Scripting zu beginnen.

Scripting-Animationen

Erstellen Sie in Ihrem Asset-Verzeichnis einen neuen Ordner mit dem Namen Skripte. Als Nächstes erstellen Sie ein neues C # -Skript mit dem Namen CharacterMove.cs. Beachten Sie, dass das Skript, das Sie gerade erstellen, ein sehr einfaches ist. Das Hauptziel besteht darin, zu zeigen, wie Sie die Animationen des Charakters anhand des Codes ändern können. 

Am besten verwenden Sie die Physik von Unity, wenn Sie robuste Spiele erstellen möchten. Zur Vereinfachung und zum Verständnis erstellen wir jedoch eine kleine Simulation.

Erstellen Sie vier Variablen im Skript: eine als Referenz für die Animator eine andere für die Fallgeschwindigkeit, eine dritte für die vertikale Bewegung und ein Flag, um zu prüfen, ob sich der Charakter auf dem Boden befindet.

öffentliche Klasse CharacterMove: MonoBehaviour // Variablen public Animator anim; // Aktualisierung des privaten Float des Animators fallSpeed; // Die Geschwindigkeit, mit der der Charakter fällt private float verticalMovement; // Der Betrag der vertikalen Bewegung private bool onGround; // Flag, um zu prüfen, ob sich der Charakter am Boden befindet

In dem Start() Methode, müssen Sie sicherstellen, dass die Geschwindigkeit auf eingestellt ist 0,03 (oder welcher andere Wert Sie für Ihre Animationen halten) und dass der Charakter geerdet ist.

void Start () // Der Charakter beginnt am Boden onGround = true; // Setze die Fallgeschwindigkeit fallSpeed ​​= 0.03f; 

Nun auf der Aktualisieren() Methode gibt es mehrere Dinge, die Sie überprüfen müssen. Zuerst müssen Sie feststellen, wann die Leertaste wird gedrückt, um den Charakter zu springen. Wenn Sie die Taste drücken, stellen Sie die vertikale Bewegung auf 1 und das auf dem Boden Flagge zu falsch.

void Update () // Wenn die Leertaste gedrückt wird und sich das Zeichen auf dem Boden befindet, wenn (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false; 

Was passiert wenn der Leertaste wird nicht gedrückt? Nun, Sie müssen überprüfen, ob sich der Charakter in der Luft befindet und seine vertikale Bewegung größer ist als 0; Wenn ja, müssen Sie die vertikale Bewegung reduzieren, indem Sie die Fallgeschwindigkeit abziehen.

void Update () // Wenn die Leertaste gedrückt wird und sich das Zeichen auf dem Boden befindet, wenn (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;  else // Prüfen Sie, ob sich das Zeichen in der Luft befindet und die Vertikalbewegung größer als 0 ist, wenn (onGround == false && verticalMovement> 0) // Vertikalbewegung reduzieren verticalMovement - = fallSpeed; 

Wie Sie sich erinnern, einmal verticalMovement fällt unter 0,5, das Fallen Die Animation wird abgespielt. 

Wir wollen jedoch nicht subtrahieren FallSpeed von verticalMovement für immer, da der Charakter irgendwann landen wird. Wenn der vertikale Bewegungswert gleich oder kleiner als ist 0, Wir werden sagen, dass der Charakter den Boden berührt hat.

void Update () // Wenn die Leertaste gedrückt wird und sich das Zeichen auf dem Boden befindet, wenn (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;  else // Prüfen Sie, ob sich das Zeichen in der Luft befindet und die Vertikalbewegung größer als 0 ist, wenn (onGround == false && verticalMovement> 0) // Vertikalbewegung reduzieren verticalMovement - = FallSpeed ​​// Wenn die Vertikalbewegung kleiner ist oder gleich 0 ist das Zeichen auf dem Boden if (verticalMovement < 0)  verticalMovement = 0; onGround = true;    

Um das zu beenden Aktualisieren() Methode müssen Sie die Werte von übergeben verticalMovement und auf dem Boden zum Animator Komponente:

void Update () // Wenn die Leertaste gedrückt wird und sich das Zeichen auf dem Boden befindet, wenn (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;  else // Prüfen Sie, ob sich das Zeichen in der Luft befindet und die Vertikalbewegung größer als 0 ist, wenn (onGround == false && verticalMovement> 0) // Vertikalbewegung reduzieren verticalMovement - = fallSpeed; // Wenn die vertikale Bewegung kleiner oder gleich 0 ist, steht das Zeichen if (verticalMovement) < 0)  verticalMovement = 0; onGround = true;    // Update the animator variables anim.SetFloat("VerticalMovement", verticalMovement); anim.SetBool("OnGround", onGround); 

Das Skript ist fertig. Jetzt müssen Sie es dem hinzufügen Drachen Spielobjekt und fügen Sie den Verweis auf die Animator Komponente. Ziehen Sie dazu nach dem Hinzufügen des Skripts die Animator zum richtigen Feld im Skript.

Wenn Sie auf Play drücken und es testen, sollten sich die Animationen wie gewünscht ändern. Der Drache fängt an Im Leerlauf, aber einmal drücken Sie die Leertaste es wird Springen und dann fange an zu spielen Fallen Animation, bevor Sie zurückkehren Im Leerlauf.

Externe Werkzeuge und Technologien

Obwohl in dieser Tutorialserie nur die Standardwerkzeuge von Unity verwendet wurden, gibt es im Unity Asset Store viele großartige 2D-Tools, mit denen Sie diesen Prozess noch einfacher und schneller machen können. Zwei gute Beispiele sind Smooth Moves und Puppet 2D, mit denen Sie die Zeichen, die Hierarchie und die Animationen auf intuitive und einfache Weise definieren können. 

Plug-Ins wie diese bieten einige Extras, wie z. B. die Möglichkeit, 2D- "Knochen" hinzuzufügen, was den gesamten Animationsprozess vereinfacht und die Deformationen realistischer macht. Wenn Sie 2D-Animationen mit mehreren Detaillierungsgraden verwenden möchten, empfehlen wir Ihnen dringend, diese Plugins zu überprüfen.

Fazit

Damit ist unsere Tutorialreihe zum Erstellen einer knochenbasierten 2D-Animation mit Unity abgeschlossen. Wir haben in dieser kurzen Serie eine Menge Bodenarbeit gemacht, und Sie sollten jetzt genug wissen, um mit Ihren 2D-Animationen zu beginnen. Wenn Sie Fragen oder Kommentare haben, schreiben Sie uns bitte eine Zeile in die Kommentare.

Verweise

  • Drachen-Sprite-Sheet: Wird mit Genehmigung von Chenguang vom DragonBonesTeam verwendet