Bone-Based Unity 2D-animasjon Mecanim og Scripting

I denne serien fokuserer vi på de benbaserte 2D-animasjonsverktøyene som leveres av Unity-motoren. Hovedidéen er å presentere og undervise grunnleggende 2D animasjon, slik at du kan bruke den til dine egne spill. I denne opplæringen bruker vi Unitys utrolige Mecanim-verktøy for å blande animasjoner, og vi legger til noen enkle skript for å vise det endelige resultatet.

Før vi starter opplæringen, vil vi gjerne takke Chenguang (DragonBonesTeam) for å gi oss spillkunst som brukes til å produsere denne opplæringsserien.

Hvor vi forlot

I de foregående opplæringen satte vi opp prosjektet, samlet en 2D-dragetegn, og opprettet tre forskjellige animasjoner. Hvis du ikke har fullført de tidligere opplæringene ennå, anbefaler vi sterkt at du gjør det før du fortsetter.

Endelig forhåndsvisning

Denne demonstrasjonen viser den animerte dragen vi sikter mot Rom å få det til å hoppe:

Mecanim

På dette tidspunktet har du draken din helt sammen med tre definerte animasjoner. Det er imidlertid ingen sammenheng mellom dem. Så, vårt opprinnelige mål er å koble de forskjellige animasjonsklemmene og blande dem sammen. For dette gir Unity et fantastisk verktøy kalt Mecanim som gjør akkurat det du trenger.

Mecanim er et kraftig og fleksibelt animasjonssystem. Siden det er integrert med Unity selv, er det ikke behov for tredjeparts programvare. Du kan enkelt animere alt, fra sprites til å blande former eller til og med lys. Mecanim lar deg lage statlige maskiner og blande trær for å kontrollere karakteren din.

Men før vi går videre, la oss snakke litt om å blande animasjoner og statlige maskiner, slik at du får en bedre forståelse av hva vi skal gjøre.

Hva er en statlig maskin?

I Enhet kan du blande to eller flere lignende bevegelser, for eksempel, du vil kanskje blande løpende og gå animasjoner avhengig av tegnets nåværende hastighet. I utgangspunktet har du to forskjellige måter å blande animasjoner i Unity. I enkelte situasjoner kan du bruke overganger; i andre må du bruke Blend Trær:

  • overganger brukes til å overføre jevnt mellom animasjoner. Dette fungerer vanligvis bra hvis overgangen er rask.
  • Blend Trær tillate flere animasjoner å bli blandet jevnt, mens du inkorporerer deler av dem i variable mengder. Disse beløpene styres av numeriske parametere. For å gi et praktisk eksempel, tenk at vi har et skytespill; Du vil kanskje at tegnet skal brann og løpe samtidig. Blend trær kan du blande de to animasjonene sammen, la tegnet kjøre og skyte på samme tid uten å måtte opprette en tredje animasjon for den spesifikke blandingen av handlinger.

En statlig maskin lagrer tilstanden til en enhet på et gitt tidspunkt, og kan reagere på en inngang for å endre tilstanden til den enheten, eller for å forårsake en handling eller utgang. For mer informasjon, se Finite-State Machines: Teori og implementering.

I Unity bruker du state machines til å kontrollere tilstanden til spillets tegn. For eksempel kan en tilstand for et tegn være , og en annen kunne være Hoppe. Tegnet kan endres fra  stat til Hoppe tilstand basert på innspill fra spilleren (sannsynligvis treffer Jump-knappen). 

Her kan du se et eksempel på en (mer kompleks) state-maskin fra Unity-dokumentasjonen. Hver boks representerer en stat, og pilene representerer mulige overganger mellom dem:

Vi skal lage en statlig maskin med våre eksisterende animasjoner, og deretter bruke overganger til å blande dem sammen.

Å bygge vår statlige maskin

Hvis du sjekker animasjoner mappe hvor du har lagret din .anim filer, finner du en Dragon.controller fil. Dette er Mecanim-filen som er knyttet til tegnet som Unity genereres automatisk når du lagret din første animasjon.

Dobbeltklikk på Dragon.controller filen, og Unity åpner en Animator se kategorien ved siden av din scene og Spill faner.

Som du kan se, har Unity allerede lagt til de tre animasjonene til filen. Siden animasjonene allerede er på plass, er det ikke nødvendig å legge til dem, men hvis du vil legge til en ekstra animasjon til kontrolleren, er alt du trenger å gjøre å dra .anim fil til Animator utsikt. På samme måte, hvis du vil fjerne en eksisterende animasjon fra kontrolleren, bør du bare velge på Animator vis og trykk Slett. Du er velkommen til å prøve dette selv.

Vi har fire forskjellige bokser i Animator:

  • En hvilken som helst stat
  • Tomgang
  • Hoppe
  • Falle

En hvilken som helst stat er standardtilstanden som mecanim skaper, og du vil ikke bruke den. Du kan dra den til et hvilket som helst hjørne av Animator vindu og la det være der.

De tre andre boksene refererer til de tre animasjonene vi opprettet. Som du kanskje merker, Tomgang er farget med oransje, mens de andre to er grå. Det er fordi Tomgang er roten animasjon; det er animasjonen som tegnet skal spille som standard. Hvis du trykker på avspillingsknappen på editoren din og tester den, vil du se at tegnet gjør dette Tomgang animasjon. I dette spesielle tilfellet er det akkurat den oppførselen vi vil ha; Men hvis du vil, si det Falle animasjon for å være roten animasjon, alt du trenger å gjøre er å høyreklikke den velg Satt som standard.

Som du kan se, er Falle animasjon er nå oransje og Tomgang er grå.

Siden du vil Tomgang For å være roten animasjon, bare gjenta prosessen for å gjøre den oransje igjen.

Det er nå på tide å koble animasjonene. Høyreklikk Tomgang og velg Gjør overgang.

Dette vil skape en liten pil som starter fra Tomgang. Klikk på Hoppe animasjon for å få pilen til å koble de to animasjonene.

Hvis du velger pilen du nettopp har opprettet, vil du se at nye egenskaper dukker opp i Inspektør tab.

Som du kan se har du en tidslinje og animasjonene Tomgang og Hoppe. Det er et blått band over animasjonene som starter Tomgang men endrer seg til Hoppe. Det er også en tidsperiode hvor de to animasjonene overlapper.

Siden Forhåndsvisning Området er tomt, selv om du klikker på avspillingsknappen over forhåndsvisningen, kan du ikke se hva som skjer.

For å forhåndsvise overgangen du jobber med, velg bare Drage spillobjekt fra hierarki og dra den til Forhåndsvisning område. Nå kan du se tegnet i forhåndsvisningen, og hvis du trykker på spill, kan du se overgangen mellom de to animasjonene.

I Inspektør, området der det blå bandet endres fra Tomgang til Hoppe er vår overgang:

Du kan redigere overgangene ved å dra de to blå pilene på tidslinjen som begrenser overgangsområdet. Ved å endre posisjonen, kan du gjøre overgangen raskere eller mykere.

Det neste du må gjøre er å definere når du vil at denne overgangen skal skje. For å gjøre det, opprett en ny parameter ved å klikke på + logg inn på parametere liste.

Deretter velger du Flyte alternativ og ring det VerticalMovement:

Gå nå tilbake til Inspektør, og under Forhold variabelen VerticalMovement vil dukke opp. Velg den.

Du har nettopp definert tilstanden for å bestemme når du skal endre tilstanden i tilstandsmaskinen: hvis verdien av VerticalMovement er større enn 0, så begynner tegnet Hoppe animasjon. 

Vi ønsker også en overgang mellom Hoppe animasjon og Falle animasjon:

Den maksimale verdien som VerticalMovement kommer til å nå er 1, så, for overgangen mellom Hoppe og Falle, vi kan aktivere den når den verdien er mindre enn 0.5.

Nå må vi få karakteren tilbake til Tomgang animasjon etter høsten. Siden Tomgang skal spille når tegnet er på gulvet, bør du opprette en overgang mellom Falle og Tomgang.

For å fullføre, må du sørge for at den aktiveres når tegnet er på bakken. Du kan gjøre det ved å sette overgangsparameteren til VerticalMovement til mindre enn 0.1-det betyr i utgangspunktet at VerticalMovement er 0, noe som betyr at tegnet er på bakken.

Vi må nå sørge for at vi ikke ser noen Tomgang animasjoner mens tegnet er i luften mellom Hoppe og Falle animasjoner. For å gjøre det, opprett en ny parameter, denne gangen a bool.

Kall det På bakken.

Velg overgangen mellom Hoppe og Falle. Du vil at denne overgangen skal skje når tegnet er fortsatt i luften, ikke sant? Så gå til Inspektør, Klikk på +, og legg til en ny parameter for overgangen. I utgangspunktet vil du at dette skal skje når verdien av På bakken er falsk.

Deretter på overgangen fra Falle til Tomgang, legg til parameteren På bakken og sett verdien til ekte:

Vårt arbeid med Mecanim er gjort. Nå er det på tide å flytte til skripting.

Scripting Animasjoner

Opprett en ny mappe som heter, i aktivitetsmappen din scripts. Deretter oppretter du et nytt C # -skript som heter CharacterMove.cs. Vær oppmerksom på at skriptet du skal lage, er en veldig enkel, som hovedmålet er å vise hvordan du kan endre tegnene på tegnet etter kode. 

Den beste øvelsen er å bruke Unitys fysikk når du vil skape robuste spill. Men for enkelhets skyld og forståelse vil vi bare lage en liten simulering.

Opprett fire variabler i skriptet: en som refererer til Animator komponent, en annen for hastigheten på høsten, en tredje for mengden vertikal bevegelse, og et flagg for å sjekke om tegnet er på bakken.

