IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

7. diel - 3D strieľačka v Unity - Efekty streľby

V minulej lekcii, 3D strieľačka v Unity - Ovládanie animácií , sme si upravili skript Move.cs tak, aby nám ovládal naše animácie.

V dnešnej lekcii si vytvoríme efekt streľby, zvuk výstrelu a pridáme si mieridlá. Tieto jednotlivé veci okrem efektu streľby sú v našom importovaná balíčka a preto si budeme musieť stiahnuť novo len efekt výstrelu.

Naimportovaní efektu výstrelu

Efekt výstrele si importujete opäť z Unity Asset Store. Pôjde o balíček s výbuchy, výstrely a inými vizuálnymi efektmi, ktoré sa nám môžu hodiť.

Klikneme na záložku Asset Store. Tu klikneme ľavým tlačidlom na vyhľadávacie pole a do neho vpíšeme War FX a stlačíte Enter:

Tvorba 3D hier v Unity

Ak vám balíček nejde stiahnuť, je k stiahnutiu v prílohe pod dnešnej lekcií.

Tento balík obsahuje všetky efekty, ktoré sa nám budú hodiť a je úplne zadarmo. Samozrejme môžete použiť iný balík, ktorý nájdete a bude sa vám páčiť, odporúčam ale stiahnuť prvýkrát tento a pracovať podľa návodu tu a až potom si to skúsiť s iným balíčkom efektov.

Klikneme ľavým tlačidlom na ikonu balíčku s názvom War FX a tým ho otvoríme. Tu uvidíme výrazne modré tlačidlo Download. Klikneme na neho. Po stiahnutí balíčka sa nám zmení tlačidlo Download na tlačidlo Import. Raz na neho klikneme. Potom sa nám zobrazí uprostred obrazovky ukazovateľ, značiaci koľko nám toho chýba, aby sa mohol balíček naimportovať:

Tvorba 3D hier v Unity

Akonáhle ukazovateľ zmizne, objaví sa nám nové okienko, v ktorom máme možnosť zvoliť si čo z balíčka chceme naimportovať. Predvolená hodnota je všetko. Nám to tak vyhovuje a tak klikneme na tlačidlo Import v pravom dolnom rohu. Objaví sa nám znovu ukazovateľ, koľko toho máte naimportovaného, a akonáhle zmizne, máme balíček importovaná. Zvyčajne to zaberie niečo okolo pár minút, záleží na vašom počítači.

Tvorba mieridiel

Mieridlá vytvoríme jednoducho a priamo v Unity Editore. Klikneme pravým tlačidlom na voľnú plochu v záložke Hierarchy. Zobrazí sa nám ponuka možností. Zvolíme UI ako User Interface a možnosť Image. V záložke Hierarchy sa nám vytvorí objekt s názvom Canvas a ako podobjektoch má Image:

Tvorba 3D hier v Unity
Ak budeme kedykoľvek tvoriť niečo z možnosti UI, musí byť vytvorený objekt, umiestnený ako podobjektoch objektu Canvas, inak nebude viditeľný! Predstavme si Canvas ako plátno, na ktorom môžeme vykresľovať obrázky, tlačidlá, rôzne posuvníky a iné, ale všetky tie obrázky, tlačidlá, posuvníky, musí byť podobjektoch Canvas:

Klikneme na podobjektoch Image. V záložke Inspector je obdĺžnik pomenovaný Source Image. Klikneme na krúžok s bodkou uprostred, ktorý sa nachádza úplne vpravo v rovnakej úrovni, ako je nápis Source Image. Objaví sa nám vyhľadávací okienko s nadpisom Select Sprite. Vpíšeme do vyhľadávacieho okienka Knob a na vyhľadaný obrázok dvakrát klikneme:

Tvorba 3D hier v Unity

Potom v záložke Inspector u komponenty Rect Transform nastavíme šírku a výšku napríklad na 10, 10.

Nastavenie efektu výstrelu

Efekty sa v Unity používajú rovnako ako objekty. Môžeme im nastaviť pozíciu, rozmery a umiestňovať na ne komponenty. Takže umiestnime objekt nášho efektu na scénu, určíme mu pozíciu a nastavíme ho ako podobjektoch našej zbrani, aby sa otáčal s ňou.

