BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Lekce 6 - 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:

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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 - Efekty střelby, si uděláme efekt střelby, zvuk výstřelu a přidáme si mířidla.


 

Stáhnout

Staženo 6x (8.66 kB)

 

Předchozí článek
3D střílečka v Unity - Příprava animací
Všechny články v sekci
Tvorba 3D her v Unity
Článek pro vás napsal Tomáš Brabec
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!