===== Animation =====
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.
{{ :images:animation_principle.png |}}
Vi vil i denne animationsøvelse gøre brug af sprite asset : [[https://ansimuz.itch.io/sunny-land-pixel-game-art|Sunny Land]] \\
Denne tutorial er udarbejdet på baggrund af denne video: [[https://www.youtube.com/watch?v=hkaysu1Z-N8|2D Animation]] af Brackeys
----
==== Player Animation ====
* Markér Player i Hieracy (eller Scene)
* Åben animations vinduet ved at: Window -> Animation -> Animation ((genvej: CTRL-6))
{{ :images:animation_empty.png |}}
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.
{{ :images:animation_walking.png |}}
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.
{{ :images:animation_samplerate_show.png |}}
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:
* "Create new Clip"
* Navngiv dit nye animations-clip
* Træk sprites ind i Animation vindue
* Juster "Sample Rate" således animation har den "rigtige" hastighed
* Animator Controller ( Styrer hvornår en animation skal afspilles )
* Animation clips
{{ :images:animation_new_clip.png |}}
----
----
===== Animator Controller ====
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:
* Entry (default tilstand ved opstart af Scene)
* AnyState
* Exit
Animator kan påvirkes at dine C# scripts, og der kommunikeres gennem parametre (Parameters) som du kan oprette tilvenstre for Animator vinduet.
{{ :images:cs_animator_rel.png |}}
----
==== Styring af animation ====
Det er muligt at starte en animation
* Transition (med input parameters)
* Exit time (vente-tid indtil næste animation, typisk disabled )
* Transition duration (tid overlap af animation = 0)
----
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();
...
if (Mathf.Abs(direction) > 0f){
anim.SetBool("isRunning", true);
} else {
anim.SetBool("isRunning", false);
}
{{ :images:animation_add_parameter.png |}}
Tilføjer her en parameter ved navn //'isRunning'// med typen **Bool**
{{:images:animation_trans_setting.png|}}
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 :
{{:images:animation_add_condition.png|}}
----
==== Jump animation ====
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:\\
* "//Has exit time//" til off
* "//transition duration//" til 0 sek.)
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)
{{:images:animation_anystate_jump.png |}}
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:
=== Player_Jump -> Player_Running ===
^ Parameter ^ Value ^
| isJumping | false |
| isRunning | true |
=== Player_Jump -> Player_Idle ===
^ Parameter ^ Value ^
| isJumping | false |
| isRunning | false |
Nu mangler vi blot at "manipulere" vores parametre fra vores PlayerMovement C# script.
----
==== Styring af parametre fra C# ====
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); // <--
}
}