Lekce 8 - 3D střílečka v Unity - Efekty střelby
V minulé lekci, 3D střílečka v Unity - Střelba na nepřítele, jsme si vytvořili skript pro střelbu na nepřítele.
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
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 další lekci, 3D střílečka v Unity - Úprava terénu, se naučíme upravovat terén, přidávat stromy a trávu.
Stáhnout
Staženo 15x (8.57 MB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET
Komentáře


Zobrazeno 8 zpráv z 8.