offentlig klasse CharacterMove: MonoBehaviour // Variabler offentlig Animator anim; // Refresence til animatoren privat float fallSpeed; // Hastigheten karakteren faller privat float verticalMovement; // Mengden vertikal bevegelse privat bool onGround; // Flagg for å sjekke om tegnet er på bakken

I Start() metode, må du kontrollere at hastigheten er satt til 0,03 (eller hvilken annen verdi du føler passer til animasjonene dine) og at tegnet er jordet.

void Start () // Tegnet starter på bakken onGround = true; // Sett fallhastigheten fallSpeed ​​= 0.03f; 

Nå, på Oppdater() metode, det er flere ting du må sjekke. Først må du oppdage når Mellomrom er trykket, for å gjøre tegn hoppe. Når den er trykket, sett den vertikale bevegelsen til 1 og på bakken flagg til falsk.

ugyldig oppdatering () // Hvis mellomromstasten er trykket og tegnet er på bakken hvis (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false; 

Hva skjer når Mellomrom blir ikke presset? Vel, du må sjekke om tegnet er i luften, og dets vertikale bevegelse er større enn 0; I så fall må du redusere den vertikale bevegelsen ved å trekke fallhastigheten.

ugyldig oppdatering () // Hvis mellomromstasten er trykket og tegnet er på bakken hvis (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;  else // Sjekk om tegnet er i luften og den vertikale bevegelsen er større enn 0 hvis (onGround == false && verticalMovement> 0) // Reduser vertikal bevegelse verticalMovement - = fallSpeed; 

Som du vil huske, en gang verticalMovement faller under 0.5, de Falle animasjonen vil begynne å spille. 

Vi vil imidlertid ikke trekke fra fallSpeed fra verticalMovement for alltid, siden tegnet vil lande på et tidspunkt. Hvis den vertikale bevegelsesverdien er lik eller mindre enn 0, vi sier det betyr at tegnet har rammet bakken.

ugyldig oppdatering () // Hvis mellomromstasten er trykket og tegnet er på bakken hvis (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;  ellers // Sjekk om tegnet er i luften og den vertikale bevegelsen er større enn 0 hvis (onGround == false && verticalMovement> 0) // Reduser vertikal bevegelse verticalMovement - = fallSpeed ​​// Hvis den vertikale bevegelsen er mindre eller lik 0, tegnet er på gulvet hvis (verticalMovement < 0)  verticalMovement = 0; onGround = true;    

For å avslutte Oppdater() metode, må du passere verdiene til verticalMovement og på bakken til Animator komponent:

ugyldig oppdatering () // Hvis mellomromstasten er trykket og tegnet er på bakken hvis (Input.GetKeyDown (KeyCode.Space) == true && onGround == true) verticalMovement = 1f; onGround = false;  else // Sjekk om tegnet er i luften og den vertikale bevegelsen er større enn 0 hvis (onGround == false && verticalMovement> 0) // Reduser vertikal bevegelse verticalMovement - = fallSpeed; // Hvis den vertikale bevegelsen er mindre eller lik 0, er tegnet på gulvet hvis (verticalMovement < 0)  verticalMovement = 0; onGround = true;    // Update the animator variables anim.SetFloat("VerticalMovement", verticalMovement); anim.SetBool("OnGround", onGround); 

Skriptet er ferdig. Nå må du legge den til i Drage spillobjekt og legg til referansen til Animator komponent. For å gjøre dette, drar du, når du legger til skriptet Animator til riktig felt på skriptet.

Hvis du trykker på spill og tester det, bør animasjonene endres slik de skal. Dragen starter på Tomgang, men når du trykker på Mellomrom det vil Hoppe og deretter begynne å spille Falle animasjon før du kommer tilbake til Tomgang.

Eksterne verktøy og teknologier

Selv om vi i denne opplæringsserien bare har brukt standardverktøyene som følger med Unity, er det mange flotte 2D-verktøy på Unity Asset Store som kan hjelpe deg med å gjøre denne prosessen enda enklere og raskere. To gode eksempler er Smooth Moves and Dollette 2D, som hver kan hjelpe deg å definere tegnene, hierarkiet og animasjonene på en intuitiv og enkel måte.. 

Plug-ins som disse tilbyr noen ekstraelementer, som muligheten til å legge til 2D "bein", noe som gjør hele animasjonsprosessen enklere og deformasjonene mer realistiske. Hvis ideen er å bruke 2D-animasjoner med flere detaljgrader, anbefaler vi sterkt at du sjekker ut disse pluginene.

Konklusjon

Dette avslutter vår opplæringsserie om hvordan du lager en benbasert 2D-animasjon med Unity. Vi har dekket mye bakken i denne korte serien, og du bør nå vite nok til å komme i gang med 2D-animasjonene dine. Hvis du har noen spørsmål eller kommentarer, kan du som alltid gjerne sende oss en linje i kommentarene.

referanser

  • Dragon sprite sheet: brukes med tillatelse fra Chenguang fra DragonBonesTeam