6. diel - 3D strieľačka v Unity - Ovládanie animácií
V minulej lekcii, 3D strieľačka v Unity - Príprava animácií , sme pridali prechody a podmienky k ďalším animáciám zbrane: Beh, Streľba, Schovanie zbrane, Prezretie zbrane.
Minule sme si pripravili všetko pre ovládanie animácií a teraz už nám stačí len pár drobností a môžeme sa vrhnúť na programovanie. Dnes skončíme už s funkčnými animáciami:
Zmena parametra animácie strieľanie
Tvorca nášho naimportovaného balíčka mal pravdepodobne v pláne, že
zbraň bude strieľať len jednotlivé guľky. Ľavé tlačidlo myši ->
výstrel -> pustiť tlačidlo -> a tak znovu dokola. Preto vytvoril
parameter Shoot
ako typ trigger
a nie
bool
. My ale chceme ako správny nenásytný vývojár oboje, teda
ako možnosť jednotlivých striel, tak streľbu dávkovanou. Môže to znieť
zložito, ale budeme to mať hotové v priebehu niekoľkých krokov.
Zmena typu parametra
Shoot
V minulých lekcií sme s týmto už počítali a preto máme parametre
Shoot
všetkých prechodov ako trigger
. Keď totiž
meníme typ parametra na bool
, predvolená hodnota v prechode je
vždy true
a to my potrebujeme.
Zmenu vykonáme nasledovne: Otvoríme si záložku Animator
a pozrieme sa na časť s parametrami. Tu vidíme všetky
parametre obsiahle v animátore. Klikneme na parameter
Shoot
pravým tlačidlom, zvolíme Delete a
potvrdíme:
Následne klikneme na tlačidlo so znamienkom plus pre pridanie nového
parametra a zvolíme bool
:
Zadáme parametra názov Shoot
.
Zas ho opíšte presne tak, ako je tu napísaný. Zmena jediného písmena spôsobí nefunkčnosť animácií s ním spojených.
Úprava skriptu Move
Teraz môžeme upraviť náš skript Move
tak, aby sa aktivovali
jednotlivé prechody, keď to potrebujeme.
Ak si spustíte hru a zároveň sa budete pozerať na Animator, uvidíte aká animácie zrovna prebieha a v akej je časti:
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 metóde Update()
sme upravili podmienku:
if (!objectwithAnim.GetBool("Aim") && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect")) { }
Tu využívame metódu GetBool()
, aby sme zistili, akú hodnotu
má parameter Aim
. Ak je true
, vieme, že mierime
zbraní. Potom využívame metódu GetCurrentAnimatorStateInfo()
.
Do zátvoriek sa píše vrstva, v ktorej je naša animácia. Prevažná
väčšina animácií je vo vrstve nula. Touto metódou zistíme, či sa
animácia prehráva. Analogicky môžeme parameter nastaviť pomocou
SetBool()
.
Vysvetlenie si žiada určite aj:
Cursor.visible = false;
Ak je hodnota Cursor.visible
nastavená na false
,
nie je naša myš vidieť potom, čo spustíme hru. Je to možné vidieť už v
Unity Editore po spustení hry. Predvolená hodnota je
nastavená na true
. Preto môžete vidieť kurzor hneď, čo
vytvoríte nový projekt a spustíte hru.
Vo výsledku uvidíme animáciu streľby za chôdze, aj keď stojíme na mieste, mierenie, keď ideme alebo stojíme, strieľanie po jednotlivom výstrele alebo automatickou paľbu. Tu je krátka ukážka pár vecí zo spomínaných:
V budúcej lekcii, 3D strieľačka v Unity - Efekty streľby , si urobíme efekt streľby, zvuk výstrelu a pridáme si mieridlá.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 231x (3.83 kB)