Slovenská technická univerzita Fakulta informatiky a informačných technológií
Ilkovičova 3, 842 19 Bratislava 4
VREducation
Dokumentácia k inžinierskemu dielu
Názov a číslo tímu: enViRea (tím 17)
Členovia tímu: Bc. Roman Hroš, Bc. Kristína Knapová, Bc. Adam Puškáš, Bc. Štefan
Šebeň, Bc. Jicchág Šoltés, Bc. Patrik Vlk, Bc. Richard Žikla
E-mail: [email protected]
Názov projektu: VREducation
Vedúci projektu: Ing. Juraj Vincúr
Spolupráca: Moving Medical Media, s. r. o.
Akademický rok: 2018/2019 (zimný semester)
1
Obsah
1 Úvod ............................................................................................................................................. 2
2 Globálne ciele projektu (zimný semester) ................................................................................... 3
3 Celkový pohľad na systém ........................................................................................................... 4
3.1 Architektúra ................................................................................................................................ 4
3.1.3 Herný engine ........................................................................................................................... 6
3.1.4 Vývojová sada pre virtuálnu realitu ........................................................................................ 6
3.2 Vysokoúrovňová štruktúra ......................................................................................................... 6
3.3 Riadenie ..................................................................................................................................... 8
4 Moduly systému ........................................................................................................................... 9
4.1 Návrh .......................................................................................................................................... 9
4.1.1 Kontrola hry .......................................................................................................................... 10
4.1.2 Hlavná herná slučka .............................................................................................................. 10
4.1.3 Zber odpadkov ...................................................................................................................... 11
4.1.4 Počítanie skóre ...................................................................................................................... 13
4.1.5 Úprava stavu prostredia ........................................................................................................ 16
4.1.6 Ovládanie linky a generátoru ................................................................................................ 18
4.1.7 Generovanie odpadu ............................................................................................................. 21
4.1.8 Triediaca linka ....................................................................................................................... 25
4.1.9 Vysypávanie odpadkových košov ......................................................................................... 25
4.1.10 Ničenie odpadu ................................................................................................................... 27
4.1.10 Zvuky .................................................................................................................................. 28
4.2 Implementácia .......................................................................................................................... 28
4.3 Testovanie ................................................................................................................................ 29
5 Záverečné zhodnotenie .............................................................................................................. 30
Príloha A ............................................................................................................................................ 31
Príloha B ............................................................................................................................................ 32
2
1 Úvod
Obsahom tohto dokumentu je technická dokumentácia projektu vypracovaného v rámci predmetu
Tímový projekt na tému Škola hrou vo virtuálnej realite – VREducation. Náplňou projektu
VREducation je vytvorenie edukačnej hry pre virtuálnu realitu (VR), ktorej cieľom bude oboznámiť mladšie
generácie (predovšetkým žiakov základných škôl) s určitým environmentálnym problémom zábavnou
a dynamickou formou, nabádajúc hráča na rozhodnutia, ktoré budú voči životnému prostrediu čo najšetrnejšie.
Po konzultácii s vedúcim projektu, ako aj zástupcami spolupracujúcej firmy (Moving Medical Media, s.r.o.),
sme sa rozhodli zamerať na problém separovania odpadu, zdôrazňujúc negatívny dopad na životné prostredie
v prípade nesprávnych hráčových rozhodnutí.
Aktuálna iterácia konceptu hry, ktorú náš tím vyvíja, zahŕňa prostredie recyklačnej linky, v rámci ktorej
je primárnou úlohou hráča triediť odpad (prichádzajúci po dopravníkovom páse) do niekoľkých druhov
kontajnerov na základe druhu konkrétneho odpadku (plast, papier, sklo a i.). Za správne rozhodnutia je hráč
odmeňovaný bodmi, vyjadrujúcimi jeho úspešnosť v hre, pričom nesprávne rozhodnutie, resp. nedostatočne
včasná reakcia má (odhliadnuc od úbytku bodov) za následok hromadenie odpadu na skládke, nachádzajúcej
sa vo vonkajšom prostredí v blízkosti separačnej linky. Zatiaľ čo v prvotných iteráciách hry je vonkajšie
prostredie „statické“ (hráčovi je umožnený iba pohľad doň skrz dvere budovy triediacej linky), vo finálnej
verzii počítame s možnosťou vyjdenia von z budovy, umožňujúc hráčovi vykonávať rôzne doplnkové aktivity
(napr. zbierať rozhádzaný odpad), ako aj vidieť dopad svojich rozhodnutí na vlastné oči (v podobe veľkosti
skládky či celkového znečistenia prostredia).
Tento dokument približuje celkovú víziu, architektúru a technickú časť projektu. V
jednotlivých kapitolách sú popísané globálne ciele projektu (kapitola 2), celkový pohľad na systém
(kapitola 3) a opis jednotlivých modulov systému (kapitola 4). Piatu časť dokumentu tvorí Záverečné
zhodnotenie po prvej fáze riešenia projektu. V rámci prílohy A uvádzame niekoľko obrázkov,
zachytávajúcich prostredie vyvíjanej hry, pričom príloha B obsahuje vygenerovanú technickú
dokumentáciu k implementácii a formálne záznamy z testovania produktu.
3
2 Globálne ciele projektu (zimný semester)
Cieľom tímového projektu na zimný semester je vytvorenie hrateľného prototypu navrhovanej hry,
reflektujúceho základné požiadavky objednávateľa projektu na výsledný produkt.. Pre zabezpečenie
tohto globálneho cieľu je nutné vytýčiť si menšie ciele, na ktorých budeme následne stavať.
Prvým z cieľov je ujasniť si celkový koncept hry s partnerom (Moving Medical Media, s. r.
o.), pretože zadanie nešpecifikuje konkrétny environmentálny problém, žáner hry ani úroveň
grafickej hodnovernosti. Požiadavky na funkcionalitu sú diskutované vždy pri stretnutí s product
ownerom a menia sa na základe spätnej väzby, získanej prezentáciou aktuálnej verzie prototypu.
Po prvom stretnutí s partnerom bol ako cieľ špecifikovaný environmentálny problém –
triedenie odpadu na triediacej linke, kladúc dôraz na čo najvyššiu úroveň realizmu. Pre jej docielenie
je nutné nájsť a analyzovať vhodné, realistické modely a grafické prvky, ktoré budú tvoriť scénu hry.
Tieto modely budú delené na tri časti; prvou z nich sú modely pre vnútorné prostredie triediacej linky
(napr. dopravníkový pás, regály, rôzne potrubia, odpadkové koše atď.) Druhou časťou sú prírodné
prvky, ktoré budú tvoriť vonkajšiu scénu (sú to napr. stromy, kríky, tráva a pod.). Tretiu časť tvorí
samotný odpad. Pre každý typ odpadu (sklo, papier, plast atď.) je potrebné nájsť dostatočný počet
realistických modelov, následne je potrebné tieto modely vhodne kategorizovať, aby systém
zaznamenával správnosť vhodenia typu odpadu do správneho koša.
Ďalším z cieľov je vytvorenie vhodnej hernej mechaniky, tá musí byť navrhnutá tak, aby bola
hra zábavná, ale aby taktiež poukazovala na zvolený environmentálny problém. Aby mohol
používateľ triediť odpad, musí mu byť umožnená interakcia s objektami; ďalej je nutné, aby sa mohol
v prostredí pohybovať, čiže bude mať možnosť používať teleport, pretože prirodzený pohyb
v prostredí virtuálnej reality je vo všeobecnosti veľmi obmedzený.
Ďalším cieľom je s vhodnými, realistickými grafickými modelmi vytvoriť samotnú scénu –
triediacu linku a jej okolie, v rámci ktorej bude hráč triediť odpad. S týmto je spojená potreba vytvoriť
dynamický dopravníkový pás a náhodný generátor odpadu, ktorý bude na pás generovať odpad
rôzneho typu.
Pre zobrazenie úspešnosti triedenia je nutné vytvoriť indikátor hráčovho skóre, čo znamená
vytvoriť modul, ktorý bude zaznamenávať a následne zobrazovať správnosť triedenia. Pri
nesprávnom triedení sa bude skóre odpočítavať, pri správnom pričítavať.
Keďže koše, do ktorých bude používateľ odpad z pásu triediť, majú obmedzenú kapacitu, je
taktiež vhodné vytvoriť automatické rameno, ktoré bude koše s vytriedeným odpadom v pravidelných
intervaloch vysýpať.
Ako ďalší cieľ sme si zvolili poukázanie na zvolený environmentálny problém priamo v hre,
čiže aby ho hráč zažil “vlastnej koži” počas hrania. Zvolili sme vizualizáciu dynamickej skládky, tá
4
sa pri správnom triedení zmenšuje a pri nesprávnom zväčšuje.
3 Celkový pohľad na systém
V rámci tejto kapitoly poskytujeme celkový pohľad na systém z pohľadu architektúry.
3.1 Architektúra
Náš systém je z podstaty projektu navrhnutý ako samostatná desktopová aplikácia, v ktorej sú
zahrnuté všetky údaje aj správanie systému a v ktorej komunikácia prebieha výhradne lokálne na
jednom počítači. Za jediné fyzicky oddelené časti systému sa dajú považovať rôzne periférne
zariadenia ako napríklad VR headset, avšak aj tieto sú súčasťou jedného výpočtového stroja, takže
ich nebudeme považovať za samostatné komponenty, čo je v súčasnosti bežná prax.
Samotná logika hry, ktorú my tvoríme, je pritom len jednou z viacerých súčastí
komplexnejšieho systému, v ktorom možno zo softvérového pohľadu určiť viacero softvérových
komponentov, z ktorých každý tvorí systém na inej úrovni abstrahovania funkcionality.
Takéto komponenty sme definovali 4:
• Logika hry
• Nadstavby enginu s nástrojmi pre virtuálnu realitu
• Herný engine
• Vývojová sada pre virtuálnu realitu
Ako piatu vrstvu by bolo možné zadefinovať vrstvu samotného hardvéru, ale tá z pohľadu softvéru
nie je zaujímavá a jej existencia je implicitná pre každý softvérový systém.
V našom projekte vytvárame iba komponent logiky hry a do ostatných komponentov nezasahujeme,
iba využívame funkcionalitu, ktorú poskytujú.
Vizualizáciu architektonického pohľadu na hru zachytávame na Obrázku 1.
5
Obrázok 1: Vysokoúrovňový pohľad na architektúru hry.
3.1.1 Logika hry
Tento komponent zahŕňa predovšetkým konkrétnu logiku a audio-vizuálnu časť hry a stojí v hierarchii
architektúry systému na najvyššej úrovni abstrakcie. Je to v podstate to, čo hráč vníma ako hru.
Na logiku hry sa dá nazerať len ako na rozšírenie funkcionality herného enginu, ktorý jej
poskytuje vopred pripravené rozhrania na konkrétnu realizáciu. Zatiaľ čo sa teda logika hry zaoberá
tým, čo sa kedy zobrazí, vykoná a ozve, nijako sa už nestará o samotnú implementáciu zobrazovania,
fyzikálnej simulácie, či ozvučenia.
Mimo toho logika hry využíva aj nadstavbu enginu s nástrojmi pre virtuálnu realitu, ktoré jej
poskytujú hotové funkcie pre vysokoúrovňovú prácu s virtuálnou realitou. Avšak k enginu
nepristupuje výhradne cez túto nadstavbu a využíva aj priamo samotný engine.
3.1.2 Nadstavba enginu s nástrojmi pre virtuálnu realitu
Tento komponent je súborom knižníc pre prácu s virtuálnou realitou na veľmi vysokej úrovni.
abstrahovanej do realizácie typických herných prvkov a problémov, ktoré sa pri tvorbe VR hier tvoria
a riešia – napríklad interaktivita objektov, teleportácia, pohyb.
Knižnice boli tvorené podobne ako logika hry, rozširovaním funkcionality, týkajúcej sa
6
virtuálnej reality, ktorá je už poskytovaná herným enginom, ibaže neboli určené na to, aby ony samy
predstavovali nejakú hru.
3.1.3 Herný engine
Herný engine je masívny komponent, ktorý z hľadiska programovania vo svojom vnútre drží
množstvo vlastných podsystémov, z ktorých sa každý stará riešenie iných typických,
nízkoúrovňových problémov, ktoré treba pri vytváraní videohier riešiť. Jedná s predovšetkým o také
problémy, ktorých riešenie je nezávislé od konkrétnej logiky hry ako napríklad renderovanie, tvorenie
3D scén, ozvučenie, fyzikálna simulácia, networking a pod. Vnútornú štruktúru tohto komponentu
však nemožno ďalej znázorniť, pretože sa jedná o komerčný projekt, ktorý utajuje informácie o
svojom architektonickom návrhu a svojom programovom kóde.
Herný engine taktiež zo svojej úrovne kontroluje celkové riadenie systému. Logika hry pritom
kontroluje iba logiku konkrétnej hry.
O hernom engine ako takom však nie je možné hovoriť ako iba o nejakom programovacom
„frameworku“, pretože podobne ako samotná hra presahuje programátorský rozmer a zahŕňa aj
nástroje na tvorbu multimediálneho obsahu, napríklad editory pre vytváranie 3D scény, animovanie
modelov a podobne.
3.1.4 Vývojová sada pre virtuálnu realitu
Vývojová sada pre virtuálnu realitu sú hardvérovo-závislé knižnice, ktorý sa nachádzajú veľmi blízko
hardvéru a ich úlohou je najmä komunikácia s týmto hardvérom. Knižnice tvoria tú najnižšiu úroveň,
na ktorej možno vyvíjať softvér pre rôzne headsety pre virtuálnu realitu. V našom prípade sa jedná
o knižnicu VRTK v spolupráci s platformou SteamVR.
3.2 Vysokoúrovňová štruktúra
Štruktúra tried systému na najvyššej úrovni odpovedá vzťahom vyjadrenými prostredníctvom
komponentov.
V diagrame (Obrázok 2) sú vyňaté z modelu iba tie triedy, ktoré sme vytvárali my a ktoré
majú významnú a aktívnu rolu na realizovaní logiky hry.
7
Obrázok 2: diagram tried hry.
Rozširovanie logiky hry prebieha takmer výlučne využívaním predpripravených rozhraní a tried v
Unity Engine. Je to zapríčinené spôsobom, akými sa objekty v hre (herné objekty), s ktorými
prichádza do kontaktu hráč, komponujú z objektov - z inštancií tried.
Herný objekt je v UnityEngine samostatná trieda (GameObject), ktorá je komponovaná z tzv.
komponentov, čo sú triedy dediace od Component, resp. MonoBehaviour. Metódy týchto tried ako
Awake, Start, Update a iné definujú správanie týchto komponentov, pričom každá z metód dostáva
riadenie v inej časti slučky obnovovania hry. Skrz ich kompozíciu v triede GameObject je potom
definované správanie objektu.
V tohoto dôsledku sú predovšetkým triedy, ktoré sú zodpovedné za vykonávanie odlišných
herných mechanizmov hry navzájom pomerne nezávislé a taktiež možno vravieť o tom, že riadenie
medzi nimi je na konceptuálnej úrovni distribuované.
8
3.3 Riadenie
Ako bolo už spomenuté, celkové riadenie systému kontroluje Unity Engine.
Unity Engine nemá zverejnenú dokumentáciu svojho návrhu, či kód a tak okrem
konštatovania, že všetko riadenie vychádza práve z herného enginu nemožno explicitne zaznačiť, ako
sa celkovo toto riadenie posúva v rámci komponentu, či naprieč komponentami. Taktiež nemožno
explicitne vyjadriť, ako sa posúva riadenie v rámci logiky hry, teda komponentu, ktorý tvoríme my.
Unity Engine má však predsa pre účely vývojárov videohier zverejnený diagram aktivít, ktorý
aspoň konceptuálne zaznamenáva, ako sa v Unity Engine predáva riadenie do rozšíriteľných metód
tried, ktoré sa používajú na tvorbu logiky hry. Tento diagram teda v princípe znázorňuje hlavnú slučku
riadenia, ktorá sa po spustení v hre točí, až dokiaľ nie je hra vypnutá.
9
4 Moduly systému
V tejto časti zachytávame našu hru v rámci konkrétnych „modulov“, ktoré ju tvoria..
4.1 Návrh
Počítačová hra je špecifický softvérový systém, u ktorého tvorby nie je často možné, alebo vhodné
použiť metódy, ktoré sa používajú pri iných typoch softvéru. Od toho sa vyvíja aj spôsob, akými sme
zaznamenávali návrh systému na najvyššej úrovni.
Pri návrhu sme nepoužívali bežný spôsob zaznamenávania požiadaviek na hru
prostredníctvom prípadov použitia a príbuzných metód a to aj preto, lebo sme sa obávali, že by bolo
nutné poupraviť nám známe postupy a pravidlá tvorby prípadov použitia, čo by sa nemuselo stretnúť
s pochopením u prípadného čitateľa tohto dokumentu. Na druhú stranu sa ale táto technika ani
nezvykne pri tvorbe viedohier používať (http://homepages.inf.ed.ac.uk/perdita/guide.pdf), snáď i pre
vágnosť a generickosť požiadaviek na hru, s čím sme sa stretli aj my.
Namiesto prípadov použitia sme teda radšej použili priamo na zachytenie mechaník hry
diagramy aktivít, ktoré sa zdajú byť pre takýto softvér prirodzené. Videohru sme navrhovali najprv
skrz definovanie očakávaného správania, čiže herných mechaník, a z tohto správania sme sa následne
snažili odvodiť štruktúru, ktorá by očakávané správanie napĺňala, najčastejšie odvodením od partícií,
ktoré sa v diagramoch aktivít vyskytovali.
Pre zachytávanie návrhu, ktoré sa už blížilo samotnej implementácii sme používali sekvenčné
diagramy, ktoré očakávané správanie definovali konkrétnejšie a vedeli teda lepšie vyjadriť kontrakt
medzi návrhom a implementáciou.
Pri zaznamenávaní štruktúry vznikla malá komplikácia, keďže Unity Engine kladie veľký
dôraz na komponovateľnosť herných prvkov z nezávislých komponentov. Jeden herný prvok nie je v
hre vyjadrený iba inštanciou nejakej triedy, ale kompozíciou viacerých inštancií odlišných tried. Aby
sme nestratili aj tento holistický pohľad na štruktúru, zaznamenávali sme štruktúry takýchto herných
objekty pomocou diagramu objektov.
Poznámka 1: Nie vždy sme návrh zaznamenali, týka sa to najmä prípadov, keď sa to javilo zbytočné
(jediná aktivita v diagrame správania, jediný stav v stavovom diagrame..).
Poznámka 2: Videohra je ešte stále v procese vývoja, takže nie každý herný mechanizmus je rovnako
bohato popísaný, i vzhľadom na úroveň, v akom stave sa nachádza jeho návrh či implementácia.
Poznámka 3: keď sa v nižšie uvedených diagramoch vraví o komponentoch, myslia sa tým triedy
dediace od triedy Component, resp. MonoBehaviour.
10
4.1.1 Kontrola hry
Tento diagram (Obrázok 3) vyjadruje na najvyššej úrovni ako hra prebieha od spustenia až po koniec.
Jedná sa len o konceptuálne znázornenie, nakoľko aj kontrola hry je podriadená riadeniu od herného
enginu.
Najprv dôjde k inicializácii scény a herných prvkov - spustí sa triediaca linka, generátor
odpadu, automatický „vysypávač“ smetí a inicializuje sa hráčovo skóre. Až následne sa spustením
hry pre hráča začne hlavná herná slučka, kde hráč hrá hru.
Kontrolór hry odpočítava čas do konca hry a po naplnení času je hra ukončená.
Obrázok 3.
4.1.2 Hlavná herná slučka
Tento diagram aktivít (Obrázok 4) vyjadruje činnosti, ktoré hráč opakovane vykonáva v hre. Tieto
činnosti predstavujú hrateľnosť hry.
Nateraz je stav návrhu našej hry taký, že hlavná herná slučka je tvorená len zberom odpadkov
a zastavovaním triediacej linky a generátora odpadkov. Tieto činnosti hráč vykonáva podľa ľubovôle,
až pokiaľ herný kontrolór nezastaví hru a hráč je donútení hru ukončiť.
11
Obrázok 4.
4.1.3 Zber odpadkov
Tento diagram (Obrázok 5) vyjadruje ako by mal hráč vykonávať zber odpadkov v hre. V podstate sa
jedná o to, že hráč nachádza a následne sa presúva k danému odpadku, zdvíha ho a hádže do nejakého
zberača odpadu. Po dopade odpadku do zberača dochádza na základe správnosti separácie k
prepočítaniu hráčovho skóre.
V úrovni v továrni, ktorá je nateraz jediná v hre, pritom prichádzajú odpadky po triediacej
linke priamo k štartovnej pozícii hráča, takže hráč nemusí odpadky aktívne hľadať odpadky po
úrovni. V tejto úrovni je taktiež hra prispôsobená tak, že hráč zo svojej štartovnej pozícii pri triediacej
linke neslúžia ako zberač odpadu priamo odpadkové koše, ale pomocné pásy, ktoré smerujú k
samotným košom. Hráč hádže odpadky na tieto pomocné pásy, pričom už tieto pomocné pásy počítajú
hráčovo skóre. Z týchto pomocných pásov už hráč odpadky zbierať nemôže.
12
Obrázok 5.
Tento diagram (Obrázok 6) predovšetkým ukazuje všetky typy odpadu, ktoré boli pre potreby hry
zadefinované a taktiež približuje aj ich objektovú kompozíciu.
Obrázok 6.
13
Tento diagram (Obrázok 7) znázorňuje objektovú kompozíciu, ktorá v hre prestavuje odpad.
Obrázok 7.
4.1.4 Počítanie skóre
Tento diagram (Obrázok 8) znázorňuje všetky činnosti v hre, ktoré upravujú hráčovo skóre.
Momentálne to je len vloženie odpadku do zberača odpadu, ale nie je vylúčené, že s ďalším vývojom
pribudnú ďalšie takéto činnosti
Dobré body sa teda hráčovi pričítavajú, ak vkladá od zberačov odpadu odpad takého typu,
ktoré odpovedá typu zbieraného do daného zberača. Zlé body sa potom pričítavajú v opačnom
prípade, teda ak je do zberaču odpadu vložený odpad iného typu, než by sa mal doňho zbierať. V
prvej úrovni sa pritom pripočítavajú zlé body aj v prípade, ak hráč nechá prejsť odpadok po triediacej
linky až po jej koniec. Toto je však taktiež interne realizované cez zberače odpadov. Na konci linky
je jednoducho zberač odpadu, ktorého typ sa nezhoduje s typom žiadneho odpadku.
Mimo toho v hre je ešte aj percentuálne vyjadrenie úspešnosti hráča pri zbieraní odpadkov -
tzv. skóre. Táto miera sa mení pri každom pripočítaní dobrého, či zlého bodu, pričom platí, že pri
pričítaní dobré bodu skóre rastie, pri pripočítaní zlého bodu skóre klesá. Na základe hodnoty tohto
skóre sa potom vykonáva úprava stavu životného prostredia.
Pri každej úprave skóre sa taktiež obnovuje zobrazenie skóre, aby bolo v každom momente
aktuálne.
14
Obrázok 8.
Diagram na Obrázku 9 približuje konkrétnu implementáciu počítania skóre v hre.
15
Obrázok 9.
Tieto diagramy (Obrázok 10a, 10b) znázorňujú komponenty, ktoré sa podieľajú na tvorení logiky
počítanie skóre v hre.
Obrázok 10a.
16
Obrázok 10b.
4.1.5 Úprava stavu prostredia
Tento diagram (Obrázok 11) vyjadruje návrh, akým spôsobom prebieha zmena životného prostredia
v hre, ktoré v hre zároveň vyjadruje hráčovej úspešnosť v hre.
Pri každej úprave stavu prostredia sa overuje, či bola prekročená niektorá zo zadefinovaných
hraníc jednotlivých úrovní prostredia. Pri prekročení hranice sa zmení úroveň a s ňou aj grafické
vyjadrenie životného prostredia. Pri zhoršovaní prostredie pôsobí viac skazene, pri zlepšovaní pôsobí
čistejšie a prirodzenejšie.
V hre je úprava stavu životného prostredia zadefinovaná tak, že sa mení spolu s výškou
hráčovho skóre.
17
Obrázok 11.
Tento diagram sekvencií (Obrázok 12) približuje konkrétnu implementáciu menenia stavu životného
prostredia v hre.
18
Obrázok 12.
Tento diagram (Obrázok 13) znázorňuje komponenty, ktoré sa podieľajú na tvorení logiky
upravovania stavu životného prostredia v hre.
Obrázok 13.
4.1.6 Ovládanie linky a generátoru
Tento diagram sekvencií (Obrázok 14) predstavuje návrh, akým spôsobom je realizované
zastavovanie a spúšťanie triediacej linky a generátora odpadu.
19
Hráč sa v hre kedykoľvek môže pokúsiť zastaviť generátor odpadu. Musí sa však presunúť k
ovládaniu generátora a aktivovať ho. Hráč má v však v hre len obmedzený čas, po ktorý môže
udržiavať generátor a triediacu linku zastavenú. Ak už hráčovi tento čas uplynul, hráč už nemôže viac
zastavovať generátor a pás a pri aktivovaní ovládacieho prvku sa nič nevykoná. Ak hráč ale ešte
nevyčerpal všetok čas na zastavenie, po aktivovaní ovládacieho prvku sa pás a generátor zastaví,
pričom sa začne odpočítavať z času, ktorý ma hráč k dispozícii na ich zastavenie. Po jeho uplynutí sa
generátor a pás samy spustia. Ak je už pás a generátor zastavený, keď hráč aktivuje ovládací prvok,
pás a generátor sa znova pustia a čas sa prestane odpočítavať.
Obrázok 14.
Tento diagram sekvencií (Obrázok 15) predstavuje konkrétnu implementáciu ovládania hlavného
pásu prostredníctvom páčky.
20
Obrázok 15.
Tento diagram tried (Obrázok 16) znázorňuje komponenty, ktoré sa podieľajú na tvorení logiky
ovládania hlavnej linky a generátoru odpadu.
Obrázok 16.
21
Tento diagram sekvencií (Obrázok 17) predstavuje konkrétnu implementáciu zastavovania pásov,
ktoré smerujú ku košom, keď sa koše vysýpajú.
Obrázok 17.
Tento diagram (Obrázok 18) znázorňuje komponenty, ktoré sa podieľajú na tvorení logiky
zastavovania pásov pri vysýpaní košov.
Obrázok 18.
4.1.7 Generovanie odpadu
Tento diagram sekvencií (Obrázok 19) vyjadruje, akým spôsobom pracuje generátor odpadu. Od
momentu, kedy je generátor spustený, generátor cyklí medzi čakaním na čas generácie a následným
generovaním odpadu, keď nastane čas generácie, a to až pokiaľ nie je generátor znova zastavený.
22
Obrázok 19.
Tento stavový diagram (Obrázok 20) vyjadruje stavy generátora odpadu. Generátor je buď v stave,
keď aktívne generuje odpad - t.j. je schopný generovania odpadu tak ako je to popísané v príslušnom
diagrame aktivít, alebo je v stave, keď je zastavený a tak ani nie je schopný generovať odpad.
23
Obrázok 20.
Tento diagram (Obrázok 21) predstavuje konkrétnu implementáciu generovania odpadu
prostredníctvom generátora, ktorý odpad generuje podľa vopred daného poradia.
Obrázok 21.
Tento diagram (Obrázok 22) predstavuje konkrétnu implementáciu generovania odpadu
prostredníctvom náhodného generátora, keď sa odpad na generovanie vyberá z dostupných možností
24
náhodne.
Obrázok 22.
Tento diagram (Obrázok 23) znázorňuje komponenty, ktoré spolu vytvárajú logiku generovania
odpadkov v hre.
Obrázok 23.
25
4.1.8 Triediaca linka
Tento diagram (Obrázok 24) znázorňuje stavy, v akých sa môže nachádzať v hre triediaca linka.
Obdobne ako generátor, triediaca linka môže prechádzať 2 stavmi: buď sa posúva, alebo je zastavená.
Obrázok 24.
4.1.9 Vysypávanie odpadkových košov
Tento diagram aktivít (Obrázok 25) vyjadruje návrh na realizáciu automatu na priebežné vysypávanie
košov.
Vysypávanie odpadkových košov sa vykonáva rovnakým princípom ako generovanie odpadu,
teda po spustení sa cyklí čakanie na čas vysypávania a samotná rotácia - vysypávanie košov, keď čas
vysypávania uplynie a takto až po moment, keď je automat na vysypávanie zastavený.
26
Obrázok 25.
Tento stavový diagram (Obrázok 26) znázorňuje stavy automatu na vysypávanie odpadu.
Automat môže prechádzať 3 stavmi. Prvý stav je, keď je nečinný a čaká na čas vysypávania.
Po uplynutí času čakania na vysypávanie prejde do stavu vysypávania, v ktorom sa pohybuje. Pokiaľ
je automat nečinný a čaká na vysypávanie, môže byť ešte dodatočne celkom zastavený.
27
Obrázok 26.
4.1.10 Ničenie odpadu
Tento diagram (Obrázok 27) znázorňuje komponenty, ktoré spolu vytvárajú logiku ničenia odpadkov
v hre.
Obrázok 27.
28
4.1.10 Zvuky
Tieto komponenty sa starajú o dotváranie atmosféry hry pomocou zvukov. Diagram na Obrázku 28
znázorňuje komponent, vďaka ktorému je počuť zvuk triediacej linky na pozadí.
Obrázok 28.
Tento diagram (Obrázok 29) znázorňuje komponent, vďaka ktorému je počuť zvuk triediacej linky
na pozadí.
Obrázok 29.
Tento diagram (Obrázok 30) znázorňuje komponenty, ktoré sa podieľajú na prehrávaní zvuku pásu a
stlmovaní zvuku ked je hlavný pás vypnutý.
Obrázok 30.
4.2 Implementácia
Technická dokumentácia k implementácii sa nachádza v prílohe B.
29
4.3 Testovanie
Pretože náš projekt je hra, čiže vysoko špecifický druh softvéru, testovanie nebolo možné vykonávať
klasickým spôsobom. Automatické testy sú v tomto prípade problematické, pretože je menený
dynamický koncept produktu; testy by bolo zložité vytvoriť a nezaručovali by funkcionalitu.
Testovanie preto prebiehalo manuálne (integračné testy) na VR headsete; nová funkcionalita
bola odsúhlasená až keď fungovala so SteamVR. Do 3. šprintu boli testy vykonávané neformálne:
tester spustil projekt vo VR a manuálne testoval požadovanú funkciu, v našom prípade to bol prevažne
reviewer. Od ďalšieho šprintu boli vykonávané aj formálne testy s presne definovanou požadovanou
funkcionalitou, stále sa ale jedná o manuálne testovanie. V rámci zachovania kvality vytvárame
regresné testy, ktoré pokrývajú už vytvorenú funkcionalitu. V praxi sú tieto testy automatizované, ale
pretože je automatizácia v našom prípade vysoko netriviálna a časovo náročná, aj na základe
odporúčania oboch mentorov (počas diskusie v rámci fakultou organizovaného mentoringu) sme sa
rozhodli pokračovať v manuálnom testovaní.
Do budúcna plánujeme vykonať testy so skutočnými používateľmi, od ktorých budeme
očakávať spätnú väzbu v podobe celkového pohľadu na projekt, poprípade vytýčenie nedostatkov
alebo špecifických potrieb jednotlivých používateľov.
Formalizovaný záznam z manuálnych testov sa nachádza v prílohe B.
30
5 Záverečné zhodnotenie
V rámci prvej etapy riešenia projektu navrhol náš tím koncept edukačnej hry pre virtuálnu realitu,
ktorej cieľom je oboznámiť žiakov základných škôl s problematikou separovania odpadu hravou a
zábavnou formou. Výstupom prvých piatich šprintov tímu bolo 5 vydaní prototypu navrhnutej hry,
pričom doposiaľ posledný z nich mal k úspešnému naplneniu očakávaní zákazníka najbližšie.
Z pohľadu vytýčených cieľov pre zimný semester v korelácii s aktuálnou podobou nami
implementovaného produktu si dovoľujeme konštatovať, že sa nám stanovené ciele podarilo naplniť
v súlade s očakávaniami. Svedčí o tom nielen skutočnosť, že súčasný prototyp hry predstavuje
rozpracovanie výsledného produktu na pomerne vysokej úrovni hodnovernosti, ale predovšetkým
pozitívna spätná väzba, ktorú sme v rámci záverečnej prezentácie v tomto semestri obdržali od
zástupcov partnerskej firmy Moving Medical Media, s. r. o., ktorí boli so súčasným smerovaním
projektu nadmieru spokojní (podrobnosti možno nájsť v rámci sumarizácií šprintov, ktoré sú súčasťou
Dokumentácie k riadeniu projektu).
Z uvedených dôvodov existuje opodstatnený predpoklad, že výsledný produkt sa nášmu tímu
v rámci nadchádzajúcej etapy riešenia projektu podarí dodať v súlade s požiadavkami objednávateľa
a na čo najvyššej úrovni kvality.
31
Príloha A
V nasledovnej sekcii uvádzame 2 obrázky, zachytávajúce súčasnú podobu prostredia hry, ktorú
v rámci nášho projektu vyvíjame. Obrázok A1 obsahuje pohľad na dopravníkový pás v rámci
triediacej linky, pričom v pozadí možno vidieť tabuľu s aktuálnym skóre, ako aj skládku odpadu vo
vonkajšom prostredí. Obrázok A2 zachytáva generátor odpadu, pákový mechanizmus pre
manipuláciu s pásom a hodiny, indikujúce čas, v rámci ktorého je hráčovi dovolené ponechať pás
zastavený.
Obrázok A1.
Obrázok A2.
32
Príloha B
Prvá časť tejto sekcie obsahuje vygenerovanú technickú dokumentáciu k implementovanému
produktu. Druhá časť obsahuje formálne záznamy z manuálnych testov produktu.
Software documentation 13 decembra, 2018
Page 1 of 38
Technická dokumentácia (VREducation)
Software documentation 13 decembra, 2018
Page 2 of 38
BeltTimer Menný priestor: '' Rozširuje
Kontroluje cas, na ktorý môžu byt zastavené pásy a kedy hrác presiahne casový limit, tak zaistí že sa všetko
spustí a už sa nebude môcž dat zastavit.
Atribút clock
clock : GameObject Public
Reprezentuje objekt hodín
[ Is static True. ]
Atribút clockScript
clockScript : ClockInterface Private
Drží objekt skriptu, ktorý je naviazaný na hodinách a stará sa o casovanie
[ Is static True. ]
Atribút sBeltControl
sBeltControl : SingletonBeltControl Private
inštancia singletona
[ Is static True. ]
Metóda SeltBeltPause
SeltBeltPause (bp : float ) : void Public
informuje o tom ci je pás zastavený alebo nie
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Start
Start () : void Protected
inicializácia atribútov
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Update
Update () : void Protected
Software documentation 13 decembra, 2018
Page 3 of 38
Metóda Update
Tu sa kontroluje dodržanie limitu, updatovanie casu na hodinách
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
BinRotator
Menný priestor: '' Rozširuje MonoBehaviour
Slúži na upovedomenie pásov ci majú stát alebo nie, taktiež slúži na rotovanie košov
Atribút singletonBeltStop
singletonBeltStop : BeltStop Private
inštancia singletona BeltStop-u
[ Is static True. ]
Metóda RotateOverTime
RotateOverTime () : IEnumerator Protected
Metóda, ktorá rotuje koše a notifikuje pásy kedy majú stát prostredníctvom singletona
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Start
Start () : void Protected
Inicializácia statickej inštancie singletona
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 4 of 38
Clock1 Menný priestor: '' Rozširuje
Trieda, ktorá sa stará o ukazovanie správneho casu na hodinkách
Metóda SetClockState
SetClockState (dt : float ) : void Public
sa stará o ukazovanie casu na hodinkách(presúvanie rucicky/prehadzovanie digitalnych cisiel)
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 5 of 38
Conveyor sound Menný priestor: '' Rozširuje
Zvuk pásov
Atribút volume
volume : float Public
Výška hlasitosti zvuku
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 6 of 38
DropSound Menný priestor: '' Rozširuje
Trieda, ktorá sa stará, že ked dopadne objekt na pás tak vydá zvuk, je to komponent na páse
Atribút dropSound
dropSound : GameObject Public
GameObject s komponentom Audio Source, kde je nahrávka buchnutia objektu
[ Is static True. ]
Metóda OnCollisionEnter
OnCollisionEnter () : void Protected
Prehrá sa zvuk buchnutia, ked pás aznamená kolíziu
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 7 of 38
Environment Menný priestor: '' Rozširuje MonoBehaviour
Komponent slúži na menenie grafickej podoby životného prostredia, ktoré sai mení spolu s hráčovým skóre.
V hre by mala by existovať iba jedna inštancia tejto triedy. Odkaz k tejto inštancii je uložený ako statický
atribút triedy.
Atribút currTrashLevel
currTrashLevel : int Private
Aktuálna úroveň znečistenia prostredia.
[ Is static True. ]
Atribút envObjects
envObjects : LeveledMesh Private
Zoznam objektov, ktoré tvoria životné prostredie a menia svoju grafickú podobu v závislosti od aktuálnej úrovne
znečistenia prostredia.
[ Is static True. ]
Atribút envUpdateCoroutine
envUpdateCoroutine : Coroutine Private
Korutina, ktorá aktuálne vykonáva menenie podoby objektov životného prostredia.
[ Is static True. ]
Atribút instance
instance : Environment Private
Statický odkaz na poslednú vzniknutú inštanciu triedy.
[ Is static True. ]
Atribút trashLevelBoundaries
trashLevelBoundaries : int Private
Hranice jednotlivých úrvoní znečistenia prostredia.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 8 of 38
Metóda Awake
Awake () : void Public
Metóda, ktorá sa spustí po inicializácii komponentov, ešte pred spustením hry.
Vyhľadá všetky objekty tvoriace životné prostredie, ktoré sa mení s úrovňou odpadu a nastaví im počiatočnú
úroveň.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getTrashLevel
getTrashLevel () : int Public
Vráti aktuálnu úroveň znečistenia prostredia.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda setTrashLevel
setTrashLevel () : void Private
Nastavý aktuálnu úroveň znečistenia prostredia. Ak sa úroveň zmení, zároveň sa spustí korutina, ktorá postupne
vykonáva zmenu podoby jednotlivých objektov životného prostredia.
Ak už beží korutina obnovovania podoby prostredia, zastaví sa, aby sa mohla spustiť nová.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Start
Start () : void Public
Metóda, ktorá sa volá tesne po spustení hry, tesne pre prvým volaním Update.
Priradí túto inštanciu triedy do odkazu v atribúte instance.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateEnvironment
UpdateEnvironment () : IEnumerator Public
Metóda, ktorá postupne mení grafické vyjadrenie ovjektov životného prostredia v dávkach akceptovateľnej
veľkosti.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateTrashLevel
UpdateTrashLevel (scorePecentage : float ) : void Public
Software documentation 13 decembra, 2018
Page 9 of 38
Metóda UpdateTrashLevel
Podľa zadanej výšky skóre sa zistí odpovedajúca úroveň životného prostredia a nastaví sa cez setTrashLevel().
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 10 of 38
GameManager Menný priestor: '' Rozširuje
Manažér hry
Atribút AudioSource
AudioSource : Public
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 11 of 38
HitSound Menný priestor: '' Rozširuje
Metóda Play
Play () : void Public
prehrá zvuk
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 12 of 38
ChildControlReactor Menný priestor: '' Rozširuje ControlReactor
Trieda zdedená od ControlReactor Z VRTK a slúži na notifikovanie observerov, ked sa zmení hodnota/poloha
pácky
Atribút SBeltControl
SBeltControl : SingletonBeltControl Private
inštancia singletona kvôli notifikácií observerov
[ Is static True. ]
Metóda HandleChanged
HandleChanged (sender : object , e : Control3DEventArgs ) : void Protected
reauguje na zmenu polohy pácky
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateText
UpdateText (speed : float ) : void Protected
notifikuje observerov ked sa zmeni pácka
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda ValueChanged
ValueChanged (sender : object , e : ControllableEventArgs ) : void Protected
reauguje na zmenu hodnoty pácky
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 13 of 38
LeveledMesh Menný priestor: '' Rozširuje
Komponent vyjadruje všetky objekty v hre, ktoré majú zadefinovaných pomocou shape keys viac úrovni
svojej grafickej podoby.
Skrz tento komponent sa realizuje dynamická úprava životného prostredia.
Atribút canIncrease
canIncrease : boolean Private
Príznak, ktorý určuje, či sa môže údroveň objektu zlepšovať.
[ Is static True. ]
Atribút changeTime
changeTime : float Private
Dĺžka trvania zmeny podoby z jednej úrovne do inej.
[ Is static True. ]
Atribút isChangingMesh
isChangingMesh : boolean Private
Vyjadruje, či aktuálne dochádza k zmene grafickej podoby objektu.
[ Is static True. ]
Atribút maxLevels
maxLevels : int Private
Maximálny počet úrovni grafickej podoby objektu.
[ Is static True. ]
Atribút meshLevel
meshLevel : int Private
Aktuálna úroveň grafickej podoby objektu.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 14 of 38
Atribút nextMeshLevel
nextMeshLevel : int Private
Ďalšia požadovaná úroveň objektu. Slúži na to, že ak sa už mení grafická úroveň objektu a príde ďalšia
požiadavka na zmenu, uloží sa do tohto atribútu, aby nebola prerušená už prebiehajúca zmena grafickej podoby a
vykoná sa až po jej ukončení.
[ Is static True. ]
Atribút remainingChangeTime
remainingChangeTime : float Private
Zostávajúci čas do ukončenia zmeny grafickej podoby objektu.
[ Is static True. ]
Metóda Awake
Awake () : void Public
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Update
Update () : void Public
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateMesh
UpdateMesh () : void Public
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateMeshLevel
UpdateMeshLevel (level : int ) : void Public
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 15 of 38
LinearConveyor Menný priestor: '' Rozširuje
Trieda, ktorá sa stará o pohyb pásu
Atribút oldSpeed
oldSpeed : float Private
Pamätá si pôvodnu rýchlost pásu
[ Is static True. ]
Atribút speed
speed : float Public
aktuálna rýchlost pásu, dokáže zastavit a spustit pás
[ Is static True. ]
Metóda upgradeSpeed
upgradeSpeed (s : float ) : void Public
Zmena rýchlosti pásu
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 16 of 38
PlayerScore Menný priestor: '' Rozširuje MonoBehaviour
Komponent slúži na počítanie a zaznamenávanie aktuálneho stavu hráčovho skóre a dobrých a zlých
hráčových bodov.
V hre by mala by existovať iba jedna inštancia tejto triedy. Odkaz k tejto inštancii je uložený ako statický
atribút triedy.
Atribút bad
bad : int Private
Počet zlých hráčových bodov.
Vyjadruje počet hráčových chýb, ktoré urobil pri separovaní odpadu - koľko krát hráč vložil odpadky do
nesprávneho koša.
[ Is static True. ]
Atribút badText
badText : TextMesh Private
Odkaz na text v scéne, na ktorom sa zobrazuje počet zlých hráčových bodov.
[ Is static True. ]
Atribút good
good : int Private
Počet dobrých hráčových bodov, teda koľkokrát hráč vložil odpadky do správneho koša.
[ Is static True. ]
Atribút goodText
goodText : TextMesh Private
Odkaz na text v scéne, na ktorom sa zobrazuje počet dobrých hráčových bodov.
[ Is static True. ]
Atribút instance
instance : PlayerScore Private
Statický odkaz na poslednú vzniknutú inštanciu tejto triedy. Iba táto inštancia sa používa na počítanie bodov.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 17 of 38
Atribút instance
Atribút score
score : int Private
Výška hráčovho skóre.
[ Is static True. ]
Atribút scoreText
scoreText : TextMesh Private
Odkaz na text v scéne, na ktorom sa zobrazuje hráčovo skóre.
[ Is static True. ]
Metóda Awake
Awake () : void Protected
Metóda, ktorá sa spustí po inicializácii komponentov, ešte pred spustením hry.
Priradí túto inštanciu triedy do odkazu v atribúte instance.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getBad
getBad () : int Public
Vráti počet hráčových zlých bodov.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getGood
getGood () : int Public
Vráti počet dobrých hráčových bodov.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getInstance
getInstance () : PlayerScore Public
Vráti odkaz na prvú vzniknutú inštanciu tejto triedy.
[ Is static True. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 18 of 38
Metóda getInstance
Metóda getScore
getScore () : int Public
Vráti výšku hráčovho skóre.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda incBad
incBad () : void Public
Inkrementuje počítadlo hráčových zlých bodov o 1 a aktualizuje zobrazenie počtu zlých bodov v badText.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda incGood
incGood () : void Public
Inkrementuje počítdalo hráčových dobrých bodov o 1 a aktualizuje zobrazenie počtu dobrých bodov v goodText.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda incScore
incScore () : void Public
Inkrementuje skóre o 1 bod a aktualizuje zobrazenie výšky skóre v scoreText.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Start
Start () : void Protected
Metóda, ktorá sa volá tesne po spustení hry, tesne pre prvým volaním Update.
Metóda inicializuje počítadlá hráčových bodov a skóre na 0.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 19 of 38
PlayerScorePercentual Menný priestor: '' Rozširuje MonoBehaviour
Komponent slúži na pocítanie a zaznamenávanie aktuálneho stavu hrácovho skóre a dobrých a zlých
hrácových bodov.
V hre by mala by existovat iba jedna inštancia tejto triedy. Odkaz k tejto inštancii je uložený ako statický
atribút triedy.
Atribút bad
bad : int Private
Pocet zlých hrácových bodov.
Vyjadruje pocet hrácových chýb, ktoré urobil pri separovaní odpadu - kolko krát hrác vložil odpadky do
nesprávneho koša.
[ Is static True. ]
Atribút badText
badText : TextMeshPro Private
Odkaz na text v scéne, na ktorom sa zobrazuje pocet zlých hrácových bodov.
[ Is static True. ]
Atribút environment
environment : Environment Public
[ Is static True. ]
Atribút good
good : int Private
Pocet dobrých hrácových bodov, teda kolkokrát hrác vložil odpadky do správneho koša.
[ Is static True. ]
Atribút goodText
goodText : TextMeshPro Private
Odkaz na text v scéne, na ktorom sa zobrazuje pocet dobrých hrácových bodov.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 20 of 38
Atribút instance
instance : PlayerScorePercentual Private
Statický odkaz na poslednú vzniknutú inštanciu tejto triedy. Iba táto inštancia sa používa na pocítanie bodov.
[ Is static True. ]
Atribút score
score : int Private
Výška hrácovho skóre.
[ Is static True. ]
Atribút scoreCoefficient
scoreCoefficient : int Private
o kolko chceme inkrementoat alebo dekrementovat skore
[ Is static True. ]
Atribút scoreText
scoreText : TextMeshPro Private
Odkaz na text v scéne, na ktorom sa zobrazuje hrácovo skóre.
[ Is static True. ]
Metóda Awake
Awake () : void Protected
Metóda, ktorá sa spustí po inicializácii komponentov, ešte pred spustením hry.
Priradí túto inštanciu triedy do odkazu v atribúte instance.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda DecScore
DecScore () : void Public
Dekrementuje score o koeficient a upravi environment
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 21 of 38
Metóda getBad
getBad () : int Public
Vráti pocet hrácových zlých bodov.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getGood
getGood () : int Public
Vráti pocet dobrých hrácových bodov.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getInstance
getInstance () : PlayerScorePercentual Public
Vráti odkaz na prvú vzniknutú inštanciu tejto triedy.
[ Is static True. Is abstract False. Is return array False. Is synchronized False ]
Metóda getScore
getScore () : int Public
Vráti výšku hrácovho skóre.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda incBad
incBad () : void Public
Inkrementuje pocítadlo hrácových zlých bodov o 1 a aktualizuje zobrazenie poctu zlých bodov v badText.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda incGood
incGood () : void Public
Inkrementuje pocítdalo hrácových dobrých bodov o 1 a aktualizuje zobrazenie poctu dobrých bodov v goodText.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 22 of 38
Metóda IncScore
IncScore () : void Public
Inkrementuje skóre o koeficient a. takisto upravuje aj environment.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Start
Start () : void Protected
Metóda, ktorá sa volá tesne po spustení hry, tesne pred prvým volaním Update.
Metóda inicializuje pocítadlá hrácových bodov a skóre na 0 a updatuje environment.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateScoreTable
UpdateScoreTable () : void Public
upravuje text na tabuli
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 23 of 38
QueueTrashGenerator Menný priestor: '' Rozširuje TrashGenerator
Komponent, ktorý generuje odpadky v určenom poradí podľa usporiadaného zoznamu odpadkov na
generovanie.
Atribút trashQueue
trashQueue : QueuedTrash Public
Usporiadaný zoznam odpadkov, ktoré bude generátor postupne do scény generovať.
[ Is static True. ]
Metóda CanGenerate
CanGenerate () : bool Public
Vracia príznak značiaci, či generátor môže generovať odpad.
Okrem podmienky zadefinovanej v triede TrashGenerator tiež platí, že generátor nemôže generovať pokiaľ je
trashQueue prázdny.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda GenerateTrash
GenerateTrash () : IEnumerator Protected
Metóda, v ktorej dochádza k samotnému generovaniu odpadu do scény.
Odpad je generovaný takým spôsobom, že sa z usporiadaného zoznamu trashQueue vyberie prvý objekt na
generovanie v rade (triedy QueuedTrash), vygeneruje sa do scény, vymaže sa zo zoznamu a počká sa daný čas
(zadefinovaný atribútom waitTime v triede QueueTrash). Potom sa pokračuje v generovaní ďalšieho odpadu,
ktorý je v zozname na rade.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getWaitTime
getWaitTime () : float Public
Metóda, ktorá vracia čas, ktorý generátor čaká pred vykonaním ďalšieho generovania v metóre GenerateTrash().
Tento čas je definovaný v atribúte generationDelay.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 24 of 38
RandomTrashGenerator Menný priestor: '' Rozširuje TrashGenerator
Komponent, ktorý generuje odpadky do scény náhodným výberom a inštancovaním odpadu zo zoznamu
odpadov, ktoré sú k dispozícii na generovanie.
Atribút batchSize
batchSize : int Public
Počet kusov odpadu, ktorý sa vygeneruje naraz na jedno generovanie do scény.
[ Is static True. ]
Atribút currGeneratedItems
currGeneratedItems : int Private
Počet už vygenerovaných odpadkov generátora.
[ Is static True. ]
Atribút generatableTrashList
generatableTrashList : GeneratableTrash Public
Zoznam odpadkov (triedy GeneratableTrash), z ktorého môže generátor náhodne vyberať odpadky na
generovanie.
[ Is static True. ]
Atribút generationDelay
generationDelay : float Public
Dĺžka času, ktorý generátor čaká po vygenerovaní dávky odpadkov než znova vygeneruje ďalšiu dávku
odpadkov.
[ Is static True. ]
Atribút maxDelaySpread
maxDelaySpread : float Public
Maximálna časová dĺžka náhodnej odchýlky, ktorá sa pripočítava ku generationDelay.
Konkrétna odchýlka sa náhodne určí po každej vygenerovanej dávke.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 25 of 38
Atribút maxGeneratedItems
maxGeneratedItems : int Public
Maximálny počet kusov odpadkov, ktorý môže generátor vygenerovať.
Dá sa dynamicky meniť aj počas generovania.
Hodnota menšia ako nula znamená, že nie je limit.
[ Is static True. ]
Metóda CanGenerate
CanGenerate () : bool Public
Vracia príznak značiaci, či generátor môže generovať odpad.
Okrem podmienky zadefinovanej v triede TrashGenerator tiež platí, že generátor nemôže generovať pokiaľ už
vyčerpal limit na celkový počet vygenerovateľných odpadkov zadefinovaný v maxGeneratedItems, alebo je
zoznam generovateľného odpadu generatableTrashList prázdny.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda GenerateTrash
GenerateTrash () : void Protected
Metóda, v ktorej dochádza k samotnému generovaniu odpadu do scény.
Odpad je generovaný inštancovaním náhodne vybranej položky zo zoznamu generatableTrashList. Algoritmus
výberu je zadefinovaný v metóde ChooseRandomGeneratableTrash.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getWaitTime
getWaitTime () : float Public
Metóda, ktorá vracia čas, ktorý generátor čaká pred vykonaním ďalšieho generovania v metóre GenerateTrash().
Tento čas je definovaný v atribúte generationDelay.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda ChooseRandomGeneratableTrash
ChooseRandomGeneratableTrash () : GeneratableTrash Protected
Náhodne vyberie položku zo zoznamu generatableTrashList, pričom pri výbere uvažuje preferencie generovania
jednotlivých položiek definované ako generationPreference v triede GeneratableTrash.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 26 of 38
SingletonBeltControl Menný priestor: '' Rozširuje MonoBehaviour
Táto trieda sa stará o komunikáciu medzi všetkými objektami, ktoré potrebujú byt upozornené na zmenu
pácky(pácka hore - objekty pracujú, pácka dole - nepracujú)
Atribút belts
belts : GameObject Public
Zoznam pásov, ktoré pozorujú pácku
[ Is static True. ]
Atribút beltTimer
beltTimer : GameObject Private
Objekt hodiniek, ktorý pozoruje zmenu pácky
[ Is static True. ]
Atribút conveyorSound
conveyorSound : GameObject Public
Objekt Zvuku, ktorý pozoruje pácku
[ Is static True. ]
Atribút instance
instance : SingletonBeltControl Private = null
Statická inštancia, slúži na komunikáciu medzi objektami
[ Is static True. ]
Atribút limitOut
limitOut : boolean Private
Nastavuje limit pre státie pásu
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 27 of 38
Atribút trashGenerator
trashGenerator : GameObject Private
Objekt generátora, ktorý pozoruje zmenu pácky
[ Is static True. ]
Metóda attacchTrashGenerator
attacchTrashGenerator (trashG : GameObject ) : void Public
Pripína objekt generátora ako observera
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda attachBeltTimer
attachBeltTimer (timer : GameObject ) : void Public
Pripína objekt hodiniek ako observera
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Awake
Awake () : void Protected
nastavenie statickej inštancie
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getInstanceBeltControl
getInstanceBeltControl () : SingletonBeltControl Public
vracia statickú inštanciu
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda notifyObservers
notifyObservers (speed : float ) : void Public
Upozornuje observerov na zmenu pácky
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda SetLimitOut
Software documentation 13 decembra, 2018
Page 28 of 38
Metóda SetLimitOut
SetLimitOut (lim : boolean ) : void Public
Slúži na dodržanie casového limitu na státie pásov
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 29 of 38
TemporaryObject Menný priestor: '' Rozširuje MonoBehaviour
Komponent, ktorý dáva objektu obmedzenú dĺžku života v scéne. Po uplynutí životnosti objektu sa objekt zo
scény vymazáva, či už náhle, alebo postupným miznutím.
Atribút fadeOutTime
fadeOutTime : float Public Const
Určuje, ako dlho trvá postupné miznutie objektu zo scény.
[ Is static True. ]
Atribút initialColor
initialColor : Color Private
Farba, ktorú má Renderer objektu pred začatím miznutia zo scény.
[ Is static True. ]
Atribút lifeTime
lifeTime : float Public
Dĺžka života objektu. Po naplnení sa objekt zo scény vymaže.
[ Is static True. ]
Metóda FadeOut
FadeOut () : void Public
Metóda, v ktorej sa vykonáva postupné miznutie objektu zo scény úpravou jeho priehľadnosti v Renderer
komponente.
Miznutie sa spustí len ak zostavajúca dĺžka života objektu vyjadrená atribútom lifeTime je nižšia ako časová
dĺžka postupného miznutia objektu zo scény vyjadrená atribútom fadeOutTime.
Funguje správne len ak materiál objektu nie je Opaque (nepriehľadný).
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda FixedUpdate
FixedUpdate () : void Protected
Vykoná sa aktualizácia s pevne daným časom aktualiácie.
Software documentation 13 decembra, 2018
Page 30 of 38
Metóda FixedUpdate
Aktualizuje životný cyklus objektu.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda UpdateLifecycle
UpdateLifecycle () : void Public
Aktualizuje dĺžku života odpočítaním posledného deltaTime od atribútu lifeTime.
Ak objekty naplnil svoju dĺžku života, vymaže sa zo scény.
Spúšťa aj postupné miznutie objetku zo scény.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 31 of 38
Trash Menný priestor: '' Rozširuje MonoBehaviour
Tento komponent predstavuje v hre odpad.
Odpad je hlavným prvkom hry, ktorý využívajú najmä ostatné komponenty pre realizáciu hernej logiky.
Každý odpadok je určitého typu.
Atribút trashType
trashType : TrashType Public
Odkazuje na typ odpadku.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 32 of 38
TrashBin Menný priestor: '' Rozširuje MonoBehaviour
Tento komponent predstavuje v hre odpadkový kôš, do ktorého sa zbiera odpad.
Každý kôš má označený typ odpadu, ktorý sa do daného koša separuje. Kôš na základe toho vyhodnocuje, či
objekty odpadu, ktoré sú do neho vkladané, do neho aj patria a podľa toho upravuje hráčovo skóre.
Atribút score
score : PlayerScore Private
Odkaz na počítadlo hráčovho skóre.
[ Is static True. ]
Atribút trashType
trashType : TrashType Public
Odkaz na typ odpadkov, ktorý sa zbiera do určitého koša.
[ Is static True. ]
Metóda OnTriggerEnter
OnTriggerEnter (col : Collider ) : void Private
Volá sa pri vstupe komponentu triedy Collider do priestoru spínača triedy Collider tohto komponentu.
V metóde dôjde k rozpoznaniu, či vstupujúci objekt je aj odpadkom, čiže má komponent triedy Trash a ak áno,
tak sa následne porovná, či typ (vyjadrený skrz odkaz na inštanciu triedy TrashType) daného odpadu odpovedá
typu odpadu, ktorý sa zbiera v tomto koši. Na základe toho sa pridelí hráčovi v komponente PlayerScore dobrý,
alebo zlý bod.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 33 of 38
TrashBinPercentual Menný priestor: '' Rozširuje
Tento komponent predstavuje v hre odpadkový kôš, do ktorého sa zbiera odpad.
Každý kôš má oznacený typ odpadu, ktorý sa do daného koša separuje. Kôš na základe toho vyhodnocuje, ci
objekty odpadu, ktoré sú do neho vkladané, do neho aj patria a podla toho upravuje hrácovo skóre a
percentami vyjadruje ako dobre na tom hrác je.
Atribút score
score : PlayerScorePercentual Private
Odkaz na pocítadlo hrácovho skóre, kde sa rátajú aj percentá "úspechu".
[ Is static True. ]
Atribút trashType
trashType : TrashType Public
Odkaz na typ odpadkov, ktorý sa zbiera do urcitého koša.
[ Is static True. ]
Metóda OnTriggerEnter
OnTriggerEnter (col : Collider ) : void Private
Volá sa pri vstupe komponentu triedy Collider do priestoru spínaca triedy Collider tohto komponentu.
V metóde dôjde k rozpoznaniu, ci vstupujúci objekt je aj odpadkom, ciže má komponent triedy Trash a ak áno,
tak sa následne porovná, ci typ (vyjadrený skrz odkaz na inštanciu triedy TrashType) daného odpadu odpovedá
typu odpadu, ktorý sa zbiera v tomto koši. Na základe toho sa pridelí hrácovi v komponente PlayerScore dobrý,
alebo zlý bod a upravia sa percentá úspešnosti. Nakoniec sa updatuje skore na tabuli.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 34 of 38
TrashDestructor Menný priestor: '' Rozširuje MonoBehaviour
Komponent slúži na vymazávanie odpadkov zo scény. Vymazávanie sa spúšťa pri kontakte odpadku so
spínačom tohto komponentu.
Atribút destructionDelay
destructionDelay : float Public
Oneskorenie, s akým deštruktor vymazáva objekty zo scény potom, čo aktivujú jeho spínač.
[ Is static True. ]
Atribút objectsFadeOut
objectsFadeOut : boolean Public
Príznak, ktorý určuje, či
objekty zmiznú zo scény náhle, alebo postupným spriehľadňovaním.
[ Is static True. ]
Metóda MakeObjectFadeOut
MakeObjectFadeOut (col : Collider ) : void Private
Spúšťa postupné miznutie objektu s daným Collider komponentom zo scény tak, že nastaví lifeTime komponentu
TemporaryObject toho objektu na dĺžku destructionDelay.
Ak objekt s Collider komponentom, nemá komponent TemporaryObject, tento komponent sa pridá tomuto
objektu.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda OnTriggerEnter
OnTriggerEnter (col : Collider ) : void Protected
Volá sa pri vstupe komponentu triedy Collider do priestoru spínača triedy Collider tohto komponentu.
Ak je príznak objectsFadeOut nastavený ako pravdivý, spustí sa postupné miznutie kolidovaného objektu. Ak nie,
zavolá sa funkcia na deštrukciu kolidovaného objektu so scény s oneskorením, ktoré má deštruktor zadefinované.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 35 of 38
TrashGenerator Menný priestor: '' Rozširuje MonoBehaviour
Abstraktná trieda, ktorá predstavuje generátor slúžiaci na vytváranie odpadu do scény.
Atribút stop
stop : boolean Public
Označuje, či je generátor momentálne zastavený.
Skrz tento atribút sa dá priamo generátor zastaviť. Ak je hodnota premennej pravdivá, generátor nebude
generovať odpad.
[ Is static True. ]
Metóda CanGenerate
CanGenerate () : bool Public
Vracia príznak značiaci, či generátor môže generovať odpad.
Generátor nemôže generovať odpad, pokiaľ je atribút stop nastavený ako pravdivý.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda GenerateTrash
GenerateTrash () : void Protected
Metóda, v ktorej dochádza k samotnému generovaniu odpadu do scény.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda getWaitTime
getWaitTime () : float Public
Abstraktná metóda, ktorá by mala vraciať čas, ktorý generátor čaká pred vykonaním ďalšieho generovania v
metórde GenerateTrash().
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda Start
Start () : void Protected
Software documentation 13 decembra, 2018
Page 36 of 38
Metóda Start
Metóda, ktorá sa volá tesne po spustení hry, tesne pre prvým volaním Update.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda StartTrashGeneration
StartTrashGeneration () : void Public
Metóda začne v pravidelných intervaloch spúšťať generovanie odpadu v metóde GenerateTrash().
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Metóda StopTrashGeneration
StopTrashGeneration () : void Public
Metóda, ktorá zastaví pravidelné spúšťanie generovania odpadu.
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]
Software documentation 13 decembra, 2018
Page 37 of 38
TrashType Menný priestor: '' Rozširuje MonoBehaviour
Komponent označuje najmä materiál, z ktorého je určitý odpad vyrobený.
Atribút trashName
trashName : string Public
Názov, ktorým sa označuje určitý typ odpadku.
[ Is static True. ]
Software documentation 13 decembra, 2018
Page 38 of 38
ClockInterface Menný priestor: '' Rozširuje
Interface, ktorý definuje metódu aby sa zobrazovali "animacie" na hodinkach
Metóda SetClockState
SetClockState (dt : float ) : void Public
sa stará o ukazovanie casu na hodinkách(presúvanie rucicky/prehadzovanie digitalnych cisiel)
[ Is static False. Is abstract False. Is return array False. Is synchronized False ]