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í.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu. Zároveň využij slevovou akci až 30 % zdarma při nákupu e-learningu - Více informací.
python week + discount 30

Lekce 4 - 3D střílečka v Unity - Animace zbraně při chůzi

V minulé lekci, 3D střílečka v Unity - Práce s Asset Store a model zbraně, jsme se naučil importovat balíčky Unity Asset Store a pracovat s nimi. Do hry jsme přidali model zbraně.

V dnešní lekci zprovozníme animaci chůze z balíčku modelu rukou se zbraní, který jsme stáhli minule. Balíček již obsahuje tyto animace připravené.

Animace

Pro zobrazení animací klikneme na objekt arms_assault_ri­fle01 a uvidíme je v záložce Inspector, podzáložka Animator:

Pro otevření Animátoru dvakrát klikneme na název assault_rifle01 v okénku Controller. Zde uvidíme všechny animace v podobě jednotlivých klipů pospojovaných v jednu síť. Každé vlákno naznačuje spojení jednotlivých animací. Animace může být spuštěna jen za určitých podmínek a nebo třeba hned po spuštění, to záleží na tom, jak je to nastaveno:

Nás zajímá nyní jen pravá část. Klikneme na tlačítko Parameters. Poté se nám zobrazí jednotlivé podmínky, za kterých se animace spustí. Podívejme se na parametr s názvem Walk. Je typu bool, takže může mít hodnotu true nebo false (pravda nebo nepravda). My chceme, aby parametr Walk měl hodnotu true, tehdy když jdeme (to se děje, když držíme jednu z kláves W A S D), a hodnotu false, když nedržíme žádnou klávesu. To nastavíme v našem skriptu Move.

Úprava skriptu Move

Animaci chůze tedy budeme zapínat a vypínat v našem skriptu pro pohyb hráče. Skript upravíme do následující 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šem skriptu jsme si vytvořili proměnnou objectwithAnim. Tuto proměnnou inicializujeme v metodě Start() metodou FindGameObjectWithTag() a získáním komponentu animator výsledného objektu. Jak asi tušíte podle názvu, metoda vyhledá herní objekt, který má tag nastavený na "Animobject". Tag našemu objektu nastavíme později v editoru. Metodu si nepleťme s její verzí vracející více objektů, FindGameObjectsWithTag(). Zde hledáme objekt podle tagu, aby nebyl kód závislý na konkrétním názvu a mohli jsme jej případně vyměnit za jiný.

Pojďme objektu tag nastavit. V UnityEditor klikneme na herní objekt, který na sobě má komponentu Animator. Tento objekt se jmenuje arms_assault_ri­fle01. Po kliknutí na objekt v okénku Hierarchy se nám objeví záložka Inspector. V něm je vidět komponenta Animator:

Nyní změníme objektu tag, aby ho náš program zvládl najít. Klikneme na obdélník s názvem Tag, který se nachází hned pod názvem objektu. Po rozkliknutí klikneme na položku s názvem Add Tag. Teď si přidáme tag, který přiřadíme za chvíli tomuto objektu:

Nyní klikneme na znaménko plus ve čtverečku a zobrazí se nám okénko s nápisem New Tag Name. Vedle něj máme volné pole, do kterého napíšeme Animobject (do písmene, přesně takhle, protože náš skript hledá objekt s tímto tagem). Jakmile napíšeme celý název našeho tagu, klikneme na tlačítko Save. Poté klikneme znovu na objekt v Hierarchy s názvem arms_assault_ri­fle01 a zobrazí se nám opět Inspector. V něm nastavíme tag na Animobject:

V kódu skriptu pak při stisku kláves použijeme objekt, který jsme si definovali, a získáme z něj komponentu Animator. Tím získáme možnost upravovat animace, které jsou k tomuto objektu přichycené. V tomto případě jsou to všechny animace. Jednou z metod komponenty Animator je změnit hodnotu parametru. My jsme změnili hodnotu proměnné typu bool s názvem Walk na hodnotu true, čímž se spustí animace chůze. Animaci vypneme v poslední podmínce, která platí, pokud není ani jedna klávesa stisknutá.

Spusťte hru a užijte si nové modely a animace :)

V příští lekci, 3D střílečka v Unity - Příprava animací, přidáme přechody a podmínky k dalším animacím zbraně: Běh, Střelba, Schování zbraně, Prohlédnutí zbraně.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 21x (25.07 MB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET

 

Předchozí článek
3D střílečka v Unity - Práce s Asset Store a model zbraně
Všechny články v sekci
Tvorba 3D her v Unity
Přeskočit článek
(nedoporučujeme)
3D střílečka v Unity - Příprava animací
Článek pro vás napsal Tomáš Brabec
Avatar
Uživatelské hodnocení:
16 hlasů
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity

 

 

Komentáře

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.

 
Odpovědět
30.3.2021 19:06
Avatar
Tomáš Brabec
Brigádník
Avatar
Odpovídá 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í :)

 
Odpovědět
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.

Odpovědět
31.3.2021 9:00
Weby jsou budoucnost IT
Avatar
Lukáš Krblich:2. srpna 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#…

-

-
-

-
-

 
Odpovědět
2. srpna 17:04
Avatar
Lukáš Krblich:2. srpna 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

 
Odpovědět
2. srpna 17:05
Avatar
Jan Dvořák
Člen
Avatar
Jan Dvořák:22. září 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 😁

 
Odpovědět
22. září 21:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.