NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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

Tvorba 3D her v Unity

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:

Tvorba 3D her v Unity

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_FPSCon­troller

Klikneme na náš objekt Assault_Rifle01_FPSCon­troller:

  • 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:

Tvorba 3D her v Unity

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 typu Image - pro získání našeho crosshairu,
  • efektVystrelu typu ParticleSystem - pro získání našeho efektu,
  • audioSource typu AudioSource - 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

 

Předchozí článek
Kvíz - Animace zbraně a střelba na nepřítele v Unity3D
Všechny články v sekci
Tvorba 3D her v Unity
Přeskočit článek
(nedoporučujeme)
3D střílečka v Unity - Úprava terénu
Článek pro vás napsal Tomáš Brabec
Avatar
Uživatelské hodnocení:
17 hlasů
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity