Unity 3D - Vylepšení střelby

C# .NET Unity 3D Unity 3D - Vylepšení střelby

Vítejte u pokračování článku o střelbě v Unity 3D. Budeme využívat materiály z minulého dílu.

Automatická střelba a omezená munice

Přidáme si náboje a zásobníky. Všechny budou public (veřejně přístupné), aby jsme je pak mohli z Unity měnit.

public int Ammo = 100;
public int Mag = 3;
private int AmmoBefEmp = Ammo;

public AudioSource strelba;

Do proměnných Ammo a Mag jsme inicializovali jejich hodnoty. Proměnná AmmoBefEmp je pomocná proměnná k přebíjení. Prozatím ale použijeme pouze Ammo. Přebíjení implementujeme příště. Teď, když hráči dojdou náboje, má smůlu - musí tedy šetřit.

void Update()
{

 if(Input.GetButton("Fire1") && Ammo > 0)
 {
        GameObject newBullet = Instantiate(Bullet, SpawnPoint.transform.position + (SpawnPoint.transform.forward), SpawnPoint.transform.rotation) as GameObject;
        newBullet.GetComponent<Rigidbody>().AddForce(SpawnPoint.transform.forward * 10000);
        Ammo -= 1;
        GetComponent<AudioSource>().PlayOneShot(strelba);
 }
}

Myslím, že zde není nic třeba vysvětlovat. Postup je stejný, jako minule. Vytvoříme projektil, uvedeme ho do pohybu, snížíme počet nábojů o 1 a přehrajeme zvuk výstřelu. Pokud již nemáme náboje, nestane se nic (mohli bychom přidat else a přehrát zvuk cvaknutí, aby hráč věděl, že již nemá munici.

Jak vidíte, střelba je realizovaná přes obyčejnou podmínku. Kdybychom to napsali v cyklu while, hra zamrzne. Proč? Všechen kód ve funkci Update() je vlastně v cyklu - hlavním cyklu hry. A každý snímek se tato funkce zavolá a naše podmínka zjišťuje, jestli právě v ten moment uživatel drží tlačítko myši. To proto máme tentokrát pouze GetButton a ne GetButtonDown.

Změna zbraně

Nyní si přidáme do naší složky Skripty další C# skript s názvem WeaponChange. V globálním prostoru si vytvoříme nový GameObject weapons, který musí být veřejně přístupný, jinak bychom do toho objektu z prostředí Unity nemohli vkládat naše modely zbraní :-).

public GameObject[] weapons;

Naše zbraně budeme ukládat do pole, jak to můžeme vidět výše. Vytvoříme si pod void Update metodu SelectWeapon s parametry:

void SelectWeapon(int index)
{
    foreach (GameObject obj in weapons)
    {
       obj.SetActive(false);
    }
    weapons[index].SetActive(true);
}

Každá zbraň má svůj index v poli - zbraně prohodíme jednuše tak, že nastavíme aktivitu příslušné zbraně. Momentální model v proměnné obj deaktivujeme a následně nastavíme novou aktivní zbraň.

Do void Update() si vložíme hned dvě podmínky (kdo chce, může použít třeba switch):

if (Input.GetKeyDown(KeyCode.Alpha1))
{
   SelectWeapon(0);
}

if (Input.GetKeyDown(KeyCode.Alpha2))
{
   SelectWeapon(1);
}

Ve volání podmínky již není GetButtonDown, ale GetKeyDown - pracujeme s klávesnicí. Ptát se budeme na KeyCode.Alpha1 (1 na alfanumerické klávesnici) a v podmínce zavoláme metodu SelectWeapon(). V závorkách uvedeme číslo zbraně, kterou chceme vybrat.

Nyní ještě do void Start() napíšeme:

SelectWeapon(0);

Tímto se nám na začátku hry vybere první zbraň (a deaktivují všechny ostatní). Pokud bychom to ale chtěli udělat jinak, tak je možné tuto deaktivaci udělat i ručně v Unity:

checkbox není zaškrtnut

Teď zavítáme na Internet. Konkrétněji na stránku tf3dm.com a seženeme si nějaký další model zbraně (použít můžeme samozřejmě i naše vlastní). Vrátíme se zpět do Unity a dáme skript na capsuli (já na vojáka, kterého jsem si stáhnul spolu s Coltem 1911). Do Size si dáme 2 (nebo dle vlastního uvážení) a na Element 0 si vložíme primární zbraň a do Element 1 si vložíme sekundární zbraň. Bude to vypadat asi takto:

Sekundární zbraň

Aby náš Colt střílel, budeme pro něj muset vytvořit další skript. Od skriptu, který máme na primární zbrani se příliš lišit nebude - hlavní rozdíl bude v tom, že Colt není automatická zbraň. Skript se bude jmenovat ShootingPistol a pouze vynecháme části s automatickými částmi (tedy pokud nechceme pistoli automatickou, že? :D). Bude to vypadat takhle:

using UnityEngine;
using System.Collections;

public class ShootingPistol : MonoBehaviour
{

    public GameObject Bullet;
    public Transform SpawnPoint;

    public int Ammo = 25;
    public int Mag = 3;
    private int AmmoBefEmp = Ammo;

    public AudioClip strelba;

    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetButtonDown("Fire1") && Ammo > 0)
        {
            GameObject newBullet = Instantiate(Bullet, SpawnPoint.transform.position + (SpawnPoint.transform.forward), SpawnPoint.transform.rotation) as GameObject;
            newBullet.GetComponent<Rigidbody>().AddForce(SpawnPoint.transform.forward * 10000);
            Ammo -= 1;
            GetComponent<AudioSource>().PlayOneShot(strelba);
        }
    }

Postup je prakticky stejný jako v minulém díle. Prázdný GameObject umístíme před hlaveň, skript umístíme na sekundární zbraň zároveň s modelem projektilu a SpawnPointem naší sekundární zbraně.

Nakonec připomenu, jak přehrát zvuk při střelbě. Stačí do AudioClip strelba uložit v Unity zvuk. Musíme nastavit audio source: Zbraň -> Add Component -> Audio -> Audio source.

Z důvodu velikosti přikládám archiv s projektem jako odkaz na Dropbox. Něco málo jsem nám tam přidal, abychom si příště ulehčili práci. Hra dostala krycí název Field of War. Jakékoliv připomínky prosím pište do komentářů :-).


 

  Aktivity (4)

Článek pro vás napsal Ondřej Langr (andysekcze)
Avatar
Autor se věnuje programování v C#, PHP a někdy zabrousí i do JavaScriptu a C/C++. Z toho má nejraději PHP a C#

Jak se ti líbí článek?
Celkem (5 hlasů) :
55555


 


Miniatura
Předchozí článek
Unity 3D - Střelba projektilů
Miniatura
Všechny články v sekci
Programování her v Unity3D v C# .NET

 

 

Komentáře

Avatar
vodacek
Redaktor
Avatar
vodacek:

A proč nevytvořit jen jeden skript a dát mu parametr zdali je zbraň automatická?

 
Odpovědět  +2 14.12.2015 10:59
Avatar
Odpovídá na vodacek
Ondřej Langr (andysekcze):

Asi mi to připadalo lepší, ten článek jsem nepsal včera ;-) :-) Ale můžu to zkusit :)

Odpovědět 14.12.2015 13:57
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
vodacek
Redaktor
Avatar
Odpovídá na Ondřej Langr (andysekcze)
vodacek:

V pohode, ber to jen jako postreh nekoho kdo s unity delat nechce a kdo nerozumi tomu, co tam je obvykle.

 
Odpovědět 14.12.2015 15:08
Avatar
Odpovídá na vodacek
Ondřej Langr (andysekcze):

Jo jasný, za každý názor jsem rád ;-)

Odpovědět 14.12.2015 15:26
I have a charger. I have Note 7. Umh I haven't Note7.
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.