Kaixo! Unity-n pertsonaia bat ibiltzen edo salto egiten jartzea nahiko erraza da. Baina, nola lortzen dugu pertsonaia batek korrika egiten duen bitartean apuntatzea eta tiro egitea? Nola sinkronizatzen dugu ezpata-kolpe baten soinua animazioaren puntu zehatz batekin?
Galdera hauei erantzuteko, oinarrizko animazio-klipetatik haratago joan eta Unity-ren Mecanim sistema ulertu behar dugu sakonki. Gaur, zure pertsonaiei benetako bizia emango dieten bost "eztizko aholku" partekatuko ditut.
1. Aholkua: Erabili Geruzak eta Maskarak aldibereko animazioetarako
Arazoa: Zure pertsonaiak ezin du korrika egin eta, aldi berean, eskuekin agurtu. Bi animazioek gorputz osoari eragiten diote eta elkar zapaltzen dute.
Irtenbidea: Animazio Geruzak (Animator Layers) eta Avatar Maskarak (Avatar Masks) erabiltzea. Zure Animator Controller-ean, geruza desberdinak sor ditzakezu, bakoitzak pisu (Weight) desberdin batekin.
Adibide praktikoa:
- Oinarrizko Geruza (Base Layer): Hemen pertsonaiaren mugimendu nagusiak kudeatuko ditugu (geldirik egon, ibili, korrika egin).
- Goiko Gorputzaren Geruza (Upper Body Layer): Geruza berri bat sortu, eta bere pisua 1-era ezarri. Garrantzitsuena: Avatar Mask bat sortu eta esleitu, soilik goiko gorputzari (besoak, enborra, burua) eragiteko.
- Geruza berri honetan, apuntatzeko, tiro egiteko edo agurtzeko animazioak jarri.
Emaitza: Oinarrizko geruzak hankak mugituko ditu korrika egiteko, eta, aldi berean, goiko geruzak besoak mugituko ditu tiro egiteko. Bi animazioek modu ezin hobean funtzionatuko dute batera.
2. Aholkua: Desakoplatu logika Animator Parameter-ekin
Arazoa: Zure kodetik animazio-egoerak zuzenean izenez deitzen dituzu (animator.Play("RunState")). Hau oso zurruna da. Animatzaileak egoeraren izena aldatzen badu, kodeak huts egingo du.
Irtenbidea: Ez deitu inoiz animazioak zuzenean. Erabili Animator Parametroak (Float, Int, Bool, Trigger). Zure kodeak parametro horiek bakarrik aldatu behar ditu, eta Animator Controller-a arduratuko da egoera batetik bestera noiz eta nola pasatu erabakitzeaz.
Adibidea:
- Sortu forwardSpeed izeneko Float parametro bat Animator-ean.
- Sortu trantsizio bat Idle egoeratik Run egoerara, baldintza hau duena: forwardSpeed > 0.1.
- Zure kodean, idatzi hau bakarrik:
-
C#
float playerSpeed = playerRigidbody.velocity.magnitude; animator.SetFloat("forwardSpeed", playerSpeed);
Onura: Kezken banaketa garbia. Programatzaileak ez du animazio-egoeren izenik jakin behar, eta animatzaileak edo diseinatzaileak egoera-makina nahi duen bezala alda dezake kodea ukitu gabe.
3. Aholkua: Komunikatu animaziotik kodera Gertaerekin (Animation Events)
Arazoa: Nola jakin zehazki noiz erreproduzitu behar den oin-hotsaren soinua, pertsonaiaren oinak lurra ukitzen duen unean?
Irtenbidea: Animazio Gertaerak (Animation Events) erabiltzea. Animazio-kliparen denbora-lerroan, puntu zehatz batean gertaera bat gehi dezakezu. Gertaera honek GameObject berean dagoen script bateko metodo publiko bati deituko dio.
Nola egin:
- Ireki zure pertsonaiaren Walk animazio-klipa "Animation" leihoan.
- Mugitu denbora-lerroa oinak lurra ukitzen duen frame zehatzera.
- Gehitu gertaera bat eta aukeratu deitu nahi duzun funtzioaren izena, adibidez PlayFootstepSound.
- Zure pertsonaiaren script-ean, sortu metodo hori:
-
C#
public void PlayFootstepSound() { // Soinua erreproduzitzeko kodea hemen audioSource.PlayOneShot(footstepClip); }
Onura: Zure jokoaren logika eta animazioen arteko sinkronizazio perfektua, animatzaileak modu bisualean kontrola dezakeena.
4. Aholkua: Gehitu logika egoerei State Machine Behaviour-ekin
Hau aholku oso aurreratu eta indartsua da. Arazoa: Logika jakin bat animazio-egoera espezifiko batean bakarrik exekutatu behar da (adibidez, "eraso" animazioan zehar jokalariaren mugimendua desgaitu). Logika hau pertsonaiaren script nagusian jartzeak if/else edo switch egitura konplexu eta nahasiak sortzen ditu.
Irtenbidea: State Machine Behaviour script-ak erabiltzea. Hauek Animator Controller-eko animazio-egoerei zuzenean eransten zaizkien script bereziak dira.
Nola egin: Sortu script berri bat StateMachineBehaviour klasetik heredatzen duena. Honek OnStateEnter, OnStateUpdate eta OnStateExit bezalako metodoak ditu.
public class AttackStateBehaviour : StateMachineBehaviour {
// Egoera honetan sartzean deitzen da
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
// Jokalariaren mugimendua desgaitu
animator.GetComponent<PlayerMovement>().enabled = false;
}
// Egoera honetatik ateratzean deitzen da
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
// Jokalariaren mugimendua berriro gaitu
animator.GetComponent<PlayerMovement>().enabled = true;
}
}
Gero, arrastatu script hau zure Animator Controller-eko "Attack" egoeraren gainera.
Onura: Egoerari lotutako logika enkapsulatzen du, kontrolatzaile nagusiak garbi eta bideratuta mantenduz.
5. Aholkua: Optimizatu! Egin Culling eta aukeratu Rig egokia
Arazoa: Zure eszenako 100 etsai guztien animazioak kalkulatzen ari dira, baita pantailatik kanpo daudenak ere, CPU asko kontsumituz.
Irtenbidea:
- Animator Culling: Animator osagaian, "Culling Mode" propietatea Cull Completely-ra aldatu. Horrela, Unity-k automatikoki utziko dio kamerak ikusten ez dituen objektuen animazioak kalkulatzeari. Errendimendu-irabazia izugarria da.
- Rig mota egokia aukeratu: Humanoid Rig-a oso indartsua da (animazioak pertsonaia desberdinen artean berrerabiltzeko aukera ematen du), baina garestiagoa da prozesatzeko. Zure pertsonaia ez bada humanoidea (munstro bat, animalia bat, objektu bat), erabili Generic Rig-a. Askoz arinagoa da.
Onura: Errendimendu-hobekuntza nabarmena, batez ere pertsonaia animatu asko dituzten eszenetan.
Amaiera: Zure pertsonaiei bizia emanez, modu profesionalean
Unity-ren Mecanim sistema animazio-erreproduzitzaile sinple bat baino askoz gehiago da. Tresna aurreratu hauek menperatuz, zure jokoaren munduari bizia emango dioten pertsonaia-animazio konplexu, sinesgarri eta eraginkorrak sor ditzakezu.
๋๊ธ