Unity 3D 2. Diel - Práca s objektmi a komponentmi

C# .NET Unity 3D Unity 3D 2. Diel - Práca s objektmi a komponentmi

V minulom dieli sme si vysvetlili, že scény sa sa skladajú z objektov a tie z komponentov. V tomto dieli si vysvetlíme pár úplne základných funcií ich ovládania.

Vyhľadávanie objektov

Vedieť získať komponenty a objecty zo scény je najdôležitejšia vec, ktorú sa tu naučíte. Otvoríme si starú scénu z minulého dielu a pridáme prázdny objekt, nazvite ho .SCRIPTS alebo niečo podobné. V ňom budú všetky skripty ovládajúce hru. Teraz vytvorte nový skript a nazvite ho GameManager, SceneManager alebo niečo také. Premenujte script z minulého dielu BasicMovement na Sphere, aby to dávalo zmysel.

Do skriptu pridajte toto:

public static GameObject playerObj
{
    get
    {
        return ;
    }
}

Snáď tomu rozumiete, ak nie vlastnosti (get/set) nájdete to v sekcii tutoriály C# (OOP). Do return zatiaľ nič nepíšte, nechajte error tak.

Existuje viacero možností, ako vyhľadať objekt(y). 3 najpoužívanejšie sú:

  1. GameObject.Fin­d([string] nazov) - vráti prvý objekt na vrchu hierarchie so zadaným menom.
  2. GameObject.Fin­dGameObjectWit­hTag([string] tag) - vráti prvý objekt s rovnakým tagom, aj ked nie je navrchu. Každý objekt má svoj tag, ten môžete pridať a nastaviť v inspectori.

3. GameObject.Fin­dgameObjectsWit­hTag(tag) - Vráti všetky najdené objekty s rovnakým tagom vo forme array (pole).

Do return teraz pridajte 2. možnosť. Nezabudnite nastaviť tag guličky na player. Malo by to vyzerať takto:

public static GameObject playerObj
{
    get
    {
        return GameObject.FindGameObjectWithTag("Player");
    }
}

Teraz vieme získať objekt (guličku) zo scény.

Vyhľadávanie komponentov

Na získanie komponentov je už iba 1 funkcia:[objek­t].GetComponen­t()

Má ale 3 overloady:

1. GetComponent([strin­g] nazovScriptu) - Vráti komponent so zadaným názvom. Takto sa dajú vyhľadať aj skripty napísane v iných jazykoch (napr JavaScript), kedže C# ich nedokáže detekovať.

Napr.: (Sphere)playe­rObj.GetCompo­nent("Sphere");

2. GetComponent([typ] skript) - Vráti skript podľa typu ktorý zatáte

Príklad: (Sphere)playe­rObj.GetCompo­nent(typeof(Sphe­re));

3. GetComponent<[typ]>() - Najjednoduchšia z možností, lebo nemusíte vypisovať dlhé casty ,

príklad: playerObj.Get­Component<Sphe­re>();

Všimnite si, že nemôžete získať všetky komponenty rovnakého typu z 1 objektu, ako sa dá získať všetky objekty s rovnakým tagom. To pretože každý objekt má mať iba 1 komponent z každého typu. Ak ich má viac, považuje sa to ako chybný syntax.

Ok, teraz pridajme ďalší getter :

public static Sphere player
{
    get
    {
        return playerObj.GetComponent<Sphere>();
    }
}

Už vieme vyhľadať skripty a objekty, ale zatiaľ ich nevieme pridať a odobrať zo skriptu, iba cez editor scény.

Instancovanie objektov

Objekty môžeme pridávať aj dynamicky zo skriptov. Na to nam slúži funkcia Instantiate Najjednoduchší overload je Instantiate([Ga­meObject] objekt). Do manageru môžeme teraz pridať

public GameObject prefab;
void Start()
{
    Instantiate(prefab);
}

Ak definujeme nejakú premennú ako public, môžeme ju nastaviť aj v inspectori (napr ťahaním).

Inspektor v Unity 3D

Bolo by dosť nepraktické, ak by sme museli mať na každej mape niekde uložené objeky, ktoré chceme instancovať. Preto si môžeme vytvoriť prefab tak, že potiahneme objekt z hierarchy do assets. Vytvorte si prefab guličky a nastavte ho ako (premennú s názvom) prefab v manageri. Teraz môžeme guličku zo scény vymazať a keď spustíme hru, mala by sa nám instancovať sama (nezabudnite pridať do scény manager a nastaviť prefab z assetov nie scény).

Instantiate má však aj ďalší overload: Instantiate([Ga­meObject]prefab, [Vector3]pozi­cia,[Quaterni­on]rotacia), cez ktorý môžeme nastaviť pozíciu a rotáciu na ktorú sa má instancovať. Funkcia Instantiate má návratový typ GameObject, takže môžeme použiť

GameObject newObject = Instantiate(...);

Skripty môžeme pridať pomocou funkcie AddComponent<skrip­t>(); No, je jednoduchšie uložiť ich v prefaboch.

(De)Aktivácia a odstránenie objektov a komponentov

Objekty aj komponenty môžeme odstrániť pomocou funkcie Destroy(objek­t/komponent)

Objekty môžeme aktivovať pomocou funkcie objekt.SetActi­ve([true/false])

Komponenty môžeme aktivovať pomocou komponent.enabled = true/false

Ak sú objekty/komponenty deaktivované, vyhľadávacie funcie ich nenájdu!

Načítavanie prefabov

Prefaby môžeme okrem zvolenia cez inspector aj načítať cez skript.

Vytvorte si v assets zložku Resources a presunte do nej prefab guličky. Teraz môžeme pridať do manageru:

void Start()
{
    prefab = (GameObject)Resources.Load("nazov prefabu v resources");
}

Ako ste si všimli, použili sme funkciu Resources.Load(), ktorá dokáže načítať hociaký súbor zo zložky Resources. Musíme však castnúť typ načítaného objektu (pridať pred funciu (GameObject)).

Príklad

Ok, skúsme si to všetko zhrnút.

Vytvorte nový objekt s názvom spawn, pridajte tag Spawn a nastavte jeho tag na Spawn. Z manageru prepíšte instancovanie guličky na:

GameObject spawn = GameObject.FindGameObjectWithTag("Spawn");
GameObject newObject = Instantiate(prefab, spawn.transform.position, spawn.transform.rotation);
newObject.name = "Player";
Destroy(spawn);

Teraz by sa nám po spustení hry mala instancovať gulička na pozíciu spawnu.

Zmenu názvu (newObject.name) si nevšímajte, vysvetlíme si to v dalších dieloch. Zničenie spawnu veľmi nedáva zmysel, aj keď pri zložítých objektoch je dobré deaktivovať alebo úplne odstániť ich, keď sú nepotrebné. Tieto veci som použíl len ako príklad.

Slovníček

  • cast = príkaz pre compiler, aby nejaký objekt použil ako iný, napr (GameObject)Re­sources.Load() alebo Resources.Load() as GameObject
  • overload = keď má funcia viacej možností zadania paramterov, napr Instantiate(Ga­meObject), Instantiate(Ga­meObject, Vector3, Quaternion)

 

  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 (5 hlasů) :
4.84.84.84.84.8


 



 

 

Komentáře

Avatar
aXxelus
Člen
Avatar
aXxelus:

Jen doufám, že s tou Unity sérií nepřestaneš ! ;)

 
Odpovědět 11.6.2014 20:08
Avatar
DELTA12
Redaktor
Avatar
DELTA12:

Určite nie, len mi do niekedy trvá kým si na to nájdem čas, lebo sám teraz pracujem na 1 projekte

 
Odpovědět 11.6.2014 20:59
Avatar
Pracka
Člen
Avatar
Pracka:

Ahoj :) skusam ist podla tvojho tutorialu, mam stiahnute teraz najnovsie Unity3D a akosi mi tam neexistuje trieda Sphere, nevies, kde mam problem? Nemal som tam najprv daco spravit, aby som mal k nej pristup?

Odpovědět 9.9.2015 20:55
Carpe Diem
Avatar
Honza.G
Člen
Avatar
Honza.G:

Čau, nepokračoval bys v těchto tutoriálách dál? Pomáhaj mi. Předem dík

 
Odpovědět 6. srpna 20:38
Avatar
DELTA12
Redaktor
Avatar
Odpovídá na Honza.G
DELTA12:

Ahoj, ospravedlňujem sa, že píšem neskoro, nejak sa mi zrejme vypli email upozornenia a dlhšie som na stránke nebol. Bohužiaľ, nehodlám v návodoch pokračovať, pretože som usúdil, že to isté, čo tu píšem je už na milión iných stránkach a teda sa mi neoplatí písať o tom istom znovu. S Unity už ani veľmi nepracujem, skôr sa prikláňam k Unreal Enginu.

 
Odpovědět 23. září 16:10
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 5 zpráv z 5.