Lekce 5 - 3D střílečka v Unity - Animace zbraně při chůzi
V předchozím kvízu, Kvíz - Terén, hráč, otáčení kamery, Asset Store v Unity3D, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním Unity3D tutoriálu se naučíme pracovat s animacemi. Budeme spouštět a vypínat animaci zbraně.
Dnes implementujeme balíček, který jsme si stáhli v lekci Práce s Asset Store a model zbraně. Tento balíček obsahuje animace zbraně.
Animace
Pro zobrazení animací klikneme na objekt arms_assault_rifle01:

Objekt se nachází v záložce Inspector, podzáložce 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í.
Spuštění animací
Animace může být spuštěna jen za určitých podmínek, které se nastavují zde:

Nás nyní zajímá 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 při chůzi.
Jdeme, když držíme jednu z kláves W A S
D. Když nedržíme žádnou z těchto kláves, pak nejdeme a tudíž
potřebujeme, aby parametr měl hodnotu false.To nastavíme v
našem skriptu Move.
Úprava skriptu Move
Animace chůze se tedy bude zapínat a vypínat v našem skriptu pro pohyb hráče.
Proměnné
Tentokrát nám bude stačit přidat jednu proměnnou, a to
objectwithAnim typu Animator:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { Animator objectwithAnim; }
Metoda Start()
V této metodě inicializujeme proměnnou objectwithAnim metodou
FindGameObjectWithTag() a získáním komponentu
animator výsledného objektu:
void Start() { objectwithAnim = GameObject.FindGameObjectWithTag("Animobject").GetComponent<Animator>(); }
V metodě vyhledáme 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(). V naší metodě Start()
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ý.
Metoda Update()
Do těla stávajících podmínek, v metodě Update(), přidáme
kód objectwithAnim.SetBool("Walk", true); pro změnu hodnoty
parametru Walk na true při stisknutí některé z
kláves W A S D. Na konec metody pak
přidáme podmínku, která bude hlídat, že není stisknuta některá z výše
uvedených kláves a nastaví parametr Walk na
false:
void Update() { if (Input.GetKey(KeyCode.D)) { rb.AddRelativeForce(new Vector3(50, 0, 0)); objectwithAnim.SetBool("Walk", true); } 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); } }
Upravený skript Move
Po úpravě vypadá náš skript Move následovně:
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); } 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); } } }
Nastavení v UnityEditor
Pojďme objektu nastavit tag. V UnityEditor
klikneme na herní objekt, který má na sobě komponentu Animator.
Tento objekt se jmenuje arms_assault_rifle01. Po kliknutí na
objekt v okénku Hierarchy se nám objeví záložka
Inspector. V něm je vidět komponenta Animator.
Změna tagu
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. Klikneme na znaménko
+ ve čtverečku. Zobrazí se nám okénko s nápisem New
Tag Name, do kterého napíšeme Animobject:

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_rifle_01. Zobrazí se nám opět
Inspector. V něm nastavíme tag na
Animobject:

Pokud bychom tag zapomněli nastavit, skript
Move by nemohl najít objekt s tímto tagem.
Testování
Spusťme hru a užijme si nové animace 

V příští lekci, 3D střílečka v Unity - Příprava animací, si přidáme přechody a podmínky k těmto animacím zbraně: běh, střelba, schování a 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 42x (1.99 kB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET
