Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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:

Tvorba 3D hier v Unity

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:

Tvorba 3D hier v Unity

Následne klikneme na tlačidlo so znamienkom plus pre pridanie nového parametra a zvolíme bool:

Tvorba 3D hier v Unity

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:

Tvorba 3D hier v Unity

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 podmienkami

Stiahnuté 231x (3.83 kB)

 

Predchádzajúci článok
3D strieľačka v Unity - Príprava animácií
Všetky články v sekcii
Tvorba 3D hier v Unity
Preskočiť článok
(neodporúčame)
3D strieľačka v Unity - Efekty streľby
Článok pre vás napísal Tomáš Brabec
Avatar
Užívateľské hodnotenie:
2 hlasov
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity