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 dalším animacím zbraně: Běh, Střelba, Schování zbraně, Prohlédnutí zbraně.
Minule jsme si připravili vše pro ovládání animací a nyní už nám stačí jen pár drobností a můžeme se vrhnout na programování. Dnes skončíme již s funkčními animacemi:

Změna parametru animace střílení
Tvůrce našeho naimportované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í jsme s tímto již počítali a proto máme parametry
Shoot
všech přechodů jako 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 se znaménkem plus pro přidání nového
parametru a zvolíme bool
:

Zadáme parametru název Shoot
.
Zas ho opište přesně tak, jak je zde napsán. Změna jediného písmene způsobí nefunkčnost animací s ním spojených.
Úprava skriptu Move
Nyní můžeme upravit náš skript Move
tak, aby se aktivovaly
jednotlivé přechody, když to potřebujeme.
Pokud si spustíte hru a zároveň se budete dívat na Animator, uvidíte jaká animace zrovna probíhá a v jaké je části:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { Rigidbody rb; // proměnná, která zastupuje naši komponentu Rigidbody Animator objectwithAnim; bool running; // hodnota running je rovna true tehdy, když běžíme a nemůžeme dělat nic jiného bool nicnedelani; void Start() { rb = transform.GetComponent<Rigidbody>(); // získáme komponentu Rigidbody objektu se skriptem objectwithAnim = GameObject.FindGameObjectWithTag("Animobject").GetComponent<Animator>(); // metoda FindGameObjectWithTag() vyhledá herní objekt, který má tag = Animobject. Tag našemu objektu nastavíme později v editoru. Cursor.visible = false; } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.LeftShift) && !objectwithAnim.GetBool("Aim") && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect")) // pokud držíme W a zároveň levý Shift, nemíříme a není aktivní animace Inspect { rb.AddRelativeForce(new Vector3(0, 0, 70)); // přidáme v aktuálním směru hodnotu větší než při chůzi, protože držíme Shift a "běžíme" // Bool Run rozhoduje o tom, jestli se spustí animace běhu nebo ne objectwithAnim.SetBool("Run", true); // spustíme animaci běhu změněním bool parametru running = true; // náš bool, pomocí kterého pozná náš program, že hráč běží } else // pokud se nespustí podmínka výše, nastaví se bool hodnota na false a program ví, že hráč zrovna neběží { objectwithAnim.SetBool("Run", false); // zastaví se animace running = false; } if (!running) // pokud hráč neběží, tak se spustí podmínky níže { if (Input.GetMouseButtonDown(0) && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect") && !objectwithAnim.GetBool("Holster")) // pokud se stisklo levé tlačítko (označení 0), nepřehrává se animace Inspect a zároveň není zbraň schována { objectwithAnim.SetBool("Run", false); // zastavujeme animaci běhu a chůze, aby se mohla spustit animace střelby objectwithAnim.SetBool("Shoot", true); // aktivujeme parametry trigger, jako jsou Shoot a Inspect v našem případě } if (Input.GetMouseButtonUp(0)) { objectwithAnim.SetBool("Shoot", false); } if (objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", false); // 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é } if (Input.GetKey(KeyCode.D)) // pokud někdo stiskne klávesu W, spustí se tato podmínka, dokud bude klávesa držena { rb.AddRelativeForce(new Vector3(50, 0, 0)); // na proměnnou přešly vlastnosti a metody komponenty Rigidbody. // metoda AddForce() přidá sílu do určitého směru, který nastavujeme pomocí os x y z. if (!objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", true); // pomocí animátoru získáme možnost upravovat animace, které jsou k tomuto objektu přichycené. } // jednou z funkcí komponenty Animator je změnit hodnotu parametru } if (Input.GetKey(KeyCode.A)) { rb.AddRelativeForce(new Vector3(-50, 0, 0)); if (!objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", true); } } if (Input.GetKey(KeyCode.W)) { rb.AddRelativeForce(new Vector3(0, 0, 50)); if (!objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", true); } } if (Input.GetKey(KeyCode.S)) { rb.AddRelativeForce(new Vector3(0, 0, -50)); if (!objectwithAnim.GetBool("Shoot")) { objectwithAnim.SetBool("Walk", true); } } if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D)) // pokud pustíme W a S nebo D, tak se spustí tato podmínka { objectwithAnim.SetBool("Walk", false); } if (Input.GetMouseButton(1)) // pravé tlačítko (označení 1) { objectwithAnim.SetBool("Aim", true); // nastaví hodnotu parametru Aim } else { objectwithAnim.SetBool("Aim", false); // nastaví hodnotu parametru Aim typu bool na false } if (Input.GetKeyDown(KeyCode.T)) { objectwithAnim.SetTrigger("Inspect"); } if (Input.GetKeyDown(KeyCode.Z)) { objectwithAnim.SetBool("Holster", !objectwithAnim.GetBool("Holster")); } } } }
V metodě Update()
jsme upravili podmínku:
if (!objectwithAnim.GetBool("Aim") && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect")) { }
Zde využíváme metodu GetBool()
, abychom zjistili, jakou
hodnotu má parametr Aim
. Pokud je true
, víme, že
míříme zbraní. Poté využíváme metodu
GetCurrentAnimatorStateInfo()
. Do závorek se píše vrstva, ve
které je naše animace. Převážná většina animací je ve vrstvě nula.
Touto metodou zjistíme, jestli se animace přehrává. Analogicky můžeme
parametr nastavit pomocí SetBool()
.
Vysvětlení si žádá určitě i:
Cursor.visible = false;
Pokud je hodnota Cursor.visible
nastavena na false
,
není naše myš vidět poté, co spustíme hru. Je to možné vidět již v
Unity Editoru po spuštění hry. Výchozí hodnota je
nastavena na true
. Proto můžete vidět kurzor hned, co
vytvoříte nový projekt a spustíte hru.
Ve výsledku uvidíme animaci střelby za chůze, i když stojíme na místě, 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:

V příští lekci, 3D střílečka v Unity - Střelba na nepřítele, si vytvoříme skript pro střelbu, který bude ubírat nepříteli životy a odstrkovat ho ve směru střely v důsledku síly.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 184x (8.66 kB)