Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
C# week + discount 30

4. diel - 3D strieľačka v Unity - Animácie zbrane pri chôdzi

V minulej lekcii, 3D strieľačka v Unity - Práca s Asset Store a model zbrane , sme sa naučil importovať balíčky Unity Asset Store a pracovať s nimi. Do hry sme pridali model zbrane.

V dnešnej lekcii sprevádzkujeme animáciu chôdze z balíčka modelu rúk so zbraňou, ktorý sme stiahli minule. Balíček už obsahuje tieto animácie pripravené.

Animácie

Pre zobrazenie animácií klikneme na objekt arms_assault_rifle 01 a uvidíme ich v záložke Inspector, podzáložka Animator:

Pre otvorenie animátor dvakrát klikneme na názov assault_rifle 01 v okienku Controller. Tu uvidíme všetky animácie v podobe jednotlivých klipov pospájaných v jednu sieť. Každé vlákno naznačuje spojenia jednotlivých animácií. Animácia môže byť spustená len za určitých podmienok a alebo napríklad hneď po spustení, to záleží na tom, ako je to nastavené:

Nás zaujíma teraz len pravá časť. Klikneme na tlačidlo Parameters. Potom sa nám zobrazia jednotlivé podmienky, za ktorých sa animácia spustí. Pozrime sa na parameter s názvom Walk. Je typu bool, takže môže mať hodnotu true alebo false (pravda alebo nepravda). My chceme, aby parameter Walk mal hodnotu true, vtedy keď ideme (to sa deje, keď držíme jednu z klávesov W A S D), a hodnotu false, keď nedržíme žiadny kláves. To nastavíme v našom skriptu Move.

Úprava skriptu Move

Animáciu chôdze teda budeme zapínať a vypínať v našom skriptu pre pohyb hráčov. Skript upravíme do nasledujúcej podoby:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    Rigidbody rb;
    Animator objectwithAnim;

    void Start()
    {
        rb = transform.GetComponent<Rigidbody>();
        objectwithAnim = GameObject.FindGameObjectWithTag("Animobject").GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.D))
        {
            rb.AddRelativeForce(new Vector3(50, 0, 0));
            objectwithAnim.SetBool("Walk", true); // Spuštění animace
        }
        if (Input.GetKey(KeyCode.A))
        {
            rb.AddRelativeForce(new Vector3(-50, 0, 0));
            objectwithAnim.SetBool("Walk", true);
        }
        if (Input.GetKey(KeyCode.W))
        {
            rb.AddRelativeForce(new Vector3(0, 0, 50));
            objectwithAnim.SetBool("Walk", true);
        }
        if (Input.GetKey(KeyCode.S))
        {
            rb.AddRelativeForce(new Vector3(0, 0, -50));
            objectwithAnim.SetBool("Walk", true);
        }
        if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D))
        {
            objectwithAnim.SetBool("Walk", false);
        }
    }
}

V našom skriptu sme si vytvorili premennú objectwithAnim. Túto premennú inicializujeme v metóde Start() metódou FindGameObjectWithTag() a získaním komponent Animator výsledného objektu. Ako asi tušíte podľa názvu, metóda vyhľadá herný objekt, ktorý má tag nastavený na "Animobject". Tag nášmu objektu nastavíme neskôr v editore. Metódu si nemýľme s jej verziou vracajúci viac objektov, FindGameObjectsWithTag(). Tu hľadáme objekt podľa tagu, aby nebol kód závislý na konkrétnom názvu a mohli sme ho prípadne vymeniť za iný.

Poďme objektu tag nastaviť. V UnityEditor klikneme na herný objekt, ktorý na sebe má komponent Animator. Tento objekt sa volá arms_assault_ri­fle01. Po kliknutí na objekt v okienku Hierarchy sa nám objaví záložka Inspector. V ňom je vidieť komponenta Animator:

Teraz zmeníme objektu tag, aby ho náš program zvládol nájsť. Klikneme na obdĺžnik s názvom Tag, ktorý sa nachádza hneď pod názvom objektu. Po rozkliknutí klikneme na položku s názvom Add Tag. Teraz si pridáme tag, ktorý priradíme za chvíľu tomuto objektu:

Teraz klikneme na znamienko plus vo štvorčeku a zobrazí sa nám okienko s nápisom New Tag Name. Vedľa neho máme voľné pole, do ktorého napíšeme Animobject (do písmena, presne takto, pretože náš skript hľadá objekt s týmto tagom). Akonáhle napíšeme celý názov nášho tagu, klikneme na tlačidlo Save. Potom klikneme znovu na objekt v Hierarchy s názvom arms_assault_rifle 01 a zobrazí sa nám opäť Inspector. V ňom nastavíme tag na Animobject:

V kóde skriptu potom pri stlačení kláves použijeme objekt, ktorý sme si definovali, a získame z neho komponentu Animator. Tým získame možnosť upravovať animácie, ktoré sú k tomuto objektu prichytené. V tomto prípade sú to všetky animácie. Jednou z metód komponenty Animator je zmeniť hodnotu parametra. My sme zmenili hodnotu premennej typu bool s názvom Walk na hodnotu true, čím sa spustí animácia chôdze. Animáciu vypneme v poslednej podmienke, ktorá platí, ak nie je ani jedna klávesa stlačená.

Spustite hru a užite si nové modely a animácie:)

V budúcej lekcii, 3D strieľačka v Unity - Príprava animácií , pridáme prechody a podmienky k ďalším animáciám zbrane: Beh, Streľba, Schovanie zbrane, Prezretie zbrane.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 21x (25.07 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
3D strieľačka v Unity - Práca s Asset Store a model zbrane
Všetky články v sekcii
Tvorba 3D hier v Unity
Preskočiť článok
(neodporúčame)
3D strieľačka v Unity - Príprava animácií
Článok pre vás napísal Tomáš Brabec
Avatar
Užívateľské hodnotenie:
2 hlasov
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity

 

 

Komentáre

Avatar
Tomin Bora
Člen
Avatar
Tomin Bora:30.3.2021 19:06

Ahoj moc ti děkuji za lekce jsou jednoduše a pochopitelně napsané. Mam kluka autistu 13 let a jeho svět jsou hry a dal si předsevzetí ze si vytvoří vlasní svět (hru) a já pry mu mám pomct. Cha, jenže ono se to lechce řekne , ale jsem uplný amatér maximálně mu vytvořím nějaké modely v blenderu, sice spoustu věcí chápu a rychle se učím ale skripty jsou pro mě uplné tabu. Takže ještě jednou děkuji a kdyby jste měly nějaký nápad jak tohle všechno vysvětlit klukovy budu rád.

 
Odpovedať
30.3.2021 19:06
Avatar
Tomáš Brabec
Brigádník
Avatar
Odpovedá na Tomin Bora
Tomáš Brabec:30.3.2021 19:51

Děkuji za hodnocení :). Doporučil bych na začátku vytvořit jen třeba skakacku, kde jediné co budete muset řešit jen skok na stisk mezerniku a pokud se dotknete nějakého objektu, po které budete chtít konec hry tak stačí vyhodit nápis: “Konec hry”. To je základní hra a dá se z toho krásné pochopit jak unity a programování funguje. Hodně štěstí :)

 
Odpovedať
30.3.2021 19:51
Avatar
weverka
Člen
Avatar
weverka:31.3.2021 9:00

Ahoj, mám problém. Po importu balíčku mi postava padá do voidu. A nezastaví se ( rekord je -7200 a pak mi došla trpělivost). Stáhnul jsem i starší Unity resetoval jsem projekt, ale pokaždé mi postava začne padat a nefungují animace.

Odpovedať
31.3.2021 9:00
Weby jsou budoucnost IT
Avatar
Lukáš Krblich:2. augusta 17:04

Ahoj, mám chybu v kodu, hledal jsem všude možně, ale nemůžu na to přijít . Mohl bys mi pomoct prosím?

https://uloz.to/…3aqdh1ByxuAB#…

-

-
-

-
-

 
Odpovedať
2. augusta 17:04
Avatar
Lukáš Krblich:2. augusta 17:05

Ahoj, mám chybu v kodu, hledal jsem všude možně, ale nemůžu na to přijít . Mohl bys mi pomoct prosím?

Kod

 
Odpovedať
2. augusta 17:05
Avatar
Jan Dvořák
Člen
Avatar
Jan Dvořák:22. septembra 21:52

Ahoj, řekl bych, že chyba vznikla zde. Jak psal Tomáš musíš rozlišovat, FindGameObjec­tWithTag(), který vrací jeden objekt a FindGameObjec­tsWithTag(), který jich vrací více. Pokud se nepletu, tak by ti měl kód po této opravě šlapat jako hodinky 😁

 
Odpovedať
22. septembra 21:52
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 6 správy z 6.