În această serie, ne concentrăm asupra instrumentelor de animație 2D bazate pe os, furnizate de motorul Unity. Ideea principală este de a prezenta și de a preda fundamentele animației 2D pentru a le aplica la propriile jocuri. În acest tutorial, vom folosi instrumentul excelent Mecanim al Unity pentru a îmbina animațiile și vom adăuga câteva script-uri simple pentru a demonstra rezultatul final.
Înainte de a începe tutorialul, dorim să-i mulțumim lui Chenguang (DragonBonesTeam) că ne-a oferit arta jocului folosită pentru a produce această serie de tutori.
În tutorialele anterioare, am creat proiectul, am asamblat un personaj dragon 2D și am creat trei animații diferite. Dacă nu ați terminat încă tutorialele anterioare, vă recomandăm să faceți acest lucru înainte de a continua.
Această demonstrație arată dragonul animat pe care-l ținem pentru lovit Spaţiu pentru a face să sară:
În acest moment, aveți dragonul complet asamblat cu trei animații definite. Cu toate acestea, nu există nicio legătură între ele. Deci, obiectivul nostru inițial este să conectăm diferitele clipuri de animație și să le îmbinăm împreună. Pentru aceasta, Unity oferă un instrument minunat numit Mecanim care face exact ceea ce aveți nevoie.
Mecanim este un sistem de animație puternic și flexibil. Deoarece este integrat cu Unity în sine, nu este nevoie de software terță parte. Puteți anima cu ușurință orice, de la sprite la forme de amestec sau chiar lumini. Mecanim vă permite să creați mașini de stat și să amestecați copaci pentru a vă controla caracterul.
Dar, înainte de a merge mai departe, să vorbim puțin despre amestecarea animațiilor și a mașinilor de stat, astfel încât să aveți o mai bună înțelegere a ceea ce vom face.
În Unitate, puteți amesteca două sau mai multe mișcări similare - de exemplu, este posibil să doriți să îmbinați animațiile de rulare și de mers pe jos în funcție de viteza actuală a personajului. Practic, aveți două moduri diferite de a îmbina animațiile în Unitate. În unele situații, poate doriți să utilizați tranziţii; în altele, va trebui să le utilizați Amestecati Copacii:
O mașină de stat stochează starea unei entități la un moment dat și poate reacționa la o intrare pentru a schimba starea acelei entități sau pentru a provoca o acțiune sau ieșire. Pentru mai multe informații, consultați Masini de stat finite: teorie și implementare.
În Unitate, folosiți mașini de stat pentru a controla starea personajelor jocului. De exemplu, ar putea fi o stare pentru un personaj Mers pe jos
, și altul ar putea fi A sari
. Personajul se poate schimba de la Mers pe jos
de stat la A sari
stat bazat pe intrarea jucătorului (probabil prin apăsarea butonului Jump).
Aici puteți vedea un exemplu de mașină de stat (mai complexă) din documentația Unity. Fiecare casetă reprezintă o stare, iar săgețile reprezintă posibile tranziții între ele:
Vom crea o mașină de stat cu animațiile existente, apoi vom folosi tranziții pentru a le îmbina împreună.
Dacă bifați Animații dosarul pe care l-ați salvat .anim
fișiere, veți găsi a Dragon.controller
fişier. Acesta este fișierul mecanim asociat cu caracterul pe care Unitatea la generat automat atunci când ați salvat prima animație.
Faceți dublu clic pe Dragon.controller
fișier, iar Unity va deschide un fișier animator vizualizați fila de lângă Scenă și Joc file.
După cum puteți vedea, Unity a adăugat deja cele trei animații în fișier. Din moment ce animațiile sunt deja în vigoare, nu este nevoie să le adăugați, dar, dacă doriți să adăugați o animație suplimentară la controler, tot ce trebuie să faceți este să trageți .anim
fișier la animator vedere. În același mod, dacă doriți să eliminați o animație existentă de la controler, trebuie doar să selectați animator vizualizați și apăsați Șterge. Simțiți-vă liber să încercați acest lucru pentru dvs..
Avem patru cutii diferite în animator:
Orice stat este starea implicită pe care mecanim-ul o creează și nu o veți folosi. Puteți să-l trageți în orice colț al animator fereastră și lăsați-o acolo.
Celelalte trei casete se referă la cele trei animații pe care le-am creat. Așa cum ați putea observa, Inactiv este colorat cu portocaliu, în timp ce celelalte două sunt gri. Asta este pentru ca Inactiv este animația rădăcinilor; este animația pe care personajul o va juca în mod implicit. Dacă apăsați pe butonul de redare din editorul dvs. și îl testați, veți vedea că personajul face acest lucru Inactiv animaţie. În acest caz special, acesta este exact comportamentul pe care îl dorim; cu toate acestea, dacă ați vrut, să zicem, cădea animație pentru a fi animația rădăcină, tot ce trebuie să faceți este să faceți clic dreapta pe ea Setați ca prestabilit.
După cum puteți vedea, cădea animația este acum portocalie și Inactiv este gri.
De când vrei Inactiv pentru a fi animația rădăcinilor, repetați procesul pentru al face din nou portocaliu.
Acum este momentul să conectați animațiile. Click dreapta Inactiv și selectați Faceți tranziția.
Aceasta va crea o săgeată mică care începe de la Inactiv. Faceți clic pe A sari animație pentru a face săgeata conectați cele două animații.
Dacă selectați săgeata pe care tocmai ați creat-o, veți vedea că proprietățile noi apar în Inspector fila.
După cum puteți vedea, aveți o linie de timp și animațiile Inactiv și A sari. Există o bandă albastră peste animațiile care încep Inactiv dar apoi se schimbă la A sari. De asemenea, există o perioadă în timp în care cele două animații se suprapun.
Din moment ce previzualizare zona este goală, chiar dacă faceți clic pe butonul de redare peste previzualizare, nu puteți vedea ce se întâmplă.
Pentru a previzualiza tranziția pe care lucrați, trebuie doar să selectați balaur obiect de joc de la Ierarhie și trageți - o în previzualizare zonă. Acum puteți vedea caracterul în previzualizare și, dacă apăsați redarea, puteți vedea tranziția dintre cele două animații.
În Inspector, zona în care se modifică banda albastră Inactiv la A sari este tranziția noastră:
Puteți edita tranzițiile prin glisarea celor două săgeți albastre de pe cronologia care limitează zona de tranziție. Schimbând poziția lor, puteți face tranziția mai rapidă sau mai ușoară.
Următorul lucru pe care trebuie să-l faceți este să definiți cand vrei ca această tranziție să se întâmple. Pentru a face acest lucru, creați un nou parametru făcând clic pe + semnați în Parametrii listă.
Apoi, selectați Pluti și optați-l VerticalMovement
:
Acum, du-te înapoi la Inspector, și sub Condiții variabila VerticalMovement
va apărea. Selectați-l.
Tocmai ați definit condiția pentru a determina când să schimbați starea în aparatul de stare: dacă valoarea VerticalMovement
este mai mare decât 0
, atunci caracterul va porni A sari animaţie.
De asemenea, dorim o tranziție între A sari animație și cădea animaţie:
Valoarea maximă VerticalMovement
va ajunge este 1
, astfel încât, pentru tranziția între A sari și cădea, îl putem activa atunci când această valoare este mai mică decât 0.5
.
Acum trebuie să facem ca personajul să revină la Inactiv animație după cădere. De cand Inactiv ar trebui să se joace atunci când personajul este pe podea, ar trebui să creați o tranziție între cădea și Inactiv.
Pentru a termina, trebuie să vă asigurați că se activează atunci când caracterul este la sol. Puteți face acest lucru setând parametrul de tranziție din VerticalMovement
la mai puțin decât 0.1
-înseamnă că în principiu VerticalMovement
este 0
, ceea ce înseamnă că personajul este pe teren.
Acum trebuie să ne asigurăm că nu vedem nimic Inactiv animații în timp ce caracterul este în aer între A sari și cădea animații. Pentru a face acest lucru, creați un nou parametru, de data aceasta a bool.
Sună-l Pe pamant
.
Selectați tranziția între A sari și cădea. Vrei ca această tranziție să se întâmple când personajul e încă în aer, nu? Deci du-te la Inspector, apasă pe +, și adăugați un nou parametru la tranziție. Practic, vrei ca acest lucru să se întâmple atunci când valoarea lui Pe pamant
este fals
.
Apoi, la trecerea de la cădea la Inactiv, adăugați parametrul Pe pamant
și setați valoarea la Adevărat
:
Munca noastră cu Mecanim se face. Acum este momentul să treceți la scripting.
În directorul de materiale, creați un folder nou numit Scripturi
. Apoi, creați un nou script C # numit CharacterMove.cs
. Rețineți că scriptul pe care urmează să-l creați este unul foarte simplu, care are scopul principal de a arăta cum puteți modifica animațiile personajului prin cod.
Cea mai bună practică este folosirea fizicii Unity atunci când doriți să creați jocuri robuste. Cu toate acestea, pentru simplitate și înțelegere, vom crea doar o mică simulare.
Creați patru variabile în script: una pentru a face referire la animator componentă, altul pentru viteza căderii, oa treia pentru cantitatea de mișcare verticală și un steag pentru a verifica dacă caracterul se află pe teren.
clasa publică CharacterMove: MonoBehavior // Variables public Animator anim; // Refrerence la animator private float fallSpeed; // Viteza caracterului cade vertical float privat; // Cantitatea de mișcare verticală privată bool onGround; / / Flag pentru a verifica dacă personajul se află la sol
În Start()
, trebuie să vă asigurați că viteza este setată la 0,03
(sau orice altă valoare pe care o considerați potrivită pentru animațiile dvs.) și că personajul este împământat.
void Start () // Caracterul începe pe terenulGround = true; // Setați viteza de cădere fallSpeed = 0.03f;
Acum, pe Actualizați()
există mai multe lucruri pe care trebuie să le verificați. În primul rând, trebuie să detectați când Space Bar este apăsat, pentru a face saltul caracterului. Când este apăsat, setați mișcarea verticală la 1
si pe pamant
pavilion la fals
.
void Update () // Dacă bara de spațiu este apăsată și caracterul este pe pământ dacă (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;
Ce se întâmplă atunci când Space Bar nu este presat? Ei bine, trebuie să verificați dacă caracterul este în aer și mișcarea verticală este mai mare decât 0
; dacă este așa, trebuie să reduceți mișcarea verticală scăzând viteza de cădere.
void Update () // Dacă bara de spațiu este apăsată și caracterul este pe pământ dacă (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false; altfel // Verificați dacă caracterul este în aer și mișcarea verticală este mai mare decât 0 dacă (onGround == false && verticalMovement> 0) // Reduceți verticalitatea deplasării verticalMovement - = fallSpeed;
După cum vă veți aminti, odată verticalMovement
picături mai jos 0.5
, cădea animația va începe să se joace.
Cu toate acestea, nu vrem să scădem fallSpeed
din verticalMovement
pentru totdeauna, deoarece caracterul va ateriza la un moment dat. Dacă valoarea de deplasare verticală este egală cu sau mai mică decât 0
, vom spune că înseamnă că personajul a lovit terenul.
void Update () // Dacă bara de spațiu este apăsată și caracterul este pe pământ dacă (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false; altfel // Verificați dacă caracterul este în aer și mișcarea verticală este mai mare de 0 dacă (onGround == false & & verticalMovement> 0) // Reduce vertical motionMovement - = fallSpeed // Dacă mișcarea verticală este mai mică sau egal cu 0, caracterul este pe podea dacă (verticalMovement < 0) verticalMovement = 0; onGround = true;
Pentru a termina Actualizați()
metoda, trebuie să treci valorile verticalMovement
și pe pamant
la animator componente:
void Update () // Dacă bara de spațiu este apăsată și caracterul este pe pământ dacă (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false; altfel // Verificați dacă caracterul este în aer și mișcarea verticală este mai mare decât 0 dacă (onGround == false && verticalMovement> 0) // Reduceți verticalitatea deplasării verticalMovement - = fallSpeed; // Dacă mișcarea verticală este mai mică sau egală cu 0, caracterul este pe podea dacă (verticalMovement < 0) verticalMovement = 0; onGround = true; // Update the animator variables anim.SetFloat("VerticalMovement", verticalMovement); anim.SetBool("OnGround", onGround);
Scenariul este terminat. Acum trebuie să o adăugați la balaur
obiect de joc și adăugați referința la animator componentă. Pentru a face acest lucru, odată ce adăugați scriptul, glisați animator la câmpul corespunzător al scenariului.
Dacă apăsați butonul de redare și încercați, animațiile ar trebui să se schimbe așa cum ar trebui să facă. Balaurul pornește Inactiv, dar odată ce apăsați Space Bar o sa A sari și apoi începeți să jucați cădea animație înainte de a reveni la Inactiv.
Deși în această serie de tutori am folosit doar instrumentele implicite care vin împreună cu Unity, există o mulțime de instrumente 2D grozave în Unity Asset Store, care vă pot ajuta să faceți acest proces și mai ușor și mai rapid. Două exemple bune sunt Moving Smooth și Puppet 2D, fiecare dintre care vă poate ajuta să definiți personajele, ierarhia și animațiile într-un mod intuitiv și ușor.
Plug-in-urile ca acestea oferă unele extra, cum ar fi abilitatea de a adăuga "oase" 2D, făcând întregul proces de animație mai ușor și deformările mai realiste. Dacă ideea dvs. este de a folosi animații 2D cu mai multe grade de detaliu, vă recomandăm cu insistență să verificați aceste pluginuri.
Aceasta incheie seria noastra de tutorial despre cum sa cream o animatie 2D bazata pe os cu Unity. Am acoperit o mulțime de teren în această serie scurtă și acum ar trebui să știți suficient pentru a începe cu animațiile dvs. 2D. Dacă aveți întrebări sau comentarii, ca întotdeauna, nu ezitați să ne lăsați o linie în comentarii.