BLACK FRIDAY! Slevy až 80 % jsou všude. Tak je nepropásni a přejdi do rostoucího IT oboru!
The real BF 2020

Lekce 7 - 3D střílečka v Unity - Efekty střelby

V minulé lekci, 3D střílečka v Unity - Ovládání animací, jsme si upravili skript Move.cs tak, aby nám ovládal naše animace.

V dnešní lekci si vytvoříme efekt střelby, zvuk výstřelu a přidáme si mířidla. Tyto jednotlivé věci vyjma efektu střelby jsou v našem naimportovaném balíčku a proto si budeme muset stáhnout nově pouze efekt výstřelu.

Naimportování efektu výstřelu

Efekt výstřelu si naimportujeme opět z Unity Asset Store. Půjde o balíček s výbuchy, výstřely a jinými vizuálními efekty, které se nám můžou hodit.

Klikneme na záložku Asset Store. Zde klikneme levým tlačítkem na vyhledávací pole a do něj vepíšeme War FX a stisknete Enter:

Pokud vám balíček nejde stáhnout, je ke stažení v příloze pod dnešní lekcí.

Tento balíček obsahuje všechny efekty, které se nám budou hodit a je zcela zdarma. Samozřejmě můžete použít jiný balíček, který najdete a bude se vám líbit, doporučuji ale stáhnout prvně tento a pracovat podle návodu zde a až pak si to zkusit s jiným balíčkem efektů.

Klikneme levým tlačítkem na ikonu balíčku s názvem War FX a tím ho otevřeme. Zde uvidíme výrazně modré tlačítko Download. Klikneme na něj. Po stažení balíčku se nám změní tlačítko Download na tlačítko Import. Jednou na něj klikneme. Poté se nám zobrazí uprostřed obrazovky ukazatel, značící kolik nám toho chybí, aby se mohl balíček naimportovat:

Jakmile ukazatel zmizí, objeví se nám nové okénko, ve kterém máme možnost zvolit si co z balíčku chceme naimportovat. Výchozí hodnota je vše. Nám to tak vyhovuje a tak klikneme na tlačítko Import v pravém dolním rohu. Objeví se nám znovu ukazatel, kolik toho máte naimportovaného, a jakmile zmizí, máme balíček naimportovaný. Obvykle to zabere něco okolo pár minut, záleží na vašem počítači.

Tvorba mířidel

Mířidla vytvoříme jednoduše a přímo v Unity Editoru. Klikneme pravým tlačítkem na volnou plochu v záložce Hierarchy. Zobrazí se nám nabídka možností. Zvolíme UI jako User Interface a možnost Image. V záložce Hierarchy se nám vytvoří objekt s názvem Canvas a jako podobjekt má Image:

Pokud budeme kdykoliv tvořit něco z možnosti UI, musí být vytvořený objekt, umístěný jako podobjekt objektu Canvas, jinak nebude viditelný! Představme si Canvas jako plátno, na kterém můžeme vykreslovat obrázky, tlačítka, různé posuvníky a jiné, ale všechny ty obrázky, tlačítka, posuvníky, musí být podobjektem Canvas:

Klikneme na podobjekt Image. V záložce Inspector je obdélník pojmenovaný Source Image. Klikneme na kroužek s tečkou uprostřed, který se nachází úplně vpravo ve stejné úrovni, jako je nápis Source Image. Objeví se nám vyhledávací okénko s nadpisem Select Sprite. Vepíšeme do vyhledávacího okénka Knob a na vyhledaný obrázek dvakrát klikneme:

Poté v záložce Inspector u komponenty Rect Transform nastavíme šířku a výšku například na 10, 10.

Nastavení efektu výstřelu

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

Efekty se v Unity používají stejně jako objekty. Můžeme jim nastavit pozici, rozměry a umísťovat na ně komponenty. Takže umístíme objekt našeho efektu na scénu, určíme mu pozici a nastavíme ho jako podobjekt naší zbrani, aby se otáčel s ní.

Klikneme levým tlačítkem v záložce Project na složku s názvem JMO Assets -> WarFX -> _Effects -> MuzzleFlashes -> FPS. Zde můžeme jednotlivé soubory otevřít dvojitým kliknutím. Zobrazí se nám otevřené v záložce Scene. Podle toho, jaký se vám líbí, si ho můžete zvolit. Já si vybírám ten poslední s názvem WFX_MF FPS RIFLE3. Klikneme na daný soubor a v záložce Inspector se nám zobrazí komponenta s názvem Particle System.

Zde vidíme jednotlivé možnosti nastavení. Vypneme možnost Play On Awake:

Kdybychom to neudělali, spouštěl by se nám náš efekt, jakmile bychom spustili hru a efekt by byl na scéně.

Nyní můžeme náš zvolený efekt přetáhnout myší na volné místo v záložce Hierarchy. Tímto úkonem jsme si přetáhli náš efekt na scénu.

Klikneme na efekt na scéně a změníme mu pozici tak, aby se nacházel u hlavně zbraně. U mě to byla pozice 5, 1.418 a 5.755. Pozici můžeme měnit stejně jako u normálních objektů, takže můžeme jak nastavovat transform, tak i tahat jednotlivými šipičkami, které se nám zobrazí po kliknutí na náš efekt na scéně. Musíme být v záložce Scene, abychom je viděli.

Vaše pozice efektu se může lišit, záleží na pozici hráče. Pozici nastavujte raději před nastavením efektu jako podobjektu zbraně. Jakmile nastavíme efekt jako podobjekt, tak se pozice efektu odvíjí od "rodiče" našeho objektu (efektu):

Poté znovu klikneme na náš efekt na scéně a táhneme na pozici našeho objektu Components. Tímto jsme nastavili náš efekt jako podobjekt naší zbraně, díky tomu se bude při rotaci naší zbraně měnit rotace i efektu.

Odstranění skriptu

Teď potřebujeme smazat kód, který zde implementoval tvůrce efektu. Nejdříve klikneme pravým tlačítkem na náš efekt ve scéně a zvolíme možnost Unpack Prefab Completely. Následně se podíváme do záložky Inspector a odstraníme komponentu s názvem WFX_Demo_Delete After Delay (Script) kliknutím na tlačítko se třemi tečkami a zvolením možnosti Remove Component:

Stejný úkon provedeme u podobjektu našeho efektu s názvem Light:

Přidávání tagů

Nyní si ještě přidáme tag našemu efektu, abychom ho mohli v našem skriptu najít. Klikněme na objekt s názvem WFX_MF FPS RIFLE3 a v záložce Inspector klikneme na políčko s názvem Tag. Zde zvolíme možnost Add Tag.

Zobrazí se nám všechny tagy, které v našem projektu již máme. My klikneme na tlačítko se symbolem plus. Napíšeme effekt. Znovu klikneme na náš objekt WFX_MF FPS RIFLE3 a nastavíme mu tag na effekt:

Nyní klikneme na náš objekt Assault_Rifle_01_FPSController a deaktivujeme komponentě AudioSource vlastnost Loop.

Už nám zbývá jen přidat tag našim mířidlům. Klikneme na objekt s názvem Image, který se nachází pod objektem Canvas, a obdobným způsobem přidáme objektu Image tag s názvem crosshair.

Pokud budete skript upravovat sami, potřebujete vědět následující informace. Zvuk výstřelu je přichycen už z naimportovaného balíčku na objektu Assault_Rifle_01_FPSController. Komponenta, která uchovává zvukovou stopu a umožňuje ji ovládat, se jmenuje AudioSource.

Nyní se můžeme vrhnout na programování.

Úprava skriptu shoot

Pojďme si ukázat prvně upravený skript, který si záhy vysvětlí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 této úpravě si nejdříve ze všeho v metodě Start() nastavíme hodnotu proměnné effekt. To je proměnná typu ParticleSystem, což je konkrétní komponenta určitého herního objektu. V našem případě je to komponenta ParticleSystem, která je na objektu s tagem effekt.

Poté jsme si vytvořili podmínku, že pokud effekt zrovna hraje a zároveň hraje déle než 0.15 sekundy, tak se jeho přehrávání zastaví. To proto, že efekt, který používáme, je několik efektů výstřelů za sebou. Tímto si ohlídáme, aby se vždy spustil jen jednou a nebylo jich více přes sebe.

Na tento čas jsem přišel tak, že jsem si vždy nastavil určitou hodnotu a spustil hru. Zkoušel jsem to do té doby, dokud to nevypadalo na jeden samotný výstřel. Schválně si můžete zkusit spustit hru bez této podmínky a uvidíte, že se vám effekt spustí několikrát i po jednom samotném výstřelu.

Poté jsme do naší metody Shoot() přidali zastavení efektu a poté spuštění. Stejné to bylo i se zvukem. Toto máme z důvodu, že když vystřelíme, tak tím automaticky zastavíme minulý výstřel a pokud z nějakého důvodu nebyla splněna podmínka se zastavením efektu po 0.15 sekundách, tak zde se zastaví určitě.

V příští lekci, 3D střílečka v Unity - Střelba na nepřítele, si vytvoříme skript pro střelbu, který bude ubírat nepříteli životy a odstrkovat ho ve směru střely v důsledku síly.


 

Stáhnout

Staženo 7x (8.57 MB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET

 

Předchozí článek
3D střílečka v Unity - Ovládání 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?
1 hlasů
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity (2)

 

 

Komentáře

Avatar
Maso Masaty
Člen
Avatar
Maso Masaty:11. listopadu 10:02

Ehm ahoj, prosimtě, píše mi to že neexistuje komponenta EnemyHealth, můžu se zeptat proč a co proto mam dělat aby to šlo? Díky předem za odpověď

 
Odpovědět
11. listopadu 10:02
Avatar
Tomáš Brabec
Brigádník
Avatar
Odpovídá na Maso Masaty
Tomáš Brabec:11. listopadu 10:09

Máš vytvořený skript s názvem dopísmene: "EnemyHealth" a umístěný ho na objektu ze, kterého se snažíme získat v tomto případě na našem nepříteli?

 
Odpovědět
11. listopadu 10:09
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Maso Masaty
Člen
Avatar
Odpovídá na Tomáš Brabec
Maso Masaty:11. listopadu 14:04

Jasně já už to pochopil, on se dělá až v další lekci stejně jako shoot, který se v téhle lekci vylepšuje :D asi jsou nějak prohozené

 
Odpovědět
11. listopadu 14:04
Avatar
Tomáš Brabec
Brigádník
Avatar
Odpovídá na Maso Masaty
Tomáš Brabec:11. listopadu 14:53

Máte pravdu :) omlouvám se za zmatek :)

 
Odpovědět
11. listopadu 14:53
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.

Zobrazeno 4 zpráv z 4.