09. Náhodnosť
Generovanie náhodných hodnôt je pri tvorbe umeleckých aplikácií alebo videohier častá vec. Vďaka náhode je to isté dielo stále iné, nepredvídateľné. Náhoda nám tiež šetrí prácu pri generovaní veľkých počtov objektov, ktoré by sme inak museli manuálne generovať vo fáze vývoja.
Vytvorte v projekte nový skript Nahoda a priraďte ho na game objekt Main Camera
V tomto skripte si budeme najprv trochu experimentovať s tým, ako funguje generovanie náhodných hodnôt v Unity.
Vyskúšajme, čo vypíše do konzoly takýto príkaz:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Nahoda : MonoBehaviour { // Start is called before the first frame update void Start() { Debug.Log(Random.value); } // Update is called once per frame void Update() { } }
Vypíše to nejaké číslo:

U vás bude toto číslo iné, ale to sa asi dá očakávať, keď sa bavíme o náhode.
Náhodné hodnoty budeme v Unity generovať pomocou Random.
Je to pomocná trieda v Unity a má pre nás rôzne príkazy a vlastnosti, ktoré nám pomôžu s generovaním náhodných čísel.
Čo je to „trieda“, to si zatiaľ necháme bokom. Je to trochu širší koncept, s ktorým sa nateraz ešte trápiť ešte nebudeme. Nám teraz postačí vedieť, že existuje nejaký Random
a že nám bude pomáhať.
Vyskúšajte spustiť váš program viackrát, aké čísla bude Random.value
generovať. Čo majú spoločné? Z akého sú asi intervalu?
Čo keby sme chceli hodnoty z iného intervalu? Na to máme v triede Random
metódu Range
. Vyskúšajme:
void Start() { Debug.Log(Random.value); Debug.Log(Random.Range(1, 5)); }
Aké čísla generuje Random.Range
s týmito parametrami 1
a 5
? Vygeneruje niekedy aj 5ku? Vygeneruje niekedy aj 1ku?
Vyskúšajte aj takúto verziu:
void Start() { Debug.Log(Random.value); Debug.Log(Random.Range(1, 5)); Debug.Log(Random.Range(1.0f, 5.0f)); }
Tu si môžete všimnúť, že tá metóda s tým istým názvom Range
sa správa inak podľa toho, či jej ako parametre dáme celé čísla 1 a 5 alebo desatinné čísla 1.0f a 5.0f. Ak jej dáme ako parametre celé čísla, bude generovať len celé čísla. Ak jej ako parametre dáme desatinné čísla, bude generovať aj desatinné.
Použime náhodnosť v praxi
Budeme teraz pokračovať v projekte z minula, ktorý sme zanechali v podobe, že máme na obrazovke tri farebné kocky a tie sa otáčajú všetky rovnakou rýchlosťou:
Poďme im teraz nastaviť každej inú náhodnú rýchlosť. Rýchlosť otáčania spravuje skript Rotator, tak si ho otvorme v editore:
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); } }
Rýchlosť nám stačí nastaviť raz na začiatku. Preto budeme písať do metódy Start
. Rýchlosť je uložená vo vlastnosti speedY
.
Doplňte do metódy Start
príkaz, ktorý do vlastnosti speedY
priradí náhodnú hodnotu z intervalu od -2.0f
do 2.0f
.
Náhodná poloha
Rýchlosť otáčania je jedno číslo – tzv. jednorozmerná veličina. V praxi budeme chcieť ale často nastavovať polohu objektu. To môže byť dvojrozmerná veličina (v 2D priestore) alebo trojrozmerná veličina (v 3D priestore).
Vytvorte skript NahodnaPoloha a priraďte ho na každú z kociek.
V tomto skripte nastavíme na začiatku náhodnú polohu každému game objektu, na ktorom je skript priradený. Čiže každej kocke.
Vytvorte v skripte NahodnaPoloha
v metóde Start
tri premenné x,y,z a do každej priraďte náhodné desatinné číslo z rozsahu -3.0f až 3.0f.
To by sme mali súradnice x,y,z. Ale ako z nich vyrobíme polohu?
Poloha game objektu je uložená v komponente Transform, v jeho vlastnosti localPosition. My už vieme, že tento komponent je v skripte dostupný ako transform
. Ale ako do 1 vlastnosti transform.localPosition
vtesnať 3 čísla x,y,z ?
Táto localPosition
nie je len taká obyčajná vlastnosť typu float
alebo int
. Je to vlastnosť typu Vector3
a to je typ premenných, ktoré v sebe držia trojicu čísel. Presne pre naše x,y,z.
Celé priradenie urobíme takto:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NahodnaPoloha : MonoBehaviour { // Start is called before the first frame update void Start() { float x = Random.Range(-3.0f, 3.0f); float y = Random.Range(-3.0f, 3.0f); float z = Random.Range(-3.0f, 3.0f); transform.localPosition = new Vector3(x, y, z); } // Update is called once per frame void Update() { } }
Typ Vector3
je už zložitejší typ premenných ako obyčajný float
, int
či bool
. Je to takzvaný štruktúrovaný typ. Konkrétne v prípade Vector3
tá štruktúra pozostáva z troch premenných typu float
. Preto nemôžeme napísať len transform.localPosition = x,y,z
ale musíme povedať počítaču, že má vytvoriť celú novú štruktúru okolo našej trojice x,y,z: new Vector3(x, y, z)
.
Viac o vektoroch sa dozviete neskôr v tutoriáli SpaceGame.
Keď takto vygenerovaný náhodný vektor priradíme do vlastnosti transform.localPosition
zmení game objekt svoju pozíciu a vo výsledku tak naše kocky budú po spustení každá niekde náhodne:
Na domácu úlohu
Skúste vyrobiť aj skript NahodnaVelkost, ktorý nastaví kockám náhodnú veľkosť (transform.localScale
). Rovnako ako pozícia, aj veľkosť je vektorová vlastnosť a má tri zložky x, y, z.
Hotový projekt po tejto lekcii: Programovanie_09.zip