I det følgende beskrives hvordan vi kan lave Sprite Sheet Animation (SPA) i Unity. SPA er i sin enkelthed en række af sprites(billeder) der med kort mellemrum bliver vist efter hinanden.
Vi vil i denne animationsøvelse gøre brug af sprite asset : Sunny Land
Denne tutorial er udarbejdet på baggrund af denne video: 2D Animation af Brackeys
click „create“ for at oprette din første animation.
Opret evt. en folder 'Animation' til alle dine animationer, og husk at angive et sigende navn til din animation f.eks „player_walking“ , „player_jumping“, „player_shooting“, „player_idle“ etc. alt efter hvad der animeres.
I Project view kan du nu markere de sprites som skal udgøre din animation. Træk disse sprites ind i dit animation vindow.
Test din animation ved at klikke play-ikonet i animationsvinduet. Som udgangspunkt kører animation meget hurtigt. For at ændre dette kan vi ændre sample rate. Sample rate er ikke vist som default. Vis 'Sample rate' ved at click de tre prikker, og vælg „Show sample rate“ se nedenstående.
Eksperimentér med din sample rate, så animation virker „naturlig“. (Jeg vælger værdien 25)
Tilføj alle de animation du ønsker at anvende for din player som ovenstående..dvs:
Animator Controller styre hvilke animations der skal afspilles og hvornår. Vælg Windows→Animation→Animator for at vise Animator window.
Animator-vinduet består af en række tilstande (states), samt de animations clips som vi har oprettet:
Tilstandende er:
Animator kan påvirkes at dine C# scripts, og der kommunikeres gennem parametre (Parameters) som du kan oprette tilvenstre for Animator vinduet.
Det er muligt at starte en animation
private Animator anim;
I vores PlayerMovement C# script vil vi nu i metoden void start() oprette en reference til vores Animator i unity.
... anim = GetComponent<Animator>(); ...
if (Mathf.Abs(direction) > 0f){ anim.SetBool("isRunning", true); } else { anim.SetBool("isRunning", false); }
Tilføjer her en parameter ved navn 'isRunning' med typen Bool
Enhver transition skal have mindst én condition (betingelse) for at kunne skifte fra en tilstand til en anden. Betingelsen for at skifte fra Idle til Walking animationen er at vores tidligere oprettede parameter 'isRunning' er sat til true.
Vi opretter en condition på transitionen fra Idle til Walking, som vist nedenstående :
Det skal være muligt at foretage et hop (Jump) uanset hvilken state vi befinder os i. Her benytter vi os af anystate state, som eksisterer til netop dette formål.
Opret transition fra anystate til Player_Jump.
husk også her at sætte:
For at senere at kunne kommunikere fra C# til animator om hvornår en hop (Jump) animation skal afspilles, oprettes en parameter 'isJumping' af typen Bool i din animamtor. (se billede)
Der skal nu laves en condition på transitionen mellem anystate og Player Jump, vi tester her på om den ny-oprettede parameter 'isJumping' er sat til true. (se billede)
Det skal være muligt for Player, at forlade tilstanden Player_Jump for enten at animere Player_Idle, eller Player_Running. Opret transitioner fra Player_Jump tilstanden, til disse førnævnte tilstande.
Vi skal nu kigge på de conditions (betingelser) fra transition: Player_Jump → Player_Idle samt, transitionen: Player_Jump → Player_Idle
Bemærk at vi her er nødt til at have to betingelser i spil, både om Player er i færd med at hoppe, samt om Player løber eller ej.
Vi benytter nu to 'isRunning' samt 'isJumping' i vores liste af conditions, de skal have nedenstående værdier:
| Parameter | Value |
|---|---|
| isJumping | false |
| isRunning | true |
| Parameter | Value |
|---|---|
| isJumping | false |
| isRunning | false |
Nu mangler vi blot at „manipulere“ vores parametre fra vores PlayerMovement C# script.
Vi kan igangsætte en Player_Jump animation ved at ændre parameter 'isJumping' fra PlayerMoveent C# scriptet. Dette gør vi ved at sætte isJumping til true, ved taste tryk (se nedenstående)
if (Input.GetButtonDown("Jump") && isGrounded == true) { rb.velocity = new Vector2(rb.velocity.x, speed); anim.SetBool("isJumping", true); // Player_Jumping animation startes }
Vi forlader Player_Jumping animation når Player igen lander på „jorden“.
private void OnCollisionEnter2D(Collision2D other) { if (other.gameObject.CompareTag("Floor")) { isGrounded = true; anim.SetBool("isJumping", false); // <-- } }