Lekce 9 - 3D střílečka v Unity - Efekty střelby
V předchozím kvízu, Kvíz - Animace zbraně a střelba na nepřítele v Unity3D, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním Unity 3D tutoriálu si přidáme mířidla z již stáhnutého balíčku. Poté implementujeme efekt střelby, pro který si stáhneme nový balíček z Unity Store.
Tvorba mířidel
Mířidla vytvoříme přímo v Unity Editoru. Klikneme pravým tlačítkem na volnou plochu v záložce Hierarchy. V zobrazeném okně vybereme UI jako User Interface a možnost Image. V záložce Hierarchy se nám vytvoří objekt s názvem Canvas s objektem Image:
Pokud budeme kdykoliv tvořit něco z možnosti UI, musí být vytvořený objekt umístěný jako součást objektu Canvas, jinak nebude viditelný! Canvas je jako plátno, na kterém můžeme vykreslovat obrázky, tlačítka, různé posuvníky a podobně.
Klikneme na objekt Image. V záložce Inspector vidíme
obdélník s názvem 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. Do vyhledávacího okénka napíšeme 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 hodnoty 10
,
10
. Potom nastavíme pozici X a Y
na 0
.
Efekt výstřelu
Nejprve si naimportujeme balíček efektu výstřelu, provedeme nastavení efektu výstřelu a nakonec odstraníme jeho skript.
Import balíčku 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.
Přejdeme na oficiální stránku Asset Store a vyhledáme zdarma balíček War FX:
Pokud vám balíček nejde stáhnout, je ke stažení v příloze.
Poté na balíček klikneme levým tlačítkem. Na balíčku klikneme na modré tlačítko přidat do mých zdrojů. Po přidání balíčku se nám objeví tlačítko otevřít v Unity, na které klikneme. V zobrazeném dialogovém okně pak klikneme na tlačítko Spustit aplikaci Unity Editor. V otevřeném Unity Editoru klikneme na tlačítko Download a po stažení klikneme na tlačítko Import. Po zobrazení dalšího okna znovu klikneme na tlačítko Import.
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. Objekt našeho efektu umístíme na scénu, určíme mu pozici a nastavíme ho jako objekt naší zbraně, aby se otáčel s ní.
V záložce Project přejdeme na
JMO Assets/WarFX/Effects/MuzzleFlashes/FPS
. Zobrazené soubory
můžeme dvojklikem otevřít a rozhodnout se, které efekty se nám líbí.
Vybereme si například ten poslední s názvem WFX_MF FPS RIFLE3
.
Klikneme na něj. V záložce Inspector se nám zobrazí komponenta s
názvem Particle System, v které vidíme jednotlivé možnosti
nastavení. Vypneme možnost Play On Awake:
Kdybychom Play On Awake neodškrtli, spouštěl by se nám náš efekt, jakmile bychom spustili hru a efekt by byl na scéně.
Nyní náš efekt WFX_MF FPS RIFLE3
přetáhnneme myší na
scénu, tj. na volné místo v záložce Hierarchy. Dále klikneme na
efekt WFX_MF FPS RIFLE3
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
. Vaše pozice efektu se může lišit, záleží na pozici
hráče. Pozici nastavujme raději před nastavením efektu objektu zbraně.
Jakmile nastavíme efekt jako podobjekt, tak se pozice efektu odvíjí od
"rodiče" našeho objektu:
Poté znovu klikneme na náš efekt na scéně a táhneme na pozici našeho objektu Components, který se nachází v objektu Assult_rigle01.... 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 efektu výstřelu
Vytvořený skript efektu výstřelu tvůrcem balíčku smažeme, protože
využijeme náš vlastní skript Shoot
. Ve scéně
SampleScene klikneme pravým tlačítkem na náš efekt výstřelu
WFX_MF FPS RIFLE3 a z nabídky zvolíme Prefab =>
Unpack Completely:
V záložce Inspector odstraníme komponentu s názvem WFX_Demo_Delete After Delay (Script) kliknutím na tlačítko ... a zvolením možnosti Remove Component:
Stejný úkon provedeme u objektu našeho efektu s názvem Light:
Přidání tagů
Přidáme si tag pro efekt výstřelu, a také našim mířidlům.
Tagy přidáváme proto, abychom s efekty mohli pracovat ve skriptech.
Tag pro efekt výstřelu
Klikněme na objekt s názvem WFX_MF FPS RIFLE3. V záložce
Inspector klikneme na políčko s názvem Tag. Z nabídky
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 +.
Napíšeme EffectShoot
. Znovu klikneme na náš objekt WFX_MF
FPS RIFLE3 a nastavíme mu tag na EffectShoot:
Tag pro mířidla
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.
Úprava objektu Assault_Rifle01_FPSController
Klikneme na náš objekt Assault_Rifle01_FPSController:
- deaktivujeme komponentě AudioSource vlastnost Loop, čímž zrušíme opakování zvuku pořád dokola,
- nastavíme vlastnost Pitch na
2.5
, čímž upravíme zvuk výstřelu, aby znělo jako výstřel z naší zbraně, - nastavíme vlastnost AudioClip na
shoot
. Jedná se o zvuk výstřelu.
Všechno nastavení vidíme na následujícím obrázku:
Nyní se můžeme vrhnout na programování.
Úprava skriptu Shoot.cs
A můžeme se vrhnout na úpravu našeho skriptu Shoot.
Přidání knihovny
Nejdříve musíme přidat novou knihovnu UnityEngine.UI
:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // Tento řádek jsme přidali
Pomocí této knihovny budeme moc používat komponenty UI (User Interface).
Proměnné
Do skriptu přidáme tyto proměnné:
crosshair
typuImage
- pro získání našeho crosshairu,efektVystrelu
typuParticleSystem
- pro získání našeho efektu,audioSource
typuAudioSource
- pro získání komponenty AudioSource.
Kód je následující:
public class Shoot : MonoBehaviour { ... Image crosshair; ParticleSystem efektVystrelu; AudioSource audioSource; ... }
Metoda Start()
Proměnným vrátíme objekty požadovaných typů:
void Start() { ... crosshair = GameObject.FindGameObjectWithTag("Crosshair").GetComponent<Image>(); efektVystrelu = GameObject.FindGameObjectWithTag("EffectShoot").GetComponent<ParticleSystem>(); audioSource = transform.GetComponent<AudioSource>(); }
Metoda Update()
Do metody Update()
přidáme dvě nové podmínky.
První podmínku s blokem else
vložíme jako
druhou v pořadí a druhou podmínku na konec metody:
void Update() { if (Input.GetMouseButtonDown(0) && !objectWithAnim.GetBool("Run") && !objectWithAnim.GetBool("Holster") && !objectWithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect")) { InvokeRepeating("ShootBullet", 0, 0.25f); } if (objectWithAnim.GetBool("Aim")) { crosshair.enabled = false; } else { crosshair.enabled = true; } if (Input.GetMouseButtonUp(0)) { CancelInvoke("ShootBullet"); } if (efektVystrelu.isPlaying && efektVystrelu.time >= 0.15f) { efektVystrelu.Stop(); } }
První podmínka
V prvním podmínce nastavujeme crosshair.enabled
na hodnotu
true
nebo false
. Pokud je true
, tak je
crosshair vidět, jinak není.
Druhá podmínka
Pokud efekt výstřelu pořád hraje a doba je delší než 15
setin sekundy, tak se efekt 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 tak dlouho, až to vypadalo na
jeden samotný výstřel. Pokud bychom spustili hru bez této podmínky,
efektVystrelu
by se spustil několikrát i po jednom samotném
výstřelu.
Metoda ShootBullet()
Na začátek metody přidáme následující kód:
void ShootBullet()
{
efektVystrelu.Stop();
efektVystrelu.Play();
audioSource.Stop();
audioSource.Play();
...
}
Voláme zde metody Stop()
a Play()
, které:
- u proměnné
efektVystrelu
zastaví nebo znovu spustí efekt, - u proměnné
audioSource
zastaví nebo znovu spustí zvuk výstřelu.
Zkouška střílení
Nyní máme vše nastaveno a můžeme spustit hru
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. Budeme se věnovat hernímu designu a prostředí.
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 63x (8.64 MB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET