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:
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ť:
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
:
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:
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:
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):
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:
Rovnaký úkon vykonáme u podobjektoch nášho efektu s názvom
Light
:
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
:
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é 63x (8.64 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#