Lekce 7 - 3D střílečka v Unity - Ovládání animací
V minulé lekci, 3D střílečka v Unity - Příprava animací, jsme přidali přechody a podmínky k animacím zbraně.
V dnešním Unity 3D tutoriálu si upravíme náš skript
Move
tak, aby ovládal naše animace. Dokončíme tedy tyto
animace:
Změna parametru animace střílení
Tvůrce našeho neimportovaného balíčku měl nejspíše v plánu, že
zbraň bude střílet jen jednotlivé kulky. Levé tlačítko myši ->
výstřel -> pustit tlačítko -> a tak znovu dokola. Proto vytvořil
parametr Shoot
jako typ trigger
a ne
bool
. My ale chceme jako správný nenasytný vývojář obojí,
tedy jak možnost jednotlivých střel, tak střelbu dávkovanou. Může to
znít složitě, ale budeme to mít hotové během několika kroků.
Změna typu parametru
Shoot
V minulých lekcích jsme s tímto již počítali, a proto máme parametry
Shoot
všech přechodů jako typ trigger
. Když totiž
měníme typ parametru na bool
, výchozí hodnota v přechodu je
vždy true
a to my potřebujeme.
Změnu provedeme následovně: Otevřeme si záložku Animator a
podíváme se na část s parametry. Zde vidíme všechny
parametry obsáhlé v animátoru. Klikneme na parametr
Shoot
pravým tlačítkem, zvolíme Delete a
potvrdíme:
Následně klikneme na tlačítko + pro přidání nového
parametru a zvolíme Bool
:
Parametru zadáme název Shoot
.
Úprava skriptu Move
Nyní můžeme upravit náš skript Move
tak, aby se aktivovaly
jednotlivé přechody. Všechen kód budeme psát do souboru
Move.cs
.
Proměnná
Nejprve si vložíme proměnnou running
typu
bool
:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { Rigidbody rb; Animator objectwithAnim; bool running; // Tento řádek jsme přidali ... }
Proměnná running
bude nabývat
hodnoty true
tehdy, když běžíme a nemůžeme dělat nic
jiného.
Metoda Start()
V této metodě vypneme kurzor:
void Start() { rb = transform.GetComponent<Rigidbody>(); objectwithAnim = GameObject.FindGameObjectWithTag("Animobject").GetComponent<Animator>(); Cursor.visible = false; // Tento řádek jsme přidali }
Kurzor vypneme pomocí objektu Cursor
, který má v sobě
veřejnou proměnnou visible
typu bool
. Výchozí
hodnota je true
, proto nastavíme proměnnou visible
na false
.
Metoda Update()
Metodu Update()
upravíme.
První podmínka
Na začátek metody Update()
přidáme
podmínku, která bude hlídat, jestli hráč
běží:
void Update() { if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.LeftShift) && !objectwithAnim.GetBool("Aim") && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect")) { rb.AddRelativeForce(new Vector3(0, 0, 70)); objectwithAnim.SetBool("Run", true); running = true; } else { objectwithAnim.SetBool("Run", false); running = false; } } ...
V této podmínce využíváme metodu
GetCurrentAnimatorStateInfo()
s parametrem vrstvy,
ve které se nachází naše animace. Obvykle jsou animace v první vrstvě,
takže do závorek obvykle stačí napsat 0
. Tato metoda nám
umožňuje zjistit, zda se animace právě přehrává.
Pokud se klávesy W a Left Shift stisknou a animace
Inspect
se nepřehrává, nastavíme parametr Run
a
proměnnou running
na hodnotu true, aby se hráč
pohyboval rychleji. Pokud podmínka není splněna, nastavíme parametr
Run
a proměnná running
na hodnotu
false
, čímž zastavíme animaci běhu.
Druhá podmínka
if (!running)
Zbylé podmínky, které ve skriptu Move
máme, zabalíme
do podmínky if (!running)
, která bude hlídat
jestli hráč neběží:
void Update() { if (!running) { if (Input.GetKey(KeyCode.D)) { rb.AddRelativeForce(new Vector3(50, 0, 0)); CheckAndSetWalkingAnimation(); } if (Input.GetKey(KeyCode.A)) { rb.AddRelativeForce(new Vector3(-50, 0, 0)); CheckAndSetWalkingAnimation(); } if (Input.GetKey(KeyCode.W)) { rb.AddRelativeForce(new Vector3(0, 0, 50)); CheckAndSetWalkingAnimation(); } if (Input.GetKey(KeyCode.S)) { rb.AddRelativeForce(new Vector3(0, 0, -50)); CheckAndSetWalkingAnimation(); } if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D)) { objectwithAnim.SetBool("Walk", false); } } }
Další, níže uvedené podmínky, budeme vkládat do této
podmínky, tj. if (!running)
.
Podmínky při střílení
Nyní tři podmínky. První se spustí, pokud hráč střílí. Zbylé
podmínky budou nastavovat animace střílení. Tyto tři podmínky si vložíme
hned za podmínku if (!running)
:
void Update() { if (!running) { if (Input.GetMouseButtonDown(0) && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect") && !objectwithAnim.GetBool("Holster")) { objectwithAnim.SetBool("Run", false); objectwithAnim.SetBool("Shoot", true); } if (Input.GetMouseButtonUp(0)) { objectwithAnim.SetBool("Shoot", false); } if (objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", false); } ... } }
Použitím metody Input.GetMouseButtonDown(0)
zjistíme, zda je
levé tlačítko myši stisknuté: hodnota true
znamená, že je
stisknuté. Pokud bychom chtěli zjistit stav pravého tlačítka, použijeme
index 1
místo 0
. Metoda
Input.GetMouseButtonUp(0)
vrací opačně, pokud je levé
tlačítko myši uvolněné.
Poslední podmínky
Nakonec přidáme podmínky, které nám budou nastavovat zbylé animace pro
míření, prohlížení zbraně a
vytažení zbraně. Tyto podmínky si vložíme na konec těla
podmínky if (!running)
:
void Update() { if (!running) { ... if (Input.GetMouseButton(1)) { objectwithAnim.SetBool("Aim", true); } else { objectwithAnim.SetBool("Aim", false); } if (Input.GetKeyDown(KeyCode.T)) { objectwithAnim.SetTrigger("Inspect"); } if (Input.GetKeyDown(KeyCode.Z)) { objectwithAnim.SetBool("Holster", !objectwithAnim.GetBool("Holster")); } } }
Metoda
CheckAndSetWalkingAnimation()
A na závěr si definujeme novou metodu
CheckAndSetWalkingAnimation()
, která nám bude nastavovat parametr
Walk
na hodnotu true
, pokud se nepřehrává animace
střelby. Metodu si napíšeme na konec skriptu Move
:
void CheckAndSetWalkingAnimation() { if (!objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", true); } }
Testování
Po spuštění naší hry můžeme vidět:
- animaci střelby za chůze, i stání,
- míření, když jdeme nebo stojíme,
- střílení po jednotlivém výstřelu nebo automatickou palbu.
Zde je krátká ukázka pár věcí ze zmíněných:
Při hře se zároveň dívejme do záložky Animator. Uvidíme jaká animace zrovna probíhá a v jaké je části.
V příští lekci, 3D střílečka v Unity - Střelba na nepřítele, si implementujeme střelbu na nepřítele. Spustíme animaci výstřelu a zároveň posuneme zasažený objekt.
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 231x (3.83 kB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET