Sisteme de animatie

Cerinte

Sa se realizeze un sistem de interfata grafica pentru urmatoarele evenimente:

  1. o animatie de loading la pornirea scenei/la schimbarea scenei, care sa dureze cel putin 1s
  2. o animatie de MultiKill/Achievement, atunci cand o valoare de prag 5 este depasita se afiseaza Starea 1 (animatia 1), iar atunci cand este depasita valoarea de prag 10, se intra in Starea 2 (animatia 2). Pentru gestiunea starilor se va folosi Animator Controller, iar pentru setarea valorilor de prag se va folosi un script C#.

Cele 2 animatii trebuie sa fie realizate prin metode diferite de animatie 2D.

Documentatie video

Inregistrare pe MS Teams

Documentatie extinsa text

Animatii 2D in Unity

In Unity (versiuni dupa 2018) avem doua posibilitati de a face animatii 2D: sprite-sheet si bone-based.

În prima imagine, caracterul este prezentat în mai multe poziții, cu o secvență de poziții pentru diferite acțiuni. Aceasta imagine reprezinta un sprite-sheet, fiind foarte popular in jocurile 2D. Aceasta vă permite să vă imaginați în mod clar modul în care se va mișca în joc.

In a doua imagine, balaurul este împărțit în mai multe părți ale corpului (cap, corp, brațe și așa mai departe), necesitand o tehnică mai recentă de animație 2D, denumită în mod normal animație bazată pe oase (bone-based). După cum sugerează și numele, animația va fi pe bază de os, în care fiecare os din corp poate avea o acțiune sau o animație specifică. Având toate părțile principale ale corpului separat, permite dezvoltatorilor să creeze animațiile direct în editor. Această tehnică nouă de animație este foarte asemănătoare cu cea utilizată în animația 3D.

Sprite-sheet

Puteti descarca imaginea urmatoare ca exemplu: Pentru a folosi sprite-sheet-ul, incarcati imaginea in Unity si configurati Sprite Mode ca Multiple, dupa care accesati Sprite Editor.

In editor accesati meniul de Slice si puteti folosi varianta automata, sau manuala pentru a selecta diferitele stari ale animatiei. Dupa aceasta operatie, veti avea fiecare sprite individual.

Pentru a crea animatii din secvente de sprite-uri, puteti selecta sprite-urile si din folositi functia de Create Animation sau, mai simplu, puteti face drag-and-drop in scena si vi se creaza automat o animatie pe care va trebui sa o salvati.

Pentru sprite-ul oferit animatiile sunt asezate in felul urmator:

  • idle = 0 - 9
  • walk = 10 - 20
  • hadooken = 21 - 31
  • crouch = 32 - 37
  • jump = 38 - 48

Bone-based 2D

Incepand cu versiunea din 2018 (2018.2.0f2), Unity are suport si pentru animatii Bone-based pentru 2D, functionalitate accesibila prin instalarea pachetului de 2D Animation.

Puteti folosi imaginea de mai jos ca exemplu:

Fluxul de lucru:

Se construieste ierarhia de oase în editor (Sprite Editor > Bone Editor).

Se genereaza geometria și se atribuie greutăți ale pielii în editor (Sprite Editor > Geometry And Weight Editor).

Se adauga componenta Sprite Skin pentru a genera oasele.

Mai multe detalii aici:

Urmeaza crearea de animatii pentru obiect folosind oasele.

Hierahical animation

Folosirea animatiilor ierarhice necesita mai multa munca.

In primul rand, plecand de la o imagine (puteti folosi imaginea de mai sus), trebuie despartita in slice-uri, similar cu procesul de la sprite sheet.

Apoi, aceste sprite-uri trebuie asamblate in scena, astfel incat sa formeze un obiect. Este indicat sa aveti o structura arborescenta. Acest lucru va fi folositor in crearea animatiilor, deoarece atunci cand misc bratul (arm), evident trebuie sa misc si mana (hand).

Pentru ordine puteti folosi urmatoarele valori

  • Dragon: 0
  • Body: 3
  • Head: 4
  • Left Leg: 4
  • Left Upper Arm: 5
  • Left Arm: 4
  • Left Hand: 5
  • Right Leg: 1
  • Right Upper Arm: 2
  • Right Arm: 1
  • Right Hand: 2
  • Tail: 4
  • Tail Tip: 5

Urmatorul pas este crearea animatiilor, care de aceasta data trebuie facuta manual folosind utilitarul de animatie (Window > Animation). Vedeti subcapitolul de mai jos.

Crearea de animatii folosind Animation editor

Crearea animatiilor se poate face folosind utilitarul de animatie (Window > Animation).

Pentru a crea animatia unui obiect, puteti selecta acel obiect si sa creati un animator pentru acesta (in cazul in care nu exista). Cum se foloseste animatorul: Folositi butonul de Record si creati key-frame-uri in care sa se diversi parameri de Transform sau Render. Spre exemplu puteti roti capul dragonului:

Pentru a crea o noua animatie folositi butonul de Create new Clip (spre exemplu pentru Jump):

Crearea de animatii pentru obiecte 3D

Crearea animatiilor se poate face folosind utilitarul de animatie (Window > Animation), similar ca in spatiul 2D.

Daca este vorba de personaje, de regula animatiile se importa impreuna cu modelul 3D, folosind un sistem de scheletizare.

Animator Controller

Urmatorul pas este sa configuram aceste animatii astfel incat sa le putem folosi, si sa putem tranzitiona intre ele. Pentru acest lucru, vom folosi un Animator Controller. Acest controller functioneaza ca un automat de stari, fiecare stare putand fi o animatie.

Pentru a folosi animatiile se pot adauga cu drag-and-drop in Animator.

Pentru animatii fluente si controlate, trebuie sa definim tranzitii intre acestea. Tranzitiile au mai multe proprietati, printre care timpi de activare, conditii etc.

Conditiile sunt folosite pentru a controla cand are loc o tranzitie. Spre exemplu, putem folosi un parametru de stare, pentru a trece dintr-o animatie in alta, sau alte conditii (spre exemplu daca este pe sol, in aer, primeste damage etc.)

Spre exemplu putem folosi urmatoarea conventie pentru un parametru de stare:

  • ken_idle = 0
  • ken_walk = 1
  • ken_crouch = 2
  • ken_jump = 3
  • ken_hadooken = 4

si punem conditia de tranzitie de la Idle la Walk state=1. Acest lucru îi va spune personajului, dacă este în Idle, pentru a tranzitiona la animația de Walk dacă parametrul de stare se schimbă la 1.

Schimbarea starilor unui Animator

Pentru a schimba starile unui animator, trebuie in primul rand adaugata componenta de Animator pe obiect. Apoi, putem controla parametrii definiti prin functii disponibile in clasa Animator.

const int STATE_IDLE = 0;
const int STATE_WALK = 1;
const int STATE_CROUCH = 2;
const int STATE_JUMP = 3;
const int STATE_HADOOKEN = 4;
 
string _currentDirection = "left";
void Start()
{
        //define the animator attached to the player
        animator = this.GetComponent<Animator>();
}
 
void Update()
{
        if (Input.GetKey ("right")) {
          changeDirection ("right"); //schimba directia personajului
          transform.Translate(Vector3.left * walkSpeed * Time.deltaTime); //muta personajul
          animator.SetInteger ("state", STATE_WALK); //activeaza animatia
 
        }
}
 
void changeDirection(string direction)
     {
 
         if (_currentDirection != direction)
         {
             if (direction == "right")
             {
             transform.Rotate (0, 180, 0);
             _currentDirection = "right";
             }
             else if (direction == "left")
             {
             transform.Rotate (0, -180, 0);
             _currentDirection = "left";
             }
         }
 
     }
pjv/laboratoare/2023/04.txt · Last modified: 2023/10/30 17:04 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0