Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

Následně klikneme na tlačítko + pro přidání nového parametru a zvolíme Bool:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

Při hře se zároveň dívejme do záložky Anima­tor. 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 218x (3.83 kB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET

 

Předchozí článek
3D střílečka v Unity - Příprava animací
Všechny články v sekci
Tvorba 3D her v Unity
Přeskočit článek
(nedoporučujeme)
3D střílečka v Unity - Střelba na nepřítele
Článek pro vás napsal Tomáš Brabec
Avatar
Uživatelské hodnocení:
26 hlasů
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity