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 38x (1.99 kB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET