• Rezultati Niso Bili Najdeni

Pojasnilo razredov in objektov

Ključni del kode je razred "Person" in njegova vsebina. Razred vsebuje tri atribute – ti hranijo ime, spol in starost osebe. Razred vsebuje tudi konstruktor, ki ga najdemo v vrstici

"public Person(string name, string gender, int age)". Konstruktorji omogočijo stvaritev novih objektov s točno določenimi vrednostmi atributov. Na dnu razreda "Person" najdemo še primer metode – vrstica "public void Introduce()". Metode razredov predstavljajo tisto, kar bodo objekti zmožni izvesti (npr. v danem primeru se oseba predstavi).

Nov takšen objekt ustvarimo z deklaracijo novega objekta podatkovnega tipa "Person". Za primer vzemimo naslednji primer kode – "Person new_person = new Person("Tom", "male", 20);". V danem primeru deklariramo objekt podatkovnega tipa "Person" imenovan "new_person". Na desni strani enačaja je zapisano, da bo objekt "new_person" kazal na novi objekt podatkovnega tipa

"Person", atributi pa bodo prevzeli vrednosti parametrov iz oklepajev.

Ko se dana koda izvede, se nemudoma pokliče konstruktor razreda, ta pa deklarira novo osebo z vrednostmi atributov. Če bi poklicali metodo "new_person.Introduce();", bi dobili odgovor "Tom is a 20 year old male".

36

V razvojnem okolju Unity se v ozadju vršijo podobni procesi. Grafični vmesnik razvojnega okolja nam zgolj olajša stvaritev novih objektov in vpogled v njihove atribute, v ozadju pa se še vedno vrši objektno orientirana programska koda..

Če ustvarimo enostaven objekt, npr. kocko, se v grafičnem vmesniku prikaže nov objekt s točno določenimi začetnimi komponentami. Kocka se je ustvarila po predlogi nekega razreda, konstruktor razreda pa ji dodeli osnovne atribute in vrednosti atributov. To so npr. ime, plast in

"Transform". Takoj lahko opazimo, da je "Transform" tudi objekt, njegov konstruktor pa mu priredi začetne vrednosti atributov "X", "Y" in "Z".

Torej, objekt se ustvari po predlogi razreda, začetne vrednosti mu priredi konstruktor oz. druga alternativna koda. Atributi objektov so lahko tudi objekti (kot npr. "Transform"). Vsi objekti imajo lahko definirane tudi svoje metode (ali pa še kaj naprednejšega). Grafični vmesnik razvojnega okolja Unity nam omogoča enostavno dodajanje novih objektov ali njihovih atributov (komponent), vse to pa je izvedljivo tudi preko skript.

5.2 Razred Physics

Hrani globalne lastnosti fizike in različne pripadajoče metode. Razred "Physics" se pogosto uporablja v kombinaciji s podatkovnim tipom RaycastHit.

5.2.1 Metoda Physics.Raycast(…)

Metoda "Raycast(Vector3 origin, Vector 3 direction, out RaycastHit hitInfo, float maxDistance, intLayerMask)" se uporablja, kadar želimo ustvariti vektor, ki izhaja iz izhodišča (origin) v smer (direction), poteka pa do razdalje določene z vrednostjo parametra "maxDistance". Če se na svoji poti dotakne kakšnega collider, to zapiše v spremenljivko "hitInfo", vrne pa logični "true". Pomen oznake "out" ter "LayerMask" sta podrobneje razložena pri naslednji metodi – "Linecsat".

5.2.2 Metoda Physics.Linecast(…)

Metoda "Linecast(Vector3 start, Vector3 end, out RaycastHit hitInfo, int layerMask)" se uporablja takrat, ko želimo ustvariti vektor, ki se razpenja od začetne (start) do končne točke (end). Obe sta v prostoru predstavljeni kot vektorja. Če vektor na svoji poti zadane v trkalnik, bo podatke o presečišču shranil v atribut "hitInfo", hkrati pa vrnil logični "true". Oznaka "out" pred "RaycastHit hitInfo" pomeni, da modificiramo izvorno lokacijo, na katero kaže spremenljivka. To pomeni, da se informacije o trku ne bodo zapisale v privatni atribut tega objekta, temveč v predhodno

37

definirano spremenljivko "hitInfo". Na koncu lahko dodamo še številko, ki definira, katere plasti bo "raycast" na svoji poti zaznal. Če se trkalnik nahaja na izbrani plasti, bo "raycast" takšen trk zabeležil.

5.2.3 Podatkovni tip RaycastHit

Podatkovni tip "RaycastHit" je struktura. Strukture so podobne razredom, zaradi razlik hranjenja v pomnilniku pa je dostop do njih učinkovitejši. Struktura "RaycastHit" se uporablja za shranjevanje podatkov, ki jih vračajo metode, kot sta "Raycast" in "Linecast" (opisani v točkah 5.2.1 in 5.2.2).

Da se podatki o trku shranijo v predhodno definirano metodo, v parametre metod dopišemo "out", ki definira izhodne podatke. Podatkovni tip "RaycastHit" hrani mnogo različnih spremenljivk, kot so collider (kateri trkalnik smo zadeli), distance (kakšna je razdalja od izvornega vektorja do presečišča), transform (transform objekta, ki ga je vektor sekal), itd.

5.2.4 Metoda Physics.CheckCapsule(…)

Metoda "CheckCapsule(Vector3 start, Vector3 end, float radius, int layerMask)" deluje podobno kot metoda ".Linecast(…)". Za razliko od prejšnje, ".CheckCapsule(…)" tvori kapsulo od začetnega do končnega vektorja, vrne pa logično vrednost "true", kadar kapsula seka nek drugi collider. Metoda ne hrani podatkov o presečiščih kapsule in drugega colliderja (ne sprejme "out"

"RaycastHit"). Metoda zahteva tudi radij kapsule (radius), ki jo bo ustvarila. Podatek o radiju je podatkovnega tipa float. Možna je tudi določitev plasti ("layerMask"), ki jih bo metoda upoštevala ob preverjanju presekov kapsule in drugih colliders. Metoda je zelo uporabna, kadar preverjamo, ali se objekt dotika neke druge površine (npr. ali glavni lik stoji na tleh).

5.3 Razred Time

Razred "Time" deluje kot vmesnik, ki od okolja Unity pridobi podatke povezane s časom.

5.3.1 Metoda Time.deltaTime

Metoda vrne časovno razliko med prejšnjim in novim okvirjem (frame). Zelo je koristna pri izničevanju razlik med številom izrisanih okvirjev na sekundo (FPS). Za primer vzemimo kapsulo, ki ji ob pritisku tipke W povečamo vrednost komponente "transform.position" za "(1f, 0, 0)", torej vrednost "X" povečamo za "1f". Če igro poganjamo pri 300 FPS, se bo v eni sekundi vrednost "X"

povečala za "300f", pri 30 FPS pa le za "30f". To pomeni, da se bo dani objekt na šibkejših napravah premikal mnogo počasneje kot na zmogljivejših napravah. Če vrednost komponente

"transform.position" povečamo za "(1f * Time.deltaTime, 0, 0)", se bo prišteta vrednost ob vsakem okvirju pomnožila s časom, ki je minil med prejšnjim in trenutnim okvirjem. To pomeni, da bo

38

vrednost "Time.deltaTime" pri veliko FPS mnogo manjša kot pri malo FPS. To posledično izenači razliko med številom okvirjev in vrednostjo, ki jo prištejemo poziciji.

5.4 Razred Transform

Razred "Transform" hrani vrednosti pozicije, rotacije in merila objekta vrste transform. Vrednosti transform-a najlažje vidimo v okolju Unity v oknu Inspector. Če ustvarimo nov objekt, mu okolje samo priredi objekt transform. V tem primeru je objekt transform obravnavan kot komponenta novega objekta. Po stvaritvi so transformu prirejeni ničelni vektor za pozicijo in rotacijo ter enotski vektor za merilo. Vrednosti transforma so določene na nivoju starša – rotacija (0,0,0) otroka nekega objekta pomeni, da bo otrok obrnjen v isto smer kot njegov starš, ne pa v smer (0,0,0) v globalnih rotacijskih vrednostih.

5.4.1 Metoda transform.localPosition

Metoda vrne razredno spremenljivko pozicije tipa Vector3. Vrednosti vektorja so relativne glede na transform starša. Če ustvarimo prazen objekt in mu kot otroka dodamo objekt kamero, lahko z dano metodo pridobimo lokalne vrednosti pozicije kamere.

5.4.2 Metoda transform.localPosition.normalized

Metoda vrne enotski vektor lokalne pozicije. Vektor ima vrednosti 1 le na dimenzijah, ki so ne-ničelne. Za primer vzemimo vektor lokalne pozicije Vector3(0,0,15). Če pokličemo metodo

".normalized", nam ta vrne Vector3(0,0,1).

5.4.3 Metoda transform.localPosition.magnitude

Metoda vrne dolžino vektorja lokalne pozicije.

5.4.4 Metoda transform.parent

Metoda omogoča otroku nekega objekta, da dostopa do transform komponente starša.

5.4.5 Metoda transform.parent.position

Metoda vrne vektor globalnih koordinat starša.

39

5.4.6 Metoda .parent.localPosition

Metoda vrne vektor lokalnih koordinat starša (uporabno, kadar je starš tudi otrok nekega drugega objekta).

5.4.7 Metoda .parent.TransformPoint(…)

Metoda pridobi referenco do transform komponente starša in vrednosti vstavljenega vektorja.

Vektorju starša prišteje vstavljeni vektor in nato novi vektor pretvori v globalne koordinate.

5.5 Razred Input

Razred "Input" se uporablja za komunikacijo z vmesnikom vhodnih naprav. Objekt vrste "Input"

ima deklarirane različne metode, kot so GetAxis, GetButton, GetButtonUp, GetKey itd. Več podrobnosti je na voljo v uradni Unity dokumentaciji.

5.5.1 Metoda Input.GetAxis(…)

Metoda "Input.GetAxis(string axisName)" zahteva niz z imenom virtualne osi, vrne pa decimalno vrednost med -1 in 1, ki je odvisna od smeri in dolžine pritiska. Imena virtualnih osi in senzorje, ki so vezani na dana imena, najdemo v nastavitvah projekta (Edit/ Project Settings…/ Input Manager).

5.5.2 Metoda Input.GetButton(…)

Metoda "Input.GetButton(string buttonName)" zahteva niz z imenom virtualne osi, vrne pa logično vrednost "true", če je trenutna vrednost virtualne osi različna od 0.

5.5.3 Metoda Input.GetKey(…)

Metoda "Input.GetKey(KeyCode key)" zahteva kodo senzorja vhodne naprave, deluje pa podobno kot GetButton. Kode senzorjev vhodnih naprav (tipk, laserskega senzorja, …) so deklarirane v razredu "KeyCode", v MS Visual Studio pa nam po vpisu "KeyCode." vmesnik sam predlaga možne nize z vrednostmi kod. Primeri nizov so: Space, LeftControll, W, S. Če vpišemo "KeyCode"

in F12 se nam odpre dokument z definicijami, v katerem lahko najdemo vse podrobnosti razreda

"KeyCode" (tudi številske kode).

5.5.4 Metoda Input.GetKeyDown(…)

Metodi "Input.GetKeyDown(KeyCode key)" ter ".GetKeyUp(…)" zahtevata enak vnos kot

".GetKey(…)", vrneta pa vrednost "true" v okviru (frame), ko smo senzor z dano kodo pritisnili

40

oz. spustili. Tako lahko zaznamo trenutek, ko je bila tipka pritisnjena oz. spuščena. Podobno lahko uporabimo ".GetButtonDown(…)" oz. ".GetButtonUp(…)", če nas zanimajo virtualne osi.

5.6 Razred Mathf

Razred "Mathf" vsebuje zbirko popularnih matematičnih funkcij, kot so koren, absolutna vrednost, maksimalna/minimalna vrednost in druge.

5.6.1 Metoda Mathf.Clamp()

Metoda "Mathf.Clamp(float value, float min, float max)" zahteva vnos vrednosti "value", to pa omejimo z zgornjo in spodnjo mejo "min" in "max". Tako vrednost "value" kot tudi "min" in "ma"x morajo biti podatkovnega tipa za decimalna števila (float). Metoda je uporabna npr. pri omejevanju pogleda kamere navzgor in/ali navzdol.

5.7 Razred Vector3

Razred (včasih opisan tudi kot struktura) "Vector3" predstavlja vektor dimenzije 3. Vektor hrani spremenljivke "X", "Y" in "Z" podatkovnega tipa za decimalna števila (float). "Vector3" vsebuje različne metode, ki jih lahko izvedemo na spremenljivki tipa "Vector3".

5.7.1 Vector3.Lerp(…)

Klic metode "Lerp(Vector3 a, Vector3 b, float t)" linearno interpolira dani vektor od vrednosti vektorja a do vrednosti vektorja b, s hitrostjo t. Za pojasnitev linearne interpolacije vzemimo člena a1 in an, katerih vrednosti so nam znane. Vrednosti vmesnih členov ne poznamo, želimo pa jih določiti tako, da dobimo aritmetično zaporedje. Postopek iskanja vrednosti vmesnih čelov imenujemo linearna interpolacija. To je pomembno, kadar želimo objekt linearno premakniti od točke a do točke b.

5.7.2 Vector3.Slerp()

Podobno kot metoda Lerp, le da se izvede sferična interpolacija vektorja. Uporabno pri rotaciji vektorja.

41

5.8 Razred Quaternion

V matematiki je kvaternion predstavljen z naslednjim izrazom, 𝑞 = 𝑎 + 𝑏𝑖 + 𝑐𝑗 + 𝑑𝑘

kjer a, b, c in d predstavljajo realna števila, i, j in k pa so lahko interpretirani kot enotski vektorji.

Torej, kvaternion je sestavljen iz treh veličin i, j in k ter skalarnega dela a. Za kvaternione veljajo točno določena matematična pravila, o katerih si lahko več preberemo na spletni strani L. Kosa (Kos, 1998). V svetu računalniških iger kvaternioni igrajo zelo pomembno vlogo, saj predstavljajo učinkovit in priročen način za predstavitev rotacij v 3D prostoru (Unity User Manual 2020.3, 2020).

5.8.1 Metoda Quaternion.eulerAngles(…)

Metoda "eulerAngles(x,y,z)" ali tudi "eulerAngles(Vector3)" sprejme vrednosti komponent "x",

"y" in "z". Lahko tudi cel rotacijski vektor. Metoda vrne ali pa nastavi vrednosti rotacije objektov v Eulerjevih kotih. Ti predstavljajo rotacije okoli posamičnih koordinatnih osi - x, y in z. Ker takšna predstavitev rotacije v 3D prostoru privede do določenih težav (Gimbal lock), se metoda izvaja tako, da so Eulerjevi koti zgolj vmesni korak, preden se vse skupaj pretvori nazaj v kvaternion.

Dano metodo si lahko predstavljamo kot nekakšen uporabniški vmesnik – ta sprejema in vrača Eulerjeve kote, s katerimi nepoznavalci kvaternionov enostavneje računajo, v ozadju pa se še vedno vse pretvori nazaj v kvaternione in v tem formatu računa dalje.

42

6 Zaključek

V svojem diplomskem delu sem se poglobil v različna gradiva (Backlund in Hendrix, 2013, Harrington, 2012, Prensky, 2001a, 2001b, Sharp, 2001, Zaharias idr. 2017, Zapušek in Rugelj, 2014), ki se osredotočajo na smiselnost in možnosti uporabe videoiger v izobraževanju ter na primerjavo učinkovitosti 3D in 2D izobraževalnih iger. Osrednji del diplomskega dela je obsegal pripravo skript za napredno animirano premikanje računalniškega lika ter manipulacijo kamere v 3D računalniškem prostoru. Primere sem pripravil samostojno v programu za ustvarjanje računalniških iger imenovanem Unity.

Med pregledom gradiv sem prišel do jasnega zaključka, da je uporaba videoiger v izobraževalne namene nedvomno smiselna in po svetu že pogosto v uporabi (npr. za urjenje pilotov, vojakov in zdravnikov ter v šolstvu). Pri raziskovanju primerjave učinkovitosti 3D in 2D videoiger nisem prišel do jasnih zaključkov. Tovrstnih raziskav je malo, iz rezultatov pa lahko povzamemo, da je pri odločitvi za dva ali tri dimenzije zelo pomembna vrsta snovi in tip skritih nalog, ki jih bomo v igri uporabili. Dvodimenzionalne igre naj bi igralca nekoliko lažje usmerjale k cilju, tridimenzionalne igre pa omogočajo večjo mero svobode pri smeri premikanja, opazovanju okolice in raziskovanju virtualnega sveta.

Pomemben zaključek, do katerega sem prišel ob pregledu gradiv, je, da ima kakovostno izdelan nadzor glavnega lika veliko vlogo. Igranje igre mora biti izvedeno intuitivno in igralcu prijazno. V nasprotnem primeru igranje predstavlja frustracijo, igralec posledično predčasno izgubi interes za igranje in učenje ter obupa pri igranju.

Programiranja predstavljenih primerov sem se kljub predhodnim projektom lotil od začetka in povsem samostojno. Moj cilj je bil dobro raziskati področje nadzora glavnega lika v tretji osebi ter področje manipulacije kamere v 3D prostoru. Ker sem želel razumeti vsako napisano vrstico kode, sem si večinoma pomagal le s študijem Unity dokumentacije in se izogibal ostalim spletnim vodičem. Projekt mi je vzel veliko časa in energije, sem pa ob tem razširil svoje razumevanje okolja Unity in jezika C# ter pridobil ogromno novega uporabnega znanja.

Diplomsko delo bo prišlo prav vsem, ki se želijo spopasti z izdelavo 3D računalniških iger v okolju Unity, saj jim bo lahko služilo kot dobra osnova pri razvoju iger.

43

7 Viri in literatura

Abram, B. (2019), Predstavitev naprednejših funkcionalnosti za izdelavo izobraževalnih iger v programu Unity [Diplomsko delo, Univerza v Ljubljani, Pedagoška fakulteta]. PeFprints.

http://pefprints.pef.uni-lj.si/5859/1/Diplomskodelo_BlazAbram.pdf

Backlund, P. in Hendrix M. (2013), Educational games - Are they worth the effort? A literature survey of the effectiveness of serious games. 2013 5th International Conference on Games and Virtual Worlds for Serious Applications (VS-GAMES), (5), 1-8. https://doi.org/10.1109/VS-GAMES.2013.6624226 https://sci-hub.do/10.1109%2FVS-GAMES.2013.6624226 Brglez, D. (2017), Programiranje izobražvalnih iger v programu Unity [Diplomsko delo, Univerza v Ljubljani, Pedagoška fakulteta]. PeFprints.

http://pefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf

Dobravec, T. (b.d.), (--K)ava (delovna verzija zapiskov). http://lalg.fri.uni-lj.si/P2/kava/kavach6.html

Harrington, M.C.R (2012). The Virtual Trillium Trail and the empirical effects of Freedom and Fidelity on discovery-based learning. Virtual Reality 16, 105–120.

https://doi.org/10.1007/s10055-011-0189-7 Kos, L. (1998), Definicija kvaterniona.

http://www.casprod.eu/documents/vaje/uvodne/naloge97/node57.html#SECTION000528010000 000000000

MarketWatch (2019), Unity Software IPO: 5 things to know about the videogame-engine company. https://www.marketwatch.com/story/unity-software-ipo-5-things-to-know-about-the-videogame-engine-company-11599838918

Newzoo (2018), October 2018 Quarterly Update Global Games Market Report.

https://web.archive.org/web/20190509014637/https://newzoo.com/key-numbers/

Prensky, M. (2001a). Chapter 1 The Digital Game-Based Learning Revolution. St. Paul, MN:

Paragon House Publishers. http://www.marcprensky.com/writing/Prensky%20-%20Ch1-Digital%20Game-Based%20Learning.pdf

Prensky, M. (2001b). Chapter 2 The Digital Game-Based Learning Revolution. St. Paul, MN:

Paragon House Publishers. http://www.marcprensky.com/writing/Prensky%20-%20Ch2-Digital%20Game-Based%20Learning.pdf

Sharp, L.A. (2012). Stealth Learning: Unexpected Learning Opportunities Through Games, Journal of Instructional Research, 1. 42-48. https://files.eric.ed.gov/fulltext/EJ1127609.pdf Statista (2019), What game engines do you currently use?.

https://www.statista.com/statistics/321059/game-engines-used-by-video-game-developers-uk/

44

Statista (2021). Value of the global videogames market from 2021 to 2021.

https://www.statista.com/statistics/246888/value-of-the-global-video-game-market/

Unity (23.4.2021). Basic motions FREE. unityAssetStore.

https://assetstore.unity.com/packages/3d/animations/basic-motions-free-pack-154271 Unity game engine (2020). https://en.wikipedia.org/wiki/Unity_(game_engine) Unity Technologies (2020). https://en.wikipedia.org/wiki/Unity_Technologies Unity User Manual 2020.3 (2020). https://docs.unity3d.com/Manual/index.html

Zaharias, P., Chatzeparaskevaidou, I. in Karaoli, F. (2017). Learning Geography Through Serious Games. International Journal of Gaming and Computer-Mediated Simulations, 9(1), 28–44.

https://doi.org/10.4018/ijgcms.2017010102

Zapušek, M. in Rugelj, J. (2014). Achieving teacher's competences in the serious game design process. Academic Conferences and Publishing International Limited. 8(2), 662-665

http://pefprints.pef.uni-lj.si/2540/