Karakter Animáció és Kontroller Unity
Kezdeti lépések Alap projekt letöltése Egy statikus geometriát láthatunk Meg vannak a fizikai befoglalók is
Animált karakter asset Töltsük le a karakter asset-et Blenderből exportált fbx fájl Tartalmazza a csontvázat és az animációt is Az Asset könyvtárban csináljunk egy Character könyvtárat Másoljuk be ide az fbx fájlt és a textúrákat Vizsgáljuk meg a beimportált asset-et
Animált karakter asset
Megjegyzés Nem biztos, hogy az általunk betöltött modellre jól be lettek állítva az animációk Lehet, hogy a modellező szoftverben csak egymás után kerültek a kulcsok, és semmi csoportosítás nem jelent meg (futás, állás stb. nincs) Ilyenkor nekünk kell megadni az animációs klippeket Minden animációhoz a kezdő és végső frame-ek sorszámát, és megfelelően elnevezni őket
Huzzuk be az asset-et a jelenetbe (lehet, hogy az anyagjellemzőjén kicsit változtatni kell, material csere)
Animáció kellene (Készítsünk animator controller komponenst (asset nézet, jobb klikk …)) Nyissuk meg az Animation és az Animator ablakokat Az asset nézetben az up_stand animációt húzzuk rá a játékos objektumra Ha kiválasztjuk a játékost, megjelenik az animáció az Animation és az Animator ablakokban
Az animáció nem loop-ol Az importálás tulajdonságainál kell beállítani Soldieranimated2 asset animation tulajdonságainál ki kell választani az animációt, és beállítani rá a loop-ot
A felső test szépen animálódik, de a lábak nem Az animátor ablakban bal felül keressük meg a layers fület Itt egy réteg van: Base layer Nevezzük át Upper Body-ra Adjunk hozzá egy új réteget Nevezzük el Legs-nek Keressük meg a legs_stand animációt és húzzuk rá a modellre Erre az animációra is be kell állítanunk a loop-ot
Legs réteg beállításai:
Egyszerű TPS kamera A kamerát húzzuk a Player alá a hierarchia nézetben Állítsuk be a transzformációját (lokális transzformációt jelent):
Irányítás Adjunk a játékoshaoz egy szkriptet: PlayerController Kód a túloldalon
public class PLayerController : MonoBehaviour { public float moveSpeed = 30; public float turnSpeed = 80; void turnCharacter(float turn) { transform.Rotate(new Vector3 (0, turn, 0)); } void moveCharacter(Vector3 move) { transform.Translate(move); } void Update () { float dt = Time.deltaTime; Vector3 move = new Vector3 (0, 0, 0); float turn = 0; if (Input.GetAxis ("Horizontal") > 0) turn += dt * turnSpeed; else if (Input.GetAxis ("Horizontal") < 0) turn -= dt * turnSpeed; if (turn != 0) turnCharacter (turn); if (Input.GetAxis ("Vertical") > 0) move += Vector3.forward * moveSpeed * dt; else if (Input.GetAxis ("Vertical") < 0) move += Vector3.back * moveSpeed * dt; if (move.magnitude != 0) moveCharacter (move); }
Feladat A futás animációkat is hozzuk be az animatorba – Loop-olhatók legyenek – A megfelelő animációs rétegbe kerüljenek Adjunk hozzá egy új paramétert az animatorhoz: AnimState (int) Csináljuk meg az átmeneteket : ha 0 akkor állunk, ha 1 akkor futunk
A szkriptet is át kell írnunk, hogy váltson animációt, ha mozgunk public class PLayerController : MonoBehaviour { … Animator animator; void Start () { animator = GetComponent (); } … void moveCharacter(Vector3 move) { animator.SetInteger ("AnimState", 1); transform.Translate(move); } void Update () { … if (move.magnitude != 0) moveCharacter (move); else animator.SetInteger ("AnimState", 0); }
Fizika Kell egy collider (kapszula) és egy rigid body a player-re
Collider beállítása
Eltolás helyett sebességváltozás public class PLayerController : MonoBehaviour { … Rigidbody rigidBody; void Start () { animator = GetComponent (); rigidBody = GetComponent (); } … void moveCharacter(Vector3 move) { animator.SetInteger ("AnimState", 1); Vector3 dir = transform.rotation * move; rigidBody.velocity += dir; } void FixedUpdate () { … if (Input.GetAxis ("Vertical") > 0) move += Vector3.forward * moveSpeed * dt; else if (Input.GetAxis ("Vertical") < 0) move += Vector3.back * moveSpeed * dt; … }
Fizika kicsiszolása A rigid body és a kontroller szkript tulajdonságait kell finomhangolnunk – RigidBody: Drag – Kontroller: Move speed – Lehet a surlódással is játszani: Collison shape-hez új fizikai anyagjellemzőt rendelünk
Fegyvert a kézbe Az letöltött assetek közül importáljuk a projektbe a fegyever modelt és a textúráját (rifle.fbx, rifle.png) Húzzuk be a jelenetbe Ha kell, javítsuk ki az anyagjellemzőjét (ha a textúra nem jelenne meg) Szeretnénk, ha a karakter kezébe kerülne …
Fegyvert a kézbe Bontsuk ki a hierarchia nézetben a játékos csontvázhierarchiáját, míg el nem jutunk a hand_r nevű csonthoz A hierarchia nézetben húzzuk a fegyevert a hand_r csont alá A fegyver transzformációját állítsuk identitásra (azért működik ez most jól, mert eleve így modelleztük le, ha nem így lett volna, a transzformációját addig állítgatjuk, míg belesimul a kézbe)
A fegyvert nem így szoktuk tartani Van egy animációnk a fegyver tartására Csak a felsőtestre hat ki A felső test animációs rétegén kell csak változtatnunk Már láthatjuk, hogy az eddigi AnimState változónk nem lesz elegendő, kettőt kell definiálni: – AnimStateUp – AnimStateLegs Először alakítsuk át az animációkat, hogy az alsó és a felsőtestet más változó irányítson – Fel kell venni egy újabb változót, a régit pedig átnevezni – A legs layer-ben az átmenetekre beállítani az új változót – A PLayerController szkriptet is át kell írnunk (mindkét változót be kell állítanunk)
Adjuk hozzá a fegyver tartás animációt is a felső test animációs rétegéhez …