Klikneme ľavým tlačidlom v záložke Project na priečinok s názvom JMO Assets -> WarFX -> _Effects -> MuzzleFlashes -> FPS. Tu môžeme jednotlivé súbory otvoriť dvojitým kliknutím. Zobrazí sa nám otvorené v záložke Scene. Podľa toho, aký sa vám páči, si ho môžete zvoliť. Ja si vyberám ten posledný s názvom WFX_MF FPS RIFLE3. Klikneme na daný súbor a v záložke Inspector sa nám zobrazí komponenta s názvom Particle System.

Tu vidíme jednotlivé možnosti nastavenia. Vypneme možnosť Play On Awake:

Tvorba 3D hier v Unity

Keby sme to neurobili, spúšťal by sa nám náš efekt, akonáhle by sme spustili hru a efekt by bol na scéne.

Teraz môžeme náš zvolený efekt pretiahnuť myšou na voľné miesto v záložke Hierarchy. Týmto úkonom sme si pretiahli náš efekt na scénu.

Klikneme na efekt na scéne a zmeníme mu pozíciu tak, aby sa nachádzal u hlavne zbrane. U mňa to bola pozícia 5, 1.418 a 5.755. Pozíciu môžeme meniť rovnako ako u normálnych objektov, takže môžeme ako nastavovať transform, tak i ťahať jednotlivými šipičkami, ktoré sa nám zobrazia po kliknutí na náš efekt na scéne. Musíme byť v záložke Scene, aby sme ich videli.

Vaša pozícia efektu sa môže líšiť, záleží na pozícii hráča. Pozíciu nastavujte radšej pred nastavením efektu ako podobjektoch zbrane. Akonáhle nastavíme efekt ako podobjektoch, tak sa pozícia efektu odvíja od "rodiča" nášho objektu (efektu):

Tvorba 3D hier v Unity

Potom znovu klikneme na náš efekt na scéne a ťaháme na pozícii nášho objektu Components. Týmto sme nastavili náš efekt ako podobjektoch našej zbrane, vďaka tomu sa bude pri rotácii našej zbrane meniť rotácie aj efektu.

Odstránenie skriptu

Teraz potrebujeme zmazať kód, ktorý tu implementoval tvorca efektu. Najskôr klikneme pravým tlačidlom na náš efekt v scéne a zvolíme možnosť Unpack Prefab Completely. Následne sa pozrieme do záložky Inspector a odstránime komponentu s názvom WFX_Demo_Delete After Delay (Script) kliknutím na tlačidlo s troma bodkami a zvolením možnosti Remove Component:

Tvorba 3D hier v Unity

Rovnaký úkon vykonáme u podobjektoch nášho efektu s názvom Light:

Tvorba 3D hier v Unity

Pridávanie tagov

Teraz si ešte pridáme tag nášmu efektu, aby sme ho mohli v našom skriptu nájsť. Kliknite na objekty s názvom WFX_MF FPS RIFLE3 a v záložke Inspector klikneme na políčko s názvom Tag. Tu zvolíme možnosť Add Tag.

Zobrazí sa nám všetky tagy, ktoré v našom projekte už máme. My klikneme na tlačidlo so symbolom plus. Napíšeme effekt. Znovu klikneme na náš objekt WFX_MF FPS RIFLE3 a nastavíme mu tag na effekt:

Tvorba 3D hier v Unity

Teraz klikneme na náš objekt Assault_Rifle_01_FPSController a deaktivujeme komponente AudioSource vlastnosť Loop.

Už nám zostáva len pridať tag našim mířidlům. Klikneme na objekt s názvom Image, ktorý sa nachádza pod objektom Canvas, a podobným spôsobom pridáme objektu Image tag s názvom crosshair.

Ak budete skript upravovať sami, potrebujete vedieť nasledujúce informácie. Zvuk výstrelu je prichytený už z naimportovaného balíčka na objekte Assault_Rifle_01_FPSController. Komponenta, ktorá uchováva zvukovú stopu a umožňuje ju ovládať, sa volá AudioSource.

Teraz sa môžeme vrhnúť na programovanie.

Úprava skriptu shoot

Poďme si ukázať prvýkrát upravený skript, ktorý si vzápätí vysvetlíme:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class shoot : MonoBehaviour
{
    RaycastHit hitInfo;
    Animator objectwithAnim;
    public float dostrel;
    public float sila;
    public float poskozeni;
    public GameObject efekttrefy;
    Image crosshair;
    ParticleSystem effekt;

    void Start()
    {
        objectwithAnim = GameObject.FindGameObjectWithTag("Animobject").GetComponent<Animator>();
        crosshair= GameObject.FindGameObjectWithTag("crosshair").GetComponent<Image>();
        effekt = GameObject.FindGameObjectWithTag("effekt").GetComponent<ParticleSystem>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)&&!objectwithAnim.GetBool("Run") && !objectwithAnim.GetBool("Holster") && !objectwithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect")) // pokud zmáčkneme levé tlačítko a neběžíme
        {
            InvokeRepeating("Shoot", 0, 0.25f); // opakuje metodu shoot, začíná okamžitě bez prodlevy, opakuje se každých 0.25 sekundy
        }
        if (objectwithAnim.GetBool("Aim"))
        {
            crosshair.enabled=false; // změní hodnotu na false
        }
        else
        {
            crosshair.enabled = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            CancelInvoke("Shoot"); // přestává se volat metoda Shoot()
        }
        if (effekt.isPlaying && effekt.time >= 0.15f) // pokud efekt výstřelu pořád hraje a je
// to delší doba než 15 setin sekundy, tak se efekt zastaví
        {
            effekt.Stop();
        }
    }

    void Shoot() // námi nově vytvořená metoda
    {
        effekt.Stop();
        effekt.Play();
        transform.GetComponent<AudioSource>().Stop(); // kdyby byl spuštěn ještě předchozí výstřel, tak ho zastaví, takto nedojde k tomu, že uslyšíme 15 výstřelů najednou
        transform.GetComponent<AudioSource>().Play(); // spustí zvuk, který už je
        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo,dostrel)) // pokud něco trefíme, parametry jsou: místo, odkud půjde polopřímka, směr, kam má ukládat informace o tom, co se zasáhlo, dálka, kam až povede
        {
            GameObject trefa= Instantiate(efekttrefy,hitInfo.point, Quaternion.LookRotation(hitInfo.normal));
            Destroy(trefa, 1);
            if (hitInfo.transform.GetComponent<Rigidbody>()) // pokud objekt, který jsme trefili, má komponentu Rigidbody
            {
                hitInfo.transform.GetComponent<Rigidbody>().AddForce(Camera.main.transform.forward * sila); // přidáme sílu ve směru, kterým se díváme
            }
            if (hitInfo.transform.GetComponent<EnemyHealth>()) // pokud objekt, který jsme trefili, má komponentu EnemyHealth
            {
                hitInfo.transform.GetComponent<EnemyHealth>().GetDammage(poskozeni); // spouštíme metodu v jiném skriptu, parametrem jsme si nastavili množství poškození
            }
        }
    }
}

V tejto úprave si najskôr zo všetkého v metóde Start() nastavíme hodnotu premennej effekt. To je premenná typu ParticleSystem, čo je konkrétna komponenta určitého herného objektu. V našom prípade je to komponenta ParticleSystem, ktorá je na objekte s tagom effekt.

Potom sme si vytvorili podmienku, že ak effekt zrovna hrá a zároveň hrá dlhšie než 0.15 sekundy, tak sa jeho prehrávanie zastaví. To preto, že efekt, ktorý používame, je niekoľko efektov výstrelov za sebou. Týmto si postrážime, aby sa vždy spustil len raz a nebolo ich viac cez seba.

Na tento čas som prišiel tak, že som si vždy nastavil určitú hodnotu a spustil hru. Skúšal som to dovtedy, kým to nevyzeralo na jeden samotný výstrel. Schválne si môžete skúsiť spustiť hru bez tejto podmienky a uvidíte, že sa vám effekt spustí niekoľkokrát aj po jednom samotnom výstrele.

Potom sme do našej metódy Shoot() pridali zastavenie efektu a potom spustení. Rovnaké to bolo aj so zvukom. Toto máme z dôvodu, že keď vystrelíte, tak tým automaticky zastavíme minulý výstrel a ak z nejakého dôvodu nebola splnená podmienka sa zastavením efektu po 0.15 sekundách, tak tu sa zastaví určite.

V budúcej lekcii, 3D strieľačka v Unity - Streľba na nepriateľa , si vytvoríme skript pre streľbu, ktorý bude uberať nepriateľovi životy a odstrkovať ho v smere strely v dôsledku sily.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 57x (8.64 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
3D strieľačka v Unity - Ovládanie 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 - Streľba na nepriateľa
Č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