Unity 3D 1. Diel - Úvod do Unity a prvá hra

C# .NET Unity 3D Unity 3D 1. Diel - Úvod do Unity a prvá hra

Čo je to Unity?

Unity je moderný profesionánly herný engine s vlastným editorom. Ak plánujete pracovať v Unity, radšej už začnite sťahovať, má cez 1 GB.

Samotný engine je naprogramovaný v C++ a vy v ňom ďalej vytvárate scripty v C#, trochu upravenom JavaScripte, alebo v Boo - jazyku veľmi podobnom Pythonu. V tomto tutoriáli budeme programovať v C#, kedže je pravdepodobne najvhodnejší. Musíte poznať aspon základy v C#. Unity má free a pro verziu, ktorá stojí 1500$(!), ale free verzia má našťastie veľkú väčšinu vecí, ako aj pro.

Fungovanie her v Unity

  1. Každá hra má svoje assety (materiály). Sú to prakticky všetky súbory, ktoré bude hra obsahovať - scripty, 3D modely, textúry, zvuky, mapy atď.
  2. Hra sa skladá z niekoľkých scén. To sú prakticky levely (alebo mapy) hry.
  3. Scéna sa skladá z herných objektov - GameObjectov.
  4. Herné objekty sa skladajú z komponentov - components - to sú ich scripty.

Keď sa vám stiahne a nainštaluje Unity otvorte ho, a vytvorte si nový projekt, a importujte VŠETKO, potom uvidíte niečo takéto, ale bez kocky:

První spuštění Unity

Fajn, ideme si to vysvetliť.

Dole sú assety. V strede je scene a game view. V scene view si vytvárame scénu - pridávame, presúvame a meníme herné objekty a máme zároveň pekný náhľad ako scéna vyzerá aj počas hry. Game view je samotný obraz, ktorý uvidíme po spustení hry.

Vľavo je Hierarchy - zoznam všetkých herných objektov, ktoré sú v aktuálnej scéne.

A vpravo je Inspector - tam konfigurujeme a pridávame komponeny do herných objektov.

Samozrejme, hra má ak iné okná, ale tie zatiaľ nebudeme používať a ajtak sú vypnuté.

OK, to by snáď na úvod stačil.

Tvorba hry

Pridáme si do scény predvytvorenú kocku cez GameObject->Create Other->Cube.

Vytvoření kostky v Unity

Kocka už je zvolená, ale inokedy ju zvoliť môžete cez Hierarchy alebo scene view. Všimnite si, že kocka už má pár komponentov a z nich si všimnite ten prvý: Transform. Je to úplne najzákladnejší komponent, ktorý sa nedá vymazať a má ho každý objekt. Udáva pozíciu, rotáciu a veľkosť objektu v scéne.

Ostatné komponenty sú už vygenerované, pretože sme si vytvorili kocku, ktorá teda má Mesh Filter. Ten dáva objektu model (mesh). Mesh rendrer renderuje model a collider predstavuje pevný objekt vo Physix engine. Ak chcete, môžte si odkliknúť zoznam Materials v rendereri a pridať kocke nejakú textúru. V Transform zmente Scale X a Z na niečo okolo 10, aby sa nám vytvoril podklad scény - táto kocka bude "podlaha".

Zvoľte kameru a môžete ju popresúvat šípkami a natočit ju (zmeníme nástroj vľavo hore na rotáciu)tak, by sme mali dobrý pohľad na podklad. Všimnite si, že sa nám zmenili hodnoty v Transform.

Tvorba podlahy v Unity

Pravdepodobne ste si všimli, že scéna je nejako tmavá. Tak si pridáme svetlo: GameObject->Create other->Point Light. Presunieme svetlo nad podklad a v Inspectori si môžeme zmeniť dosah a intenzitu svetla.

Přidání světla v Unity

Ok máme kameru, svetlo a pevný podklad. Teraz si ideme vytvoriť niečo, s čím budeme hrať. Z menu GameObject si pridáme guličku. Posunte ju do stredu (môžete aj tým, že v transfom nastavíte Position X Y a Z na 0) a posunte ju trocha hore, tak, aby sa jemne vznášala nad podkladom. Môžeme skúsiť hru spustiť cez Play (aj to skúste) a všimnite si, že si nemáte čo všimnúť :D , pretože nič sa nestane. To preto, lebo naša gulička nemá zatiaľ žiadne skripty, ktoré by ju nejak priamo ovládali.

Vypneme hru a pridáme do guličky Rigidbody cez Inspector: Add component->Rigidbody. Dajte si pozor, aby ste nedali rigidbody do podkladu! Teraz znovu zapnite hru a ak ste niečo nepokazili, tak vám gulička spadne na zem. Ok to by bolo, ale stále nemôžeme guličku nejak ovládať. Teraz prídu na rad znalosti z C#.

V assetoch si vytvoime nový skript cez pravý klik->Create->C# Script. Po dvojkliku sa vám skript otvorý cez v Unity zabudované IDE Monodevelop. Mne osobne vyhovuje viac Visual Studio, cez ktoré môžete projekt otvoriť tak, že nájdete zložku kde ste si projekt vytvorili a otvoríte Assets ->[nazov projektu]-csharp.sln. ALE, musíte nejaký script aspoň raz otvoriť cez monodevelop, aby vám unity vygenerovalo solution. Dajte si na to pozor!

Uvidíte niečo takéto:

using UnityEngine;
using System.Collections;

public class BasicMovement : MonoBehaviour {

        // Use this for initialization
        void Start () {

        }

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

        }
}

V podstate nám Unity vygenerovalo prázdnu classu, ktorá dedí od MonoBehaviour a obsahuje 2 prázdne funcie: Start a Update.

Start sa zavolá po vzniknutí objektu v hre, používa sa väčšinou na nastavenie objektu. Update sa zavolá každý programový frame(nie grafickú frame!).

Teraz do funkcie update pridáme tento kód:

transform.position += new Vector3(Input.GetAxis("Horizontal") * 0.1f, 0, Input.GetAxis("Vertical") * 0.1f);

Transform je premenná, ktorá pôvodne patrí MonoBehaviour a je to vlastne referencia na komponent Transform, konkrétneho vlastníka skriptu. Position je premenná Transform typu Vector3(X,Y,Z). Input je trieda enginu, ktorá ovláda vstup (myš a klávesnicu) a funcia GetAxis vráti float podľa toho v ktorej časti osi sa nachádza ovládač (v prípade klávesnice je to buď -1, 0 alebo 1, ale float vracia v prípade joysticku). To si môžete nastaviť cez Edit->Project Settings->Input.

Celá funcia v podstate každý frame pripočíta k pozícii buď -0, 1, 0 alebo 0.1. Zatiaľ jednoduché, čo? To sa vás neskôr opýtam v ďalších častiach seriálu a odpoveď už nebude jednoznačné áno :).

Ok, teraz si do guličky pridáme náš script buď cez Add component alebo tým, že potiahneme skript z assetov go Gameobjectu. Keď teraz zapnete hru, s guličkou už môžete hýbat s WASD alebo šípkami.

Unity používa Physix engine od nVidie na vypočítavanie a uplatnenie fyziky, ktorému nič neunikne. Preto si môžete všimnúť, že gulička sa nie len hýbe, ale aj slabo otáča, keďže sa pri pohybe posúva, vzniká realistická simulácia trenia. Môžete to vypnúť cez Inspector > Rigidbody > Constraints -> Freeze rotation.

Vytvorte si z aj nejaké zábrany, aby kocka nevypadla. Projekt uložte si scénu aj projekt, nabudúce s nimi budeme ďalej pracovať.


 

  Aktivity (1)

Článek pro vás napsal DELTA12
Avatar
Autor sa venuje sa tvorbe hier v Unity a Unreal Engine, elektrotechnike, programovaniu AVR čipov a zriedkavo Windows Forms programom

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


 



 

 

Komentáře

Avatar
qwertyW
Redaktor
Avatar
qwertyW:

děkuji a těším se na pokračovaní, vypadá to zajímavě..

Odpovědět 17.5.2014 20:15
Programuji, tedy jsem.
Avatar
alesekmoravec123:

Vypadá to velmi zajímavě. Až se neučím víc z C#, tak si zkusím něco. Ale těch 1500$... je to něco okolo 30 000. A já jsem šílel když jsem si chtěl kupovat Sony Vegas a zjistil jsem že stojí asi 120$. :D

Odpovědět 18.5.2014 8:19
Udělat něco blbůmvzdorné je nemožné jelikož se vždy objeví nějaký větší blbec.
Avatar
DELTA12
Redaktor
Avatar
DELTA12:

Unity je dobé, lebo aj free verzia má skoro úplne všetky vecim ako aj pro, akurát nemá dynamické tiene a pár ďalších vecí.

 
Odpovědět 18.5.2014 18:41
Avatar
Michal Doubek (HAPPY DAY):

no super, Unity seriál by se hodil, právě na něčem pracuju, taky v Unity tak se snad něco víc přiučím

Odpovědět 24.5.2014 7:15
Svoboda tvé pěsti končí na špičce mého nosu
Avatar
Houba28
Člen
Avatar
Houba28:

Pro všechny začátečníky jako já, kdo mají rádi Visual Studio: Nemusíte se prdět s tím Mono prostředím, v preferences se dá nastavit místo něj rovnou Visual studio :)

 
Odpovědět  +1 12.8.2014 11:03
Avatar
Petr Havlát
Člen
Avatar
Petr Havlát:

ahoj, potřeboval bych se na něco zeptat. Jde v Unity nahrát 2 scény najednou.. Jedna scéna jako "Lobby/správce herních procesů" druhá jako vlastní herní proces.. moc děkuju za odpověď.

 
Odpovědět 5.8.2015 17:49
Avatar
DELTA12
Redaktor
Avatar
Odpovídá na Petr Havlát
DELTA12:

Pokial viem tak sa nieco take neda, musis mat vsetko v 1 scene

 
Odpovědět  -1 5.8.2015 19:00
Avatar
Odpovídá na Petr Havlát
Vojtěch Pospíchal:

Samozřejmě že dá. Pomocí: http://docs.unity3d.com/…dditive.html Ovšem v tvém případě bych zvážil, jestli jako správce nestačí jen neničit při načtení ten daný objekt, který ti jako správce slouží - pomocí: http://docs.unity3d.com/…yOnLoad.html

 
Odpovědět 5.8.2015 19:55
Avatar
havlat82
Člen
Avatar
havlat82:

Ahoj potřeboval bych poradit. Chci udělat přes tohle API chat. Potřebuju se dostat k datům v HTTP odpovědi. Server mi hází odpověď 200 (úspěch), to chatovací okno mi to otevře, ale nedostanu se k těm datům. Problém je, že to vůbec neloguje. Vždy se logne url a pak až WWW Error: Failed to connect to centrum.cz port 6: Timed out. Potřebuju dostat informace z hlavičky a to konkretně secure_session_id, abych moh pak dělat další příkazy API jako send_message, get_pending_mes­sages.. Příklad v dokumentaci fungoval. Mám tam někde logickou chybu a nevidim ji.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ResponseTest : MonoBehaviour {

    private string message = "Ahoj";
    private string url = "";
    //přihlašovací údaje
    private string credentials = "xxx";
    private string urlRoot = "@api.livechatinc.com";
    private string licenseId = "licence_id=xxx";
    long visitorsId = dlouhý číslo;
    //sekce API
    string visitors = "/visitors/";
    //příkazy API
    string chatStart = "/chat/start";
    //struktura hlavičky HTTP požadavku
    Dictionary<string, string> headers = new Dictionary<string, string>();

    void Start()
    {
        headers.Add("Content-Type", "application/x-www-form-urlencoded");
        StartChat(message);
    }

    void StartChat(string message)
    {
        //ADD your Form Elements wich you want to transmit
        WWWForm form = new WWWForm();
        form.AddField("X-API-Version", 2);
        byte[] rawData = form.data;

        string adress = "https://" + credentials + urlRoot + visitors + visitorsId + chatStart + "?";
        string parameters = licenseId + "&welcome_message='" + message + "'";
        url = adress + parameters;
        Debug.Log(url);

        WWW www = new WWW(url, rawData, headers);
        StartCoroutine(WaitForRequest(www));
    }

    IEnumerator WaitForRequest(WWW www)
    {
        yield return www;
        // check for errors
        if (www.error == null)
        {
            Debug.Log("WWW Ok!");
            if (www.responseHeaders.Count > 0)
            {
                Debug.Log("responseHeaders.Count"+www.responseHeaders.Count);
                foreach (KeyValuePair<string, string> entry in www.responseHeaders)
                {
                    Debug.Log(entry.Value + "=" + entry.Key);
                }
            }
        }
        else
        {
            Debug.Log("WWW Error: " + www.error);
        }
    }
}
 
Odpovědět 23. února 12:07
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.