07. Ovládanie komponentov
Táto časť sa netýka jazyku C# vo všeobecnosti, ale niektorých špeciálnych postupov, ako v C# v prostredí Unity pristupovať ku game objektom a ich komponentom.
Vždy keď chceme v skripte vykonať niečo s nejakým game objektom – napríklad ho schovať – musí skript vedieť o ktorý game objekt ide. Musíme mu vedieť povedať, že toto je ten game objekt, ktorý máš schovať. Rovnako keby sme chceli zo skriptu ovládať niektorý komponent na niektorom game objekte.
Prístup ku komponentu Transform
Komponent Transform má špeciálne postavenie medzi komponentmi. Každý jeden game objekt má povinne a automaticky komponent Transform. Preto je k nemu aj špeciálny prístup a budeme ho často využívať. Teraz si ho ukážeme.
- Vytvorte v scéne nový 3D game objekt typu Cube a premenujte ho na Kocka
- Vytvorte v assetoch nový skript s názvom Rotator a priraďte ho na game objekt Kocka
- Otvorte skript Rotator v editore skriptov
Náš skript Rotator bude robiť to, že bude automaticky otáčať ten objekt, na ktorom je priradený. V našom prípade teda túto kocku. Keďže chceme, aby sa tento rotačný pohyb vykonával neustále, budeme písať do metódy Update, lebo tá sa vykonáva neustále.
Doplňte metódu Update takto:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Rotate(0, 1, 0);
}
}
Čo sme to napísali:
transformje označenie pre komponent Transform na tomto game objekte. Iné komponenty takéto pekné označenie nemajú. Ako sme si už povedali, Transform má špecifické postavenie medzi komponentmi. Neskôr si ukážeme ako pristupovať k ostatným komponentom.Rotate(...)je príkaz pre komponent Transform, slúži na otočenie game objektu o nejaký uhol.0,1,0sú tri uhly, o ktoré chceme otočiť game objekt. Prvý uhol je otočenie okolo osi X, druhý okolo Y, tretí okolo Z. V tomto prípade teda otáčame len okolo osi Y a o uhol 1 stupeň.
Vo výsledku teda tento príkaz hovorí „otoč mi tento game objekt o 1 stupeň“. A tento príkaz – lebo je v metóde Update sa vykonáva neustále, takže v každom jednom snímku sa Kocka otočí o 1 stupeň. Vo výsledku to teda bude plynulá rotácia okolo zvislej osi Y:
U vás sa možno bude kocka otáčať inou rýchlosťou, v budúcnosti sa k tomuto javu ešte vrátime, zatiaľ to nepovažujte za chybu.
Ak by sme chceli regulovať rýchlosť otáčania, museli by sme meniť uhol, ktorý je teraz napevno nastavený na hodnotu 1. To ale už nebude pre nás veľký problém. Namiesto čísla 1 si vytvoríme vlastnosť komponentu a v inšpektore jej nastavíme rýchlosť 0.5f.
- Vytvorte v skripte Rotator novú vlastnosť s názvom
speedYa použite ju namiesto hodnoty 1 v príkazeRotate. - Nastavte v inšpektore game objektu Kocka hodnotu Speed Y na 0.5
Takto by mal vyzerať aktualizovaný skript: Programovanie_07.zip
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
public float speedY;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Rotate(0, speedY, 0);
}
}
Prístup k iným komponentom
Teraz vyrobíme jednoduché ovládanie rotácií. Vytvoríme si na to nový skript a z neho budeme ovládať vlastnosť speedY na komponente Rotator.
Vytvorte nový skript Ovladanie a priraďte ho na game objekt Kocka
V tomto skripte teraz využijeme podmienku a klikanie myšou, aby sme vytvorili príkazy, ktoré budú zvyšovať alebo znižovať rýchlosť otáčania okolo Y. Začneme len prázdnou podmienkou, zatiaľ bez príkazu na zmenu rýchlosti:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ovladanie : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
// Tu bude prikaz na zvysenie rychlosti na hodnotu 1
}
}
}
Toto sme už videli minule, je to podmienka, ktorá zisťuje, či bol stlačený ľavý myš. V tele podmienky je zatiaľ len poznámka, že tu raz bude nejaký príkaz.
Poznámky v kóde – nazývané aj komentáre – si môžete robiť tým, že pred poznámku pridáte dve lomítka //. Zvyšok riadku za týmito lomítkami bude počítač považovať za komentár a úplne to ignoruje.
Ako ale nastavíme rýchlosť otáčania? My vieme, že rýchlosť otáčania je vo vlastnosti speedY na komponente Rotator. Potrebujeme sa teda dostať k tomu komponentu a zmeniť hodnotu tejto vlastnosti, napríklad na hodnotu 2. Takto:
void Update()
{
if (Input.GetMouseButtonDown(0))
{
GetComponent<Rotator>().speedY = 2;
}
}
Uložte skript, pustite hru a skúste kliknúť myšou. Kocka by sa mala roztočiť rýchlejšie.
Pomocou príkazu GetComponent<Rotator>() sme si vypýtali komponent typu Rotator na tomto game objekte. Do zobáčikov <...> vkladáme typ komponentu. A keďže ide o príkaz, tak nesmieme zabudnúť ani na zátvorky (), hoci sú aj prázdne.
Keď sme si takto vypýtali od Unity komponent Rotator, môžeme už cez bodku pristupovať k jeho metódam a vlastnostiam. Napríklad v našom prípade k vlastnosti speedY, ktorej zmeníme hodnotu na 2.
Doplňte metódu Update tak, aby sa v pri stlačení pravého tlačidla myši hodnota speedY nastavila na 0.5f.
Zmeňte príkazy v metóde Update tak, aby sa hodnota speedY nezvyšovala na pevnú hodnotu 2 resp. neznižovala na pevnú hodnotu 0.5f, ale aby sa pri ľavom kliku zvýšila o 0.5f a pri pravom kliku znížila o 0.5f.
Týmto spôsobom môžeme pristupovať k hocijakým verejným vlastnostiam skriptu (to sú tie, ktoré sú v skripte zadefinované ako public). Môžeme zisťovať ich hodnoty, môžeme ich meniť, môžeme ich používať vo výrazoch ako by to boli premenné. Celá „adresa“ takej vlastnosti teda vyzerá takto:GetComponent<MenoKomponentu>().menovlastnosti
Vypnutie komponentu
Jednou z ďalších vecí, ktoré budeme občas potrebovať urobiť s komponentom je jeho vypnutie alebo opätovné zapnutie. Vypnutý komponent naďalej existuje na game objekte, ale nevykonáva sa jeho metóda Update. Je to to isté, ako keby sme komponent vypli pomocou check boxu v inšpektore.
Komponent sa vypína/zapína cez vlastnosť enabled. Toto je vlastnosť, ktorú sme mu my nedefinovali, má ju každý komponent automaticky, podobne ako má automaticky aj metódy Update a Start. Ak túto vlastnosť nastavíme na hodnotu false, komponent sa vypne. Naopak, ak ju nastavíme na true, komponent sa zapne.
Doplňte metódu Update v skripte Ovladanie tak, aby sa pri stlačení medzery (KeyCode.Space) deaktivoval komponent Rotator.
Upravte svoj kód tak, aby sa pri stlačení medzery komponent Rotator prepínal medzi zapnutým a vypnutým stavom. T.j. ak je zapnutý, tak sa vypne, ak je vypnutý, tak sa zapne.
Zhrnutie
Z jedného komponentu na game objekte môžeme pristupovať k iným komponentom na tom istom game objekte. Môžeme čítať alebo aj meniť ich vlastnosti, môžeme komponenty podľa potreby vypínať aj zapínať. Neskôr budeme takto okrem vlastností pristupovať aj k metódam iných komponentov a spúšťať ich ako príkazy.
V ďalšej lekcii si ukážeme, ako sa dá pristupovať k iným game objektom aj k ich komponentom.
Hotový projekt po tejto lekcii: Programovanie_07.zip
