Unity 3D - Střelba projektilů

C# .NET Unity 3D Unity 3D - Střelba projektilů

Vítejte u článku o programování v Unity 3D pomocí programovacího jazyka C#. Dnes si naprogramujeme jednoduchý skript pro střelbu z určitého místa.

Předpokládám, že Unity 3D máte již nainstalované. Pokud ne, na ITNetwork máme tutoriál. Otevřeme si Unity 3D a založíme nový projekt. V něm vytvoříme libovolný povrch, po kterém se bude naše postava pohybovat. Při tvorbě povrchu máme dvě možnosti: Můžeme si vytvořit svůj vlastní, nebo naimportovat již připravený. V našem případě si vytvoříme Plane. Klikneme položku GameObejct -> 3D Object a najdeme Plane.

Kolečkem myši přibližujeme a pohybujeme se, pravým tlačítkem otáčíme kameru po scéně.

Postava

Nyní si importujeme Asset Characters (Assets -> Import Package -> Characters). Necháme zaškrtnuté vše a počkáme chvíli, než se všechno naimportuje. Měly by se nám importovat animace a množství skriptů. Poté přejdeme do složky Standard Assets -> Characters -> FirstPersonCha­racters -> Prefabs. Odtud vezmeme FPSController a umístíme ho někam do středu Plane (nebo si můžeme pozice vynulovat). Vytvoříme si GameObject kupříkladu kapsli. Cesta je stejná jako když jsme vytvářeli Plane, ale s tím rozdílem, že klikneme na Capsule. Vše si srovnáme a vložíme kapsli do FirstPersonCon­troller asi takto:

Když hru spustíme (pomocí tlačítka Play nahoře), měli bychom mít možnost "dívat se" myší.

Zbraň

V mém případě použiji moji oblíbenou Americkou útočnou pušku M4A1, kterou jsem stáhl z velké materiálové základny tf3dm.com, na které najdeme velké množství 3D modelů. Vytvoříme si v Assets (blok se nachází uprostřed dole) složku - pravé myšítko -> Folder s názvem Objekty. Model zbraně (nejlépe ve formátu .fbx) s příslušnými texturami vložíme do složky Objekty. Následně zvolenou zbraň přetáhneme opět do scény a srovnáme ke kameře správným směrem (ti pozornější si jistě všimli v bloku Inspector záložky Transform). Pozor, zbraň přetáhneme pouze k naší kapsli, nikoli do ní. Při přepnutí z modu Scene na Game si můžeme ověřit, zda nám tato pozice vyhovuje. Vše si otexturujeme a můžeme přejít k programování :-).

Vytvoříme si další složku (mimo složku Objekty) s názvem Skripty, do které budeme ukládat výlučně skripty. Ti pozornější si opět určitě všimli, že při otevření nabídky, kousek pod Folder, máme C# skript. Nyní si tedy skript vytvoříme s názvem Shooting a otevřeme ho. Otevře se výchozí editor (nejpravděpodobněji MonoDevelop, v mém případě Visual Studio).

Kód bude vypadat takto:

using UnityEngine;
using System.Collections;

public class Shooting : MonoBehaviour {

        void Start () {

        }

        void Update () {

        }
}

void Start() nám při prvním použití objektu udělá, co mu „řekneme“ a void Update() se volá při každém vykreslení snímku. Nejdříve si před void Start() vytvoříme dvě proměnné. První bude typu GameObject a druhá transform, obě budou zvenčí viditelné a názvy budou: Bullet a SpawnPoint. Když jsou proměnné přístupné zvenčí, znamená to, že jim v Unity 3D můžeme přiřazovat objekty, transformace nebo kupříkladu animace a zvukové stopy. Možností je samozřejmě více. Záleží co zrovna budeme potřebovat použít.

public GameObject Bullet;
public Transform SpawnPoint;

Poté si do void Update() zapíšeme vytváření projektilů:

if(Input.GetButtonDown("Fire1"))
{
            GameObject newBullet = Instantiate(Bullet, SpawnPoint.transform.position + (SpawnPoint.transform.forward), SpawnPoint.transform.rotation) as GameObject;
            newBullet.GetComponent<Rigidbody>().AddForce(SpawnPoint.transform.forward * 10000);
}

Poznámka: Edit -> Project Settings -> Input nám ukáže seznam inputů a na kterých klávesách/tla­čítkách jsou.

Kód si nyní popíšeme. Když stiskneme tlačítko Fire1 (levé myšítko), vykoná se náš skript. GameObject newBullet vytvoří novou proměnnou typu GameObject s názvem newBullet. Instantiate slouží k vytváření klonů našeho projektilu. Použití: Instantiate(Co, odkud.pozice + odkud.směr, odkud.rotace). Po vytvoření nové instance projektilu ho ještě potřebujeme přetypovat na GameObject. Následně načteme RigidBody, který přidá gravitaci a pomocí AddForce přidáme sílu, která bude pohybovat projektilem (odkud.kam * síla). Uvádíme SpawnPoint.transform.position z důvodů vytváření projektilu z určitého místa (to si za chvíli určíme). Kdybychom napsali jen transfrom.position náš projektil by se vytvářel s největší pravděpodobností někde pod námi.

Vraťme se do Unity 3D a vytvořme si jeden prázdný GameObject jménem SpawnPoint, který dáme před hlaveň, přetáhneme v hierarchii do zbraně a jeden GameObject typu Sphere na projektil jménem Bullet (samozřejmě si tam můžete dát jakýkoliv model) a půjdeme do Component -> Physics -> RigidBody. Kouli z levého panelu přetáhneme do složky Objekty a z hierarchie ho vymažeme. Poté skript přetáhneme na zbraň. Když si rozklikneme naši zbraň, můžeme vidět v Inspectoru inicializovaný skript. Do políčka Bullet přetáhneme naši kouli nebo vlastní model ze složky s objekty a námi vytvořený SpawnPoint přetáhneme, jak jistě tušíte, do SpawnPointu :-) .

Bonus

Jako bonus si můžeme ukázat, jak se nastavuje místo MonoDevelop jiné IDE např. Visual Studio. Pokud vám z jakéhokoliv důvodu defaultní IDE nevyhovuje, můžete ho snadno změnit za jiné. Pokud to chcete udělat, klikněte na horní liště na Edit -> Preferences… -> External Tools. Hned v prvním řádku uvidíte vybrané IDE (nejspíše MonoDevelop). Ze seznamu si místo něj můžete vybrat jiné nainstalované IDE. Další možnost je najít přímo binárku, pokud máte nějakou portable verzi.

V příštím díle si vylepšíme skripty pro střelbu (zásobníky, režimy střelby). Jakékoliv připomínky nebo nápady pište prosím do komentářů. :)


 

Stáhnout

Staženo 22x (49.2 MB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET

 

  Aktivity (1)

Č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 (3 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Programování her v Unity3D v C# .NET
Miniatura
Následující článek
Unity 3D - Vylepšení střelby

 

 

Komentáře

Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

Super! Bude pokračování? :)

Odpovědět 20.11.2015 18:53
Lepší být šprt než blbec :)
Avatar
Odpovídá na Tomáš Brůna
Ondřej Langr (andysekcze):

Proces schvalování a řešení proč mi nejde nahrát zip ;-)

Odpovědět  +1 20.11.2015 19:01
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovědět  +1 20.11.2015 19:04
Lepší být šprt než blbec :)
Avatar
tomekmichalhu:

dělat kulku jako objekt je hovadina, když jí nastavíte realistickou rychlost tak některejma objektama proletí jako by tam nebyly. Lepší je použít raycasting

 
Odpovědět  +4 20.12.2015 9:24
Avatar
Odpovědět 20.12.2015 11:37
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Kryštof Začal:

Co je u mě špatně, když střílí můj objekt na pravou stranu?

 
Odpovědět 2. června 14:35
Avatar
Odpovídá na Kryštof Začal
Ondřej Langr (andysekcze):

Máš otočenej SpawnPoint o 90° na pravo, otoč to o 90° doleva :-)

Odpovědět 2. června 21:03
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Odpovědět 3. června 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 9 zpráv z 9.