• Rezultati Niso Bili Najdeni

PREDSTAVITEV NAPREDNEJŠIH FUNKCIONALNOSTI ZA IZDELAVO IZOBRAŽEVALNIH IGER V PROGRAMU UNITY

N/A
N/A
Protected

Academic year: 2022

Share "PREDSTAVITEV NAPREDNEJŠIH FUNKCIONALNOSTI ZA IZDELAVO IZOBRAŽEVALNIH IGER V PROGRAMU UNITY "

Copied!
58
0
0

Celotno besedilo

(1)

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA

BLAŽ ABRAM

PREDSTAVITEV NAPREDNEJŠIH FUNKCIONALNOSTI ZA IZDELAVO IZOBRAŽEVALNIH IGER V PROGRAMU UNITY

DIPLOMSKO DELO

LJUBLJANA, 2019

(2)
(3)

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA

DVOPREDMETNI UČITELJ

BLAŽ ABRAM

Mentor: dr. JOŽE RUGELJ Somentor: asist. MATEJ ZAPUŠEK

PREDSTAVITEV NAPREDNEJŠIH FUNKCIONALNOSTI ZA IZDELAVO IZOBRAŽEVALNIH IGER V PROGRAMU UNITY

DIPLOMSKO DELO

LJUBLJANA, 2019

(4)
(5)

Najprej bi se zahvalil svojemu mentorju, profesorju dr. Jožetu Ruglju, za mentorstvo ter asistentu Mateju Zapušku za vso strokovno pomoč, podporo, vse nasvete in spodbudo pri pisanju diplomskega dela.

Prav tako se zahvaljujem tudi vsem, ki so kakorkoli pripomogli k mojim dosežkom ter mi pomagali na moji poti.

Posebej bi se želel zahvaliti svojim staršem in bratu, ki so mi stali ob strani skozi vsa leta študija ter me pri tem podpirali in verjeli vame.

Zahvalil bi se tudi svojemu dekletu Anji za vso pomoč, podporo ter motivacijo pri študiju in pisanju diplomskega dela.

(6)
(7)

POVZETEK

Raziskave (Prensky, 2001; Gee, 2003; Backlund in Hendrix, 2013) so pokazale, da izobraževalne igre pripomorejo k boljši motivaciji, omogočajo ustvarjanje okolij po načelih konstruktivistične teorije učenja ter opazovanje konceptov iz različnih zornih kotov, poleg tega pa učenci snov, ki je podana s pomočjo izobraževalnih iger, bolje razumejo ter si jo lažje in hitreje zapomnijo.

Na Pedagoški fakulteti, na programu dvopredmetni učitelj, smer matematika-računalništvo, izvajalci uporabljajo pristop učenja s pomočjo snovanja računalniških izobraževalnih iger (angl. GDBL oziroma Game design based learning) z namenom, da bi študenti pridobili kompetence, ki jih bodo kot bodoči učitelji potrebovali za izdelavo kakovostnih učnih gradiv.

Cilj je, da se naučijo zasnovati in izdelati IKT gradiva (izobraževalne igre), pridobivati izkušnje z delom v skupini, reševati probleme s pomočjo digitalnih tehnologij ter ustvarjena gradiva tudi kritično ovrednotiti in analizirati. Igra, ki jo študenti zasnujejo in razvijejo v okviru predmeta, je sicer uporabna v pedagoškem procesu, vendar ni njegov glavni cilj (Zapušek in Rugelj, 2014).

Za izdelavo izobraževalnih iger so na fakulteti sprva uporabljali program eAdventure, ki je sicer enostaven za uporabo, vendar pa ima zelo omejen nabor funkcionalnosti, ki so prilagojene za ustvarjanje iger iz žanra - pustolovščine, zato z njim drugih iger ni mogoče programirati. Orodje je zaradi svojih pomanjkljivosti študente vedno bolj omejevalo pri delu, zato so se izvajalci odločili, da ga nadomestijo s programom Unity. To programsko okolje ponuja širok nabor funkcionalnosti, v njem pa je možno izdelati igro poljubnega žanra in jo z manjšimi prilagoditvami izvoziti na poljubno napravo (npr. mobilne telefone, tablice, konzole) oziroma operacijski sistem (Windows, Mac ali Linux). Slaba stran orodja je njegova relativno velika kompleksnost, ki zahteva veliko časa za učenje, kar je imelo za posledico, da so študenti veliko časa porabili za programiranje, kar pa ni bil osnovni namen predmeta. V diplomskem delu sem zato preučeval možnosti, ki bi študentom olajšale programiranje, da bi se lahko bolje osredotočili na didaktične vidike snovanja izobraževalnih iger.

Da ne bi porabili preveč časa za iskanje virov ter učenje o tem, kako program deluje, sem pregledal in preučil veliko virov in vodičev ter iz njih poskušal povzeti najbolj bistvene, razumljive in enostavne pristope pri programiranju, ki so koristni pri izdelavi skoraj vsake izobraževalne igre, kot npr.: premikanje igralca in kamere, števec točk, prikaz besedila, delo s trkalniki, reference do komponent objekta oziroma drugih objektov, nahrbtnik igralca idr.

V primerjavi z diplomskim delom (Brglez, 2017), v katerem so opisane predvsem osnove programa Unity, se v svojem delu osredotočam na naprednejše funkcionalnosti programiranja iger v 2D načinu, prav tako pa obravnavam pristope, ki so namenjeni programiranju iger v 3D.

(8)

V diplomskem delu predpostavljam, da ima bralec osnove programerskega znanja, a je na področju izdelovanja izobraževalnih iger v programu Unity začetnik. Nivo pisanja oziroma uporaba strokovnega jezika v delu je prilagojena študentom univerzitetnih pedagoških programov in zainteresiranim učiteljem.

Ključne besede: Unity, izobraževalne igre, Game design based learning (GDBL), izdelava izobraževalnih iger

(9)

ABSTRACT

Studies (Prensky, 2001; Gee, 2003; Backlund & Hendrix, 2013) have shown that educational games help to get better motivation, enable to create an environment according to standards of constructive theory in studying and observing the concepts from different viewing angels and furthermore the students understand more and remember the subject that is shown faster with the help of educational games.

On Faculty of Education, program the two-subject teacher (Mathematics - Computer science), the developers approach studying with the help of devising computer-educational games with the purpose of students acquiring competences which they will need as future teachers for creating quality study material. The goal is that they learn to devise and design ICT material (educational games), to gain experience with working in a group, to solve problems with the help of digital technology and also to critically evaluate designed material and analyse it. The game that students devise and develop within the subject course is usable in the educational process however it is not its main goal (Zapušek & Rugelj, 2014).

To develop the educational games, they first used the program eAdventure on the faculty, which is actually easy to use but it has a very limited collection of functionality that are adjusted to developing games from the genre – adventures, which is why it isn’t possible to program other games. The tool because of its shortcomings restricted the students more and more, so the developers decided to substitute it with the program Unity. This program environment offers a wide collection of functionality, there is a possibility of creating a game of optional genre and with minor adjustments to import it to a wanted device (i.e. mobile phones, tablets, consoles) or operation system (Windows, Mac or Linux). The bad side of the tool is its relatively big complexity which requires a lot of time for studying which had a consequence that students spent a lot of time on programming and that wasn’t the main purpose of the subject. In my thesis I therefore studied the possibilities that would make programming easier for the students so they could focus more on didactical views of developing educational games.

So to not use too much time on searching for sources and studying about how the program works I checked and studied a lot of sources and guidelines and tried to summarize the most basic ones, understandable and easy approaches to programming that are beneficial when developing almost every educational game, for example: moving the player and camera, the counter of points, the display of the text, working with colliders, references to components of the object or other objects, the backpack of the player and so on.

In comparison with the thesis (Brglez, 2017) in which the basics of the program Unity are described, in my thesis I am focusing on advanced functionality of programming the games in 2D mode and I also deal with approaches that are meant to programme the game in 3D mode.

(10)

In my thesis I presume that a reader knows the basics of programming but is a beginner at developing the educational games in the program Unity. The level of writing or the use of technical language in the thesis is adjusted to students of university educational programs and teachers that are interested.

Key words: Unity, educational games, Game design based learning, development of educational games

(11)

Kazalo

1. (Okolje) Unity ... 1

1.1. O programu ... 1

1.2. Visual Studio ... 1

1.3. Programski jeziki ... 1

2. Unity projekt ... 1

2.1. Okna ... 2

2.1.1. Postavitev oken ... 2

2.1.2. Okno Project ... 3

2.1.3. Okno Hierarchy ... 4

2.1.4. Okno Scene ... 5

2.1.5. Okno Game ... 5

2.1.6. Okno Inspector ... 6

2.1.7. Okno Console... 6

2.2. Dodajanje objektov in upravljanje z njimi ... 7

2.2.1. GameObject ... 7

2.2.2. Dodajanje objektov ... 7

2.2.3. Upravljanje z objekti ... 7

2.3. Bližnjice ... 7

2.4. Skripte ... 8

2.4.1. Referenca na komponento ... 9

2.4.2. Referenca na drug(e) objekt(e) ... 10

2.4.3. Referenca do komponent drugega objekta... 10

2.4.4. Povezava med skriptami ... 10

2.5. Premikanje ... 10

2.5.1. Premikanje 2D ... 10

2.5.2. Premikanje 3D ... 14

2.6. Animacije ... 15

2.6.1. Animator ... 17

2.7. Trkalniki ... 19

2.7.1. 2D trkalniki ... 20

2.7.2. 3D trkalniki ... 21

2.8. UI ... 22

(12)

2.8.1. Števec ... 23

2.8.2. Prikaz besedila ob kliku ... 24

2.9. Menuji (izdelava) ... 26

2.9.1. Start Menu ... 26

2.9.2. Pause Menu ... 28

2.10. Inventory/shramba ... 31

3. Unity Asset Store ... 33

3.1. Primeri ... 34

4. Končni izdelek – igra ... 34

4.1. Igra na telefonih in tablicah ... 35

5. Viri in literatura ... 38

6. Priloge ... 39

(13)

Kazalo slik

Slika 1: Začetni prikaz ... 2

Slika 2: Postavitev oken ... 3

Slika 3: Izbira prikaza v oknu Project ... 3

Slika 4: Razmerje parent - child ... 4

Slika 5: Orodna vrstica ... 5

Slika 6: Tipke za igranje ... 6

Slika 7: Inspector objekta ... 6

Slika 8: Referenca na komponento ... 9

Slika 9: Prvi del skripte za premikanje ... 11

Slika 10: Premikanje igralca – 1. način ... 11

Slika 11: Premikanje igralca - 2. način ... 12

Slika 12: Skakanje igralca ... 12

Slika 13: Obračanje igralca v smeri premikanja ... 12

Slika 14: Kamera sledi igralcu - 1. način ... 13

Slika 15: Inspector Cinemachine ... 14

Slika 16: Premikanje 3D ... 14

Slika 17: Okno Animation ... 15

Slika 18: Primer igralca ... 16

Slika 19: Okno Animator ... 18

Slika 20: Preklapljanje med animacijami ... 19

Slika 21: Box Collider 2D ... 20

Slika 22: Circle in Capsule Collider 2D ... 20

Slika 23: Edge Collider 2D ... 21

Slika 24: Polygon Collider 2D ... 21

Slika 25: Box Collider (3D način) ... 21

Slika 26: Capsule Collider (3D način) ... 21

Slika 27: Sphere Collider ... 22

Slika 28: Sidra in prikaz sider ob kliku tipke Alt ... 23

Slika 29: Prikaz števca življenj ... 23

Slika 30: Števec ... 24

Slika 31: Prikaz plošče ob kliku ... 24

Slika 32: Lastnosti gumba ... 25

Slika 33: Prikaz ob kliku na gumb ... 26

Slika 34: Možnost On Click () ... 26

Slika 35: Izbira sider in prilagoditev canvasa kameri ... 26

Slika 36: Prikaz druge plošče za navodila ... 27

Slika 37: Nalaganje scene ... 27

Slika 38: Možnost On Click () za začetek in zaključek igranja ... 28

Slika 39: Barva plošče za pause menu ... 29

Slika 40: Spremenljivka za nadzor izvajanja igre ... 29

Slika 41: Koda za pause menu ... 30

Slika 42: Izgled pause menuja ... 30

Slika 43: Koda za Inventory... 31

(14)

Slika 44: Inspector skripte Inventory ... 32

Slika 45: Koda PobiranjeObjektov ... 32

Slika 46: Reset position... 33

Slika 47: Box Collider in skripta za referenco do objekta iz prefaba ... 33

Slika 48: Okno Unity Asset Store ... 34

Slika 49: Build Settings ... 35

Slika 50: Joystick ... 36

Slika 51: Editor ... 36

(15)

1

1. (Okolje) Unity 1.1. O programu

Unity je programsko okolje, ki je namenjeno razvijanju iger in je na voljo od leta 2005. V njem lahko izdelamo tako dvodimenzionalne kot tudi tridimenzionalne igre. Že od samega začetka je bila ena od osnovnih idej programa Unity, da lahko v njem igro sprogramiramo, nato pa jo z minimalnimi prilagoditvami izvozimo na različne operacijske sisteme oziroma konzole. Od leta 2018 lahko tako s programom Unity izdelamo igro, ki je primerna za igranje na petindvajsetih različnih platformah.

Unity uporabnikom ponuja tri različne pakete; izbiramo lahko med možnostmi Personal, Pro ter Plus. Paket Personal je brezplačen in je namenjen začetnikom, medtem ko moramo za ostala dva paketa plačati. Vidnejša razlika, ki jo opazimo pri izdelavi igre v paketu Personal in je pri ostalih dveh paketih ni, je prikaz napisa Made with unity, ki se prikaže ob zagonu igre.

Paket Plus stane 35 $ mesečno, medtem ko je cena paketa Pro kar 135 $ na mesec. Pri izbiri kateregakoli od paketov pridobimo 20 % popust pri nakupu paketov iz Unity Asset Store.

Poleg popusta bomo pri izbiri paketa Pro deležni podpore in sodelovanja s vodilnimi inženirji podjetja Unity. Na voljo nam bo tudi več prostora za shranjevanje, ki je pri paketu Plus omejen na 256 GB. Poleg tega bomo svoj projekt lahko delili z vso ekipo ter imeli vpogled v dogajanje v igri med igranjem igralcev. Ob odločitvi za paket Plus bomo pridobili enoletni dostop do tečajev, kjer se bomo naučili nekaj o bistvenih elementih, ki so potrebni za razvoj iger, potekajo pa tudi mesečna strokovna srečanja v živo.

1.2. Visual Studio

Visual Studio je integrirano razvojno okolje, ki ga je razvilo podjetje Microsoft in je privzet urejevalnik skript v programu Unity od verzije 2018.1 naprej.

1.3. Programski jeziki

Pri pisanju skript lahko izbiramo med tremi programskimi jeziki. Najpogosteje uporabljen jezik je C#, poleg tega pa lahko uporabimo tudi Javo oziroma Boo. Med razlogi za priljubljenost programskega jezika C# sta najbolj očitna dva, in sicer: 1) bolj optimizirano izvajanje kode, ki ima za posledico hitrejše delovanje igre tudi na slabših sistemih in pa 2) dejstvo, da je večina vodičev oziroma učnih materialov napisanih v tem jeziku. Jezik Boo je sintaktično podoben programskemu jeziku Python, od leta 2014 pa ga zaradi majhnega števila uporabnikov ne razvijajo več.

2. Unity projekt

Za ustvarjanje novega projekta (igre) se je na začetku potrebno odločiti, ali bo igra dvodimenzionalna ali tridimenzionalna, kar vpliva na pogled na sceno. Okolje Unity nam omogoča kasnejše preklapljanje med 2D in 3D načinom, ne glede na prvotno izbiro, kar

(16)

2

pomeni, da se lahko ob snovanju projekta v primeru zapletov ali novih, drugih idej, kadarkoli premislimo.

Po odločitvi o načinu igre in izbiri imena projekta s klikom na Create project ustvarimo projekt in dobimo prikaz, ki ga lahko vidimo na spodnji sliki.

Slika 1: Začetni prikaz

2.1. Okna

Preden začnemo z izdelovanjem oziroma ustvarjanjem igre, si moramo urediti okolje tako, da bo karseda enostavno za upravljanje. Zaradi številnih prilagodljivosti programa Unity si lahko izberemo postavitev oken tako, da si čim bolj olajšamo delo. Predvsem pa si s tem omogočimo preglednejši in hitreje dostopni prikaz. Prednost te lastnosti je ta, da zadosti različnim potrebam posameznika.

Posamezna okna lahko poljubno premikamo s klikom nanje in vlečenjem na izbrano pozicijo, z drsnikom pa reguliramo njihovo velikost. Unity ponuja nekaj že predpripravljenih postavitev, do katerih lahko dostopamo v desnem zgornjem kotu projekta (Layout). Izbiramo lahko med 2 by 3, 4 split, Tall, Wide ter osnovno možnostjo, ki se prikaže ob prvem zagonu projekta. V nadaljevanju bomo predstavili postavitev, ki se je po izkušnjah ob izdelavi didaktične igre pri predmetu Z IKT podprta učna gradiva 1 izkazala za najboljšo.

Če želimo dodati kakšno okno, ki v projektu še ni prikazano, to storimo s klikom na zavihek Window, kjer pod možnostjo General izberemo eno izmed osnovnih/glavnih oken, ki jih bomo opisali in predstavili v nadaljevanju poglavja.

2.1.1. Postavitev oken

Postavitev (Slika 2) si pripravimo tako, da med že pripravljenimi postavitvami izberemo možnost 2 by 3, nato pa okno Project premaknemo skrajno levo. Ostala okna premikamo, dokler ne dobimo postavitve, prikazane na sliki spodaj.

(17)

3

Slika 2: Postavitev oken

Nazadnje dodamo še okno Console tako, da je prikazano v spodnjem levem kotu.

Postavitev moramo na koncu zgolj še shraniti pod zavihkom Layout, saj bo Unity v nasprotnem primeru ob naslednjem nalaganju projekta prikazal osnovno postavitev oken.

Izgled okna Project lahko še dodatno nastavimo v zgornjem desnem kotu okna, kjer izberemo enovrstični (one column layout) oziroma dvovrstični (two column layout) prikaz.

Slika 3: Izbira prikaza v oknu Project

2.1.2. Okno Project

V oknu Project so v mapi Assets shranjeni in prikazani vsi elementi oziroma gradniki, ki jih potrebujemo za izdelavo projekta oziroma jih na različne načine vključimo in uporabimo v projektu. Tu najdemo scene, skripte, slike, zvok, datoteke z besedilom in tudi 3D modele, v kolikor gre za tridimenzionalno različico igre. Na začetku imamo v mapi Assets le mapo Scenes, ki vsebuje osnovno sceno, ki jo lahko že uporabimo, vse ostale gradnike pa moramo dodati sami.

Če želimo dodati novo sceno ali pa želimo napisati novo skripto, lahko to storimo z desnim klikom kjerkoli na območju okna Project, nato pa s klikom na Create izberemo želeno možnost (Scene ali C# script). Na isti način lahko dodamo tudi prazno mapo, le da po kliku Create izberemo možnost Folder.

(18)

4

Ker bo delo na projektu, ki ga izdelujemo, zagotovo trajalo več kot le nekaj ur, je pomembno, da vse gradnike projekta ustrezno poimenujemo, saj bomo v nasprotnem primeru ob morebitnem popravljanju projekta preveč časa porabili za iskanje in ugotavljanje, kje oziroma kateri je tisti element, ki ga potrebujemo. Prav tako nam bo iskanje in izdelovanje olajšano, če bomo podobne gradnike shranili v ustrezne mape ter te mape zopet ustrezno poimenovali. Ustvarili oziroma potrebovali bomo mapo za skripte, mapo za slike, mapo za scene ter mapo Prefabs. V mapo Prefabs bomo shranili »prefabe«, ki so pravzaprav vzorci objektov, iz katerih ustvarjamo nove instance.

Primer »prefaba« je lahko vzorec kovanca, ki smo mu dodali oznako (angl. tag), mu nastavili želeno velikost ter glavnemu junaku dodali skripto, ki mu omogoča pobiranje kovancev. Iz mape Prefabs bomo iz prej izdelanega vzorca ustvarjali nove instance ter tako skozi celotno igro dodajali kovance narejene na osnovi vzorca v igro.

Poljubno lahko dodamo tudi mape za zvok, animacije in videe, v kolikor jih bomo vključili v projekt.

Tako lahko na primer skripto, kjer bomo določili, kako se bo igralec premikal, poimenujemo PremikanjeIgralca in jo shranimo v mapo Skripte.

Slike, zvok in videe navadno shranjujemo v svojih mapah na računalniku oziroma jih obdelujemo z različnimi programi, zato jih v projekt dodamo tako, da jih zgolj povlečemo v ustrezno mapo.

2.1.3. Okno Hierarchy

V tem oknu lahko vidimo seznam objektov, ki so vključeni v trenutno prikazano sceno, in njihova hierarhična razmerja (odnose starš - otrok oziroma parent - child).

Če želimo ustvariti razmerje parent - child med dvema ali več objekti, to storimo tako, da objekt, za katerega želimo, da postane child, nesemo na tisti objekt, za katerega želimo, da postane parent (Slika 4). Pri tem bodo child objekti podedovali vrednosti Transform komponente parenta.

Slika 4: Razmerje parent - child

Objekte na sceno dodajamo z desnim klikom znotraj okna Hierarchy, kjer izberemo element, ki ga želimo dodati na sceno. Izbiramo lahko med 2D in 3D objekti, različnimi učinki, lučmi, videom, zvokom, kamero ter uporabniškim vmesnikom, ki nam ponuja še veliko možnosti, ki jih bomo podrobneje predstavili v poglavju 2.8. Dodamo pa jih lahko tudi tako, da jih iz okna Project povlečemo na sceno.

(19)

5

Objekte, ki jih dodamo, lahko poljubno poimenujemo in tudi tukaj nam lahko ustrezno poimenovanje prihrani kar nekaj časa, saj bomo v projekt vseskozi dodajali različne elemente in hitro bomo lahko naleteli na težave pri iskanju posameznih objektov. Pri poimenovanju objektov se bomo preventivno raje izognili uporabi šumnikov, saj lahko v nasprotnem primeru naletimo na kakšno težavo.

Če imamo na sceni veliko število enakih objektov, si lahko pogled v hierarhiji poenostavimo tako, da z desnim klikom ustvarimo prazen objekt (Create empty), ga preimenujemo, ter vse enake objekte nesemo nanj tako, da postanejo otroci praznega objekta. Tak objekt služi kot

»container« za skupino podobnih objektov, kar nam omogoča boljšo strukturo igre in posledično lažje programiranje.

2.1.4. Okno Scene

Objekte, ki smo jih dodali v oknu Hierarchy, lahko vidimo v oknu Scene. Tukaj jih lahko poljubno premikamo ter jim spreminjamo velikost in rotacijo. Vse to počnemo preko orodne vrstice (Slika 5), ki je nameščena v levem zgornjem kotu projekta.

Slika 5: Orodna vrstica

Za premikanje po sceni si pomagamo z miško. Če izdelujemo dvodimenzionalno igro, s koleščkom miške približujemo in oddaljujemo pogled, z desno tipko pa zamaknemo celotno sceno. Pri tridimenzionalni igri kolešček miške še vedno uporabimo za približevanje in oddaljevanje pogleda, medtem ko z desno tipko v tem načinu rotiramo pogled na sceno. Za premikanje pogleda tukaj uporabimo klik na kolešček miške.

Če želimo na sceni najti točno določen objekt, ki ga zaradi ostalih objektov ne vidimo, to storimo tako, da v hierarhiji dvakrat kliknemo na želeni objekt, scena pa se bo potem premaknila tako, da bo pogled usmerjen na točno ta objekt.

V oknu Scene lahko tudi preklapljamo med 2D in 3D načinom le s klikom na možnost 2D, ki je prikazana na vrhu okna.

2.1.5. Okno Game

V oknu Game ne moremo urejati ničesar, omogoča nam samo vpogled v to, da vidimo, kako bo igra izgledala. Za razliko od scene, kjer sami določamo pogled, bomo v tem oknu videli sceno glede na postavitev kamere. Če imamo v projektu več različnih kamer, lahko med njimi izbiramo, od tega pa je odvisno, kakšen bo prikaz scene.

Tukaj lahko igro oziroma del igre, ki smo ga izdelali, tudi odigramo. Za igranje ter ustavljanje igre pa uporabimo tri tipke, ki se nahajajo na sredini na vrhu projekta (Slika 6).

(20)

6

Slika 6: Tipke za igranje

Če bomo med izvajanjem igre karkoli spreminjali, naše spremembe ne bodo upoštevane in shranjene. To velja tudi, če igro zaustavimo.

2.1.6. Okno Inspector

Ko želimo kateremu od objektov dodati neke nove komponente ali pa spremeniti določene značilnosti oziroma funkcionalnosti, to storimo v oknu Inspector. Ko v hierarhiji ali na sceni izberemo (želeni) objekt, se nam tu prikažejo komponente, ki jih objekt že ima.

Na vrhu okna (Slika 7) lahko objekt preimenujemo, ga s klikom na kljukico prikažemo oziroma skrijemo na sceni ter mu dodamo oznako, ki nam bo prišla prav pri pisanju kod, saj bomo s pomočjo ukazov, kot sta FindGameObjectWithTag in CompareTag, lahko preverjali določene pogoje, ki bodo vezani le na objekte z neko oznako.

Slika 7: Inspector objekta

V Inspectorju najdemo tudi komponento Transform, ki vsebuje podatke o poziciji, rotaciji ter velikosti objekta, spodaj pa imamo možnost, da poljubno dodajamo komponente (Add Component), ki jih bomo za posamezen objekt potrebovali. Dodajamo lahko skripte, zvok, video, trkalnike, rigidbody … Posamezne komponente lahko ustvarimo tudi v oknu Project, v okno Inspector pa jih zgolj povlečemo z miško (npr. skripte).

2.1.7. Okno Console

Okno Console nam prikazuje sporočila o napakah v skriptah in sporočila, ki jih izpišemo z uporabo ukaza Debug.Log. Če želimo izvedeti, kje je program zaznal napako v kodi, dvakrat kliknemo na sporočilo o napaki in prikazala se nam bo točno tista vrstica v skripti, kjer je napaka.

Ko napako odpravimo, s klikom na možnost Clear (zgoraj levo v oknu) počistimo vsa prejšnja sporočila o napakah, tako da bomo lažje zaznali nove napake, če se slučajno pojavijo. V nasprotnem primeru se nam lahko zgodi, da bomo iskali in popravljali napako, ki je sploh ni oziroma smo jo že odpravili, le počistili nismo sporočil o napaki, saj program tega na naredi sam. Temu se lahko izognemo tako, da desno od možnosti Clear izberemo možnost Clear on Play, s katero ob vsakem igranju igre počistimo stara sporočila o napakah.

Debug.Log se uporablja na način, da na določenem mestu v kodi izpišemo sporočilo, s katerim si lahko pomagamo pri testiranju oziroma odkrivanju napak. O tem bomo govorili v poglavju Skripte.

(21)

7

2.2. Dodajanje objektov in upravljanje z njimi

2.2.1. GameObject

Osnovni objekt, ki ga bomo pri izdelovanju igre s programom Unity uporabljali, je GameObject. V osnovi so GameObject vsi objekti, ki jih bomo vključili v igro.

Vsak GameObject ima privzeto komponento Transform, vse ostale komponente pa moramo dodati sami.

2.2.2. Dodajanje objektov

Objekte lahko v projekt dodamo na več različnih načinov. Dodamo jih z desnim klikom znotraj hierarhije, nato pa se nam bodo prikazali na sceni. Če smo v projekt uvozili kakšen svoj objekt in ga shranili v eno od map, ga na sceno dodamo tako, da ga samo povlečemo vanjo ali pa v hierarhijo. Enako naredimo z objekti, ki smo jih shranili v mapo Prefabs.

2.2.3. Upravljanje z objekti

Ker večina objektov, ki jih bomo dodali, bodisi ne bo prave velikost bodisi ne bo prav orientirana, skoraj zagotovo pa ne bodo postavljeni na pravem mestu, jih bomo morali premakniti in prilagoditi tako, da bodo ustrezali načrtu igre, ki smo si ga zastavili.

Pri upravljanju z objekti si bomo pomagali z orodno vrstico, ki jo najdemo v levem zgornjem kotu. Za premikanje pogleda na sceno izberemo prvo tipko na levi ( ) ali pa to storimo z miško tako, kot smo opisali v poglavju Scene. Če sledimo tipkam od leve proti desni, drugo tipko ( ) uporabimo za spreminjanje pozicije objekta, tretjo tipko ( ) pa za spreminjanje rotacije. Z naslednjo tipko ( ) nastavimo poljubno velikost, predzadnja tipka ( ) pa nam pokaže, kje je središče našega objekta, da ga lahko postavimo na primerno mesto.

Vse te možnosti orodne vrstice lahko uporabimo tudi s pomočjo bližnjic. Tipke Q, W, E, R in T na tipkovnici predstavljajo tipke orodne vrstice od leve proti desni.

Zadnja tipka ( ) nima bližnjice na tipkovnici, prikaže pa nam hkrati možnosti za spreminjanje pozicije, rotacije ter velikosti.

2.3. Bližnjice

V tem poglavju si bomo ogledali nekaj bližnjic, saj nam bo njihova uporaba pri izdelavi igre lahko v veliko pomoč, pri tem bomo prihranili nekaj časa, izdelovanje igre pa bo potekalo hitreje in enostavneje.

Za kopiranje, lepljenje ter izrezovanje lahko v Unityju uporabimo iste bližnjice, kot jih uporabljamo pri različnih urejevalnikih besedil. Za kopiranje torej uporabimo Ctrl + C, za lepljenje Ctrl + V, za izrezovanje pa Ctrl + X. Če želimo označiti vse objekte, ki so prikazani na

(22)

8

sceni, uporabimo Ctrl + A. Ctrl + Z ter Ctrl + Y uporabimo za razveljavitev oziroma ponovitev zadnjega ukaza.

Zagotovo bomo med izdelovanjem igre večkrat potrebovali več enakih objektov, zato jih bomo morali podvojiti. To lahko storimo z uporabo Ctrl + D.

Da bi lažje našli objekt na sceni ter pogled osredotočili nanj, uporabimo Shift + F. Če imamo v igro vključen kakšen objekt, ki se samostojno premika, mu lahko sledimo z dvakratnim klikom tipke F.

Imamo tudi bližnjico za ustvarjanje praznega objekta (empty GameObject); to je Ctrl + Shift + N, z uporabo Alt + Shift + N pa ustvarimo otroka izbranega objekta.

Novo sceno lahko dodamo s pomočjo bližnjice Ctrl + N, medtem ko lahko posamezna okna, ki niso prikazana, prikažemo z uporabo Ctrl + 0-9, pri čemer vsako od števil predstavlja eno od oken. Če želimo katero od oken prikazati čez celoten zaslon, uporabimo Ctrl + Space. Isto možnost uporabimo za izklop celozaslonskega prikaza.

S Ctrl + P lahko začnemo oziroma prenehamo z igranjem igre v oknu Game, če želimo igro zaustaviti pa si lahko pomagamo s Ctrl + Shift + P.

Projekt shranimo s Ctrl + S, možnosti za izvoz igre pa odpremo s Shift + B.

2.4. Skripte

S skriptami lahko objektom določamo njihove lastnosti in obnašanje, zato bomo objektom dodajali skripte, ki jih bomo pisali s pomočjo programa Visual Studio, ki smo ga opisali v prvem poglavju. Pri tem bomo uporabljali programski jezik C#, predvsem ker velika večina videoposnetkov, s katerimi si bomo pri izdelavi igre lahko pomagali, uporablja ta programski jezik, poleg tega pa se igre, ki so napisane v C# jeziku, izvajajo bolj optimalno oziroma hitreje.

Skripte bomo objektom dodali, da jim bomo lahko dodajali različne funkcionalnosti, npr. v njih definirali premikanje objektov. Posameznemu objektu pa lahko dodamo poljubno število skript, odvisno od tega, kako bomo objekt v igri uporabili ter na kakšen način bo objekt, ki mu bomo dodali skripto, povezan z ostalimi objekti.

Skripto lahko dodamo tako, da v oknu Project z desnim klikom ustvarimo novo skripto (new Script) ali pa v oknu Inspector od izbranega objekta pod možnostjo Add Component izberemo New Script. Za pisanje skripte moramo najprej odpreti Visual Studio, to pa storimo tako, da dvakrat kliknemo na skripto.

Ko ustvarimo novo skripto, bo le-ta že privzeto vsebovala funkciji Start in Update. V funkcijo Start bomo napisali kodo, ki se bo izvedla natanko enkrat, in to takrat, ko bomo objekt ustvarili. V funkcijo Update pa bomo napisali kodo, ki se bo periodično izvajala ob vsaki na novo izrisani sličici (angl. frame). Funkcija LateUpdate se izvaja enako kot Update, le da je ta funkcija zadnja, ki se izvede ob izrisani sličici. Običajno jo bomo uporabili pri premikanju

(23)

9

kamere, ki mora biti zadnja stvar, ki se zgodi, preden se izriše nova sličica. Posebnost funkcije FixedUpdate pa je ta, da ni odvisna od hitrosti računalnika, ampak se izvede na določeno časovno enoto. Tipičen primer uporabe te funkcije bi bil premikanje igralca.

Funkcije lahko napišemo tudi sami ter jih potem kličemo bodisi znotraj iste skripte bodisi v kakšni drugi skripti (primer: funkcija za prikazovanje canvasa). Bolj podrobno pa bomo o tem pisali v poglavju 2.8.

Za preverjanje pogojev, ki so potrebni za delovanje igre, bomo potrebovali različne funkcije in ukaze, ki jih program Unity že vsebuje. Uporabili bomo OnTriggerEnter, OnCollisionEnter, FindGameObjectWithTag, CompareTag … Funkcija OnTriggerEnter se bo sprožila takrat, ko bosta dva trkalnika trčila drug ob drugega. O uporabi ostalih ukazov ter funkcij pa bomo bolj podrobno govorili v naslednjih poglavjih.

Ko zaključimo s pisanjem skripte, jo moramo vedno shraniti, saj funkcionalnosti v nasprotnem primeru ne bodo delovale. Če želimo preveriti, ali je skripta shranjena, moramo pogledati, ali je v zgornjem levem kotu ob imenu skripte prikazana zvezdica (*). Če je zvezdica prikazana, je potrebno skripto še shraniti, v nasprotnem primeru pa shranjevanje ni potrebno. Zvezdica bo prikazana za vsako neshranjeno skripto posebej.

V naslednjih štirih podpoglavjih si bomo natančneje na primerih pogledali uporabo prej omenjenih funkcij in ukazov.

2.4.1. Referenca na komponento

Referenco na komponento bomo dobili tako, da bomo v skripti, ki je pripeta na objekt, na začetku izven funkcij zapisali public komponenta ime, kjer bomo ime izbrali poljubno, nanj pa se bomo kasneje nanašali znotraj funkcij (primer: public RigidBody2D rb).

V Inspectorju objekta bomo pod zavihkom s skriptami (Slika 8) videli ime, ki smo si ga (za komponento) v skripti predhodno izbrali, poleg imena na desni pa bomo lahko videli prazen pravokotnik, v katerem bo pisalo none. Tega najverjetneje ne bomo videli takoj, zato bomo morali na prikaz počakati nekaj sekund. Nazadnje bomo morali želeno komponento z miško še potegniti v prazen pravokotnik in tako bomo dobili referenco na to komponento.

Slika 8: Referenca na komponento

Ko bomo dobili referenco na komponento, bomo lahko v eno izmed funkcij v skripti objekta napisali, kar bomo želeli, da se zgodi v zvezi s komponento glede na objekt.

(24)

10

Primer uporabe si bomo ogledali v poglavju Premikanje 2D, kjer bomo v skripti za delovanje premikanja potrebovali referenco na komponento RigidBody2D, ki jo bomo igralcu dodali, preden se bomo lotili pisanja skripte za premikanje.

2.4.2. Referenca na drug(e) objekt(e)

Referenco na objekt bomo dobili na podoben način, kot smo to storili za referenco na komponento v prejšnjem poglavju. Najprej bomo v skripto, ki je pripeta na objekt, zapisali public GameObject ime. Tudi v tem primeru si bomo izbrali poljubno ime (primer: public GameObject kovanec).

Podobno kot prej bomo v Inspectorju izbranega objekta pod zavihkom Skripte našli prazen prostor v obliki pravokotnika, v katerega bomo z miško potegnili želeni objekt.

2.4.3. Referenca do komponent drugega objekta

Najprej moramo dobiti referenco do drugega objekta, kot je opisano v zgornjem poglavju, potem pa s funkcijo GetComponent na tem objektu dobimo referenco do določene komponente drugega objekta.

2.4.4. Povezava med skriptami

Velikokrat se bo zgodilo, da bomo morali poklicati funkcijo, ki je del nekega drugega objekta.

To naredimo tako, da dobimo referenco do komponente (skripte), nato pa lahko poljubno kličemo funkcije iz te skripte oz. uporabljamo njene spremenljivke.

2.5. Premikanje

V večini iger glavnega akterja predstavlja avatar, ki ga lahko igralec med igranjem premika, zato si bomo v tem poglavju pogledali, kako iz programerskega vidika dosežemo, da se bo igralec premikal v dvodimenzionalni in tridimenzionalni igri. Akter je osrednja figura v igri, zato bomo morali temu primerno prilagoditi tudi kamero, ki mu bo sledila. Navajeni smo, da pri igranju iger uporabljamo smerne tipke ali pa tipke W, A, S in D, zato bomo za premikanje igralca tudi v predstavljenem primeru gibanja uporabili iste tipke.

2.5.1. Premikanje 2D

Za premikanje v 2D načinu imamo na voljo več različnih možnosti, v diplomskem delu pa bomo obravnavali le tiste, ki so preprostejše za implementacijo. Preden bomo začeli s pisanjem skripte, bomo akterju dodali komponento RigidBody2D, kar bomo naredili tako, da bomo v oknu Inspector s klikom na Add Component izbrali želeno možnost. Komponento RigidBody2D bomo dodali, da bo naš igralec pridobil fizikalne lastnosti, kot so na primer gravitacija, teža … Igralcu pa bomo nato dodali še eno komponento, s katero bomo poskrbeli, da se bo ob stiku s tlemi ustavil in ne bo padel skozi tla oziroma ne bo kar prosto šel skozi ovire. O tem pa bomo več povedali v poglavju Trkalniki, ki sledi v nadaljevanju.

Najprej si bomo pogledali način premikanja, ki ga bomo uporabili v primeru, ko bomo igralca videli od zgoraj, torej takrat, ko ga bomo želeli premikati v štirih smereh.

(25)

11

Za začetek bomo v skripto dodali spremenljivko hitrost, ki jo bomo lahko spreminjali in se tako lažje odločili za ustrezno hitrost premikanja igralca. Unity omogoča, da vrednost public spremenljivk določamo preko uporabniškega vmesnika, kar nam prihrani čas in olajša iskanje ustrezne vrednosti, v našem primeru hitrosti. Potrebovali bomo tudi referenco do komponente RigidBody2D, saj bomo smer in hitrost igralca določali preko nje (public RigidBody2D rb2d) (Slika spodaj). Dodali pa bomo tudi private Vector2 premikanje, saj je v Unityu hitrost izražena preko dvodimenzionalnega vektorja, ki predstavlja smer in hitrost gibanja.

Slika 9: Prvi del skripte za premikanje

V funkciji Update bomo s pomočjo ukaza Input dobili podatek o tem, katero tipko oziroma tipki je igralec pritisnil, saj bomo ta podatek uporabili pri določanju smeri vektorja. Podatek preberemo s pomočjo funkcije GetAxisRaw, ki ji damo kot parameter bodisi horizontal za vodoravno smer bodisi vertical za navpično smer, vrne pa vrednost med -1 in 1, ki je odvisna od tega, katero tipko smo pritisnili in kako dolgo smo jo držali. Na tem mestu bomo določili dvodimenzionalni vektor premikanje, in sicer tako, da bomo želeno smer premikanja dobili iz prejšnje vrstice, v kateri smo prebrali, katero/katere tipko/tipke je igralec pritisnil, to pa bomo pomnožili še s hitrostjo, ki jo bomo določili sami.

Kot smo v prejšnjem poglavju že omenili, bomo premikanje definirali v funkciji FixedUpdate, saj želimo, da premikanje ne bo odvisno od prikazanega števila sličic na sekundo. Ker funkcije privzeto ni v novo ustvarjeni skripti, jo bomo morali dodati sami. (Slika 10)

Pri definiranju premikanja bomo uporabili ukaz MovePosition, kjer bomo igralca premaknili glede na trenutno pozicijo s hitrostjo in smerjo, ki smo ju določili v funkciji Update. Na koncu bomo premikanje še pomnožili s Time.fixedDeltaTime, s čimer bomo poskrbeli, da se bo naš igralec zagotovo cel čas premikal enakomerno.

Slika 10: Premikanje igralca – 1. način

Sedaj pa bomo napisali še skripto, v kateri bomo definirali premikanje za igralca, ko ga bomo videli od strani. Pri tem bomo potrebovali le tipki za levo in desno ter tipko gor.

(26)

12

Na začetku bomo tako kot pri prejšnjem primeru potrebovali spremenljivko hitrost, ki jo bomo kasneje lahko spreminjali, prav tako pa bomo potrebovali referenco do komponente RigidBody2d, ki jo bomo pridobili na enak način kot zgoraj.

Funkcije Update tokrat ne bomo potrebovali, ker bomo vse napisali kar v funkcijo FixedUpdate. Podobno kot v zgornjem primeru bomo najprej preverili, katero tipko je igralec pritisnil, nato pa bomo uporabili komponento transform.position, ki določa pozicijo objekta na zaslonu. Prištevali ji bomo podatek o pritisnjeni tipki, ki ga bomo pomnožili s hitrostjo in Time.deltaTime, ter s tem dosegli, da se bo igralec premikal enakomerno. V nasprotnem primeru bi se zgodilo, da bi se igralec na manj zmogljivih računalnikih premikal prepočasi, na hitrejših pa prehitro, saj bi bilo gibanje odvisno izključno od števila izrisanih sličic na sekundo.

Slika 11: Premikanje igralca - 2. način

Nazadnje bomo določili še, na kakšen način in za koliko bo naš igralec lahko skočil. Za to bomo najprej potrebovali spremenljivko visinaskoka, da bomo lahko glede na igro prilagodili njegovo višino. V funkciji FixedUpdate bomo preverili, če je igralec pritisnil tipko gor (Input.GetKeyDown(“up”)), potem pa bomo rb2d.velocity nastavili na vrednost Vector2.up, ki ga bomo pomnožili z višino skoka.

Slika 12: Skakanje igralca

Dodali bomo tudi kodo, ki bo poskrbela, da bo igralec ob premikanju v levo oziroma desno stran gledal v smer premikanja. Z ukazom Input.GetAxis(“Horizontal”) bomo morali preveriti, katero tipko smo pritisnili, in na podlagi tega obrnili igralca v pravo smer. Pri tem si bomo pomagali z velikostjo igralca (angl. scale) na osi x, ki bo ob premikanju v desno enaka 1, ob premikanju v levo pa -1. S tem same velikosti igralca seveda ne bomo spreminjali, temveč ga bomo zgolj obrnili okoli navpične osi.

Slika 13: Obračanje igralca v smeri premikanja

(27)

13 2.5.1.1. Kamera sledi igralcu

Tako kot za premikanje imamo tudi za sledenje kamere igralcu več različnih načinov. V nadaljevanju si bomo ogledali dva izmed teh. Pri prvem načinu bomo potrebovali novo skripto, medtem ko bomo za drugega zgolj aktivirali paket, ki bo omogočal, da bomo za sledenje kamere poskrbeli v minuti.

Za prvi način najprej ustvarimo novo skripto, ki jo bomo pripeli na kamero. Potrebovali bomo štiri spremenljivke, s pomočjo katerih bomo lahko kasneje določili meje premikanja kamere.

Za lažje pisanje kode lahko spremenljivke poimenujemo kar MaxX, MaxY, MinX in MinY.

Vrednosti teh spremenljivk bomo določili tako, da bomo kamero premikali po sceni ter v vseh štirih smereh preverili, katera pozicija je tista, do katere se kamera še lahko premakne.

Potrebovali bomo tudi referenco do igralca, ki mu bo kamera sledila. Ker pa bomo tokrat potrebovali zgolj podatke o poziciji igralca, bomo pridobili referenco do njegove Transform komponente z ukazom public Transform igralec. Vedno ko bomo potrebovali le podatke o poziciji, rotaciji oziroma velikosti, bomo pridobili referenco do komponente Transform namesto do celotnega objekta, torej do GameObject.

Tokrat bomo kodo napisali v funkcijo LateUpdate. Ta funkcija se izvede čisto na koncu procesiranja sličice (angl. frame), potem ko so se vse druge funkcije že izvedle, saj drugače tvegamo, da se bo kamera premaknila pred premikom glavnega akterja v igri, kar pa z vidika igralne izkušnje ni dobro. Pozicijo igralca (transform.position) bomo definirali kot new Vector3, ki mu bomo kot argumente dodali trenutno pozicijo igralca skupaj z omejitvami, ki jih bomo določili s pomočjo spremenljivk.

Slika 14: Kamera sledi igralcu - 1. način

Za drugi način, ki je preprostejši, bomo v ukazni vrstici najprej izbrali možnost Windows, nato pa med Packages poiskali Cinemachine. Paket privzeto ni aktiviran, zato ga bomo najverjetneje morali namestiti; to naredimo s klikom na gumb Install. Poleg možnosti Windows se bo prikazala možnost Cinemachine, kjer bomo izbrali možnost Create 2D camera. Na sceni bomo tako imeli dve kameri, ki pa se bosta obnašali kot ena sama.

Vse, kar bomo morali še storiti, je to, da bomo igralca potegnili v okvirček poleg napisa Follow, s čimer bo kamera pridobila referenco do objekta, ki mu bo ves čas sledila. V Inspectorju lahko nastavimo še nekatere druge lastnosti kamere. S spreminjanjem Lookahead Time lahko namreč dosežemo, da ob premikanju v eno smer v tej smeri vidimo

(28)

14

dlje. Če pa bomo želeli, da se igralec na nekem območju premika ne da bi se pri tem premikala tudi kamera, bomo morali povečati oziroma zmanjšati velikost vrednosti Dead zone.

Slika 15: Inspector Cinemachine

2.5.2. Premikanje 3D

Tudi za premikanje v tridimenzionalnem načinu je na voljo veliko različnih možnosti, ki so odvisne tudi od pogleda na igralca v igri.

V nadaljevanju si bomo ogledali le eno izmed možnosti, ki je kratka in tudi preprosta. Pri tej možnosti bomo igralca premikali s smernimi tipkami, pri čemer bomo s tipkama gor in dol igralca premikali naprej in nazaj, s tipkama levo ter desno pa bomo igralca zarotirali v eno oziroma drugo smer.

Tako kot smo sedaj že navajeni, bomo tudi tukaj potrebovali novo skripto ter spremenljivko hitrost, prav tako bomo v funkciji FixedUpdate vrednost x in z prebrali z ukazom Input.GetAxis(“Horizontal”/”Vertical”) ter vsako od vrednosti tudi pomnožili s hitrostjo.

Z ukazom transform.Rotate(0, x, 0) bomo dosegli, da se bo igralec obračal le po vertikalni osi, s transform.Translate(0, 0, z) pa bo gibanje omejeno na ravnino, v kateri se nahaja.

Slika 16: Premikanje 3D

(29)

15 2.5.2.1. Kamera sledi igralcu

Za sledenje kamere igralcu v 3D načinu ne bomo potrebovali nobene nove skripte, ker bomo v oknu Hierarchy kamero le nesli na igralca, s tem pa bo kamera postala otrok igralca. Tako bomo dosegli, da bo kamera podedovala vse vrednosti komponente Transform od igralca, vključno s pozicijo. Na koncu bomo morali kamero na sceni postaviti na mesto, kjer bo igralec viden na takšen način, kot smo si to zamislili.

2.6. Animacije

V prejšnjem poglavju smo opisali različne načine za premikanje igralca, v tem poglavju pa si bomo ogledali, kako doseči, da bo igralec ob premikanju tudi izgledal tako, kot da se premika, torej da ne bo stal pri miru, ampak bo hoja animirana. Seveda pa postopek ne velja le za igralca, na enak način namreč dosežemo, da se bodo premikali tudi ostali objekti na sceni. Isti objekt lahko ima naenkrat več animacij (ko hodi, skače, se plazi itd.). Vse, kar bo potrebno narediti, bo ustvariti animacijo oziroma animacije za posamezen objekt.

Ker bomo za izdelavo igre najverjetneje potrebovali več različnih animacij, bomo za lažjo organizacijo v oknu Project ustvarili mapo Animations, v katero bomo shranili animacije, ki jih bomo ustvarili.

Pri ustvarjanju animacij si bomo pomagali s prilagojenim okoljem za animacije, ki je vključeno v Unity. Do njega dostopamo preko okna Animation. Orodje v privzeti postavitvi oken ni vključeno, zato ga bomo morali najprej dodati v projekt. To storimo tako, da se pod zavihkom Window z miško postavimo na možnost Animation, nato pa izberemo Animation.

Okno lahko sicer poljubno premikamo, za lažje ustvarjanje pa predlagamo, da se ga postavi pod sceno (slika 17).

Slika 17: Okno Animation

Če bomo želeli, da bodo animacije čim bolj pristne, bomo igralca ustvarili sami, pri tem pa bomo dele telesa v projekt uvozili posebej. S tem si bomo omogočili, da bomo lahko pri določeni animaciji premaknili le specifični del telesa. Pri hoji bomo na primer premikali le noge in roke.

(30)

16

Slika 18: Primer igralca

Zaradi lažjega ustvarjanja animacij ter tudi boljše preglednosti v samem projektu bomo ustvarili empty GameObject, ki ga bomo poimenovali Igralec, nanj pa bomo nesli vse dele telesa. Tako bomo lahko igralca premikali kot celoto, mu lažje dodali skripte, trkalnike ter ostale komponente. Če bomo za sledenje kamere igralcu uporabili Cinemachine, bo kamera sledila prej ustvarjenemu GameObject, kar pa zavoljo dejstva, da se program ne more odločiti, kateremu izmed otrok objekta bo sledil, ne bo delovalo pravilno. Težavo bomo odpravili tako, da bomo s kamero sledili le telesu ali pa glavi igralca.

Druga možnosti, ki jo lahko glede igralca uporabimo, je Unity Asset Store, kjer je na voljo veliko različnih že ustvarjenih igralcev, ki jih lahko naložimo v projekt. Več o uporabi Unity Asset Store bomo opisali v tretjem poglavju.

Ko bomo vse pripravili, lahko začnemo z ustvarjanjem prve animacije. Najprej bomo v Hierarchy izbrali želeni objekt ter odprli okno Animation. S klikom na Create bomo ustvarili novo animacijo, jo poimenovali ter jo shranili v ustrezno mapo. Posamezno animacijo bomo poimenovali tako, da bomo v nadaljevanju točno vedeli, kaj se z igralcem pri določeni animaciji dogaja. Skoraj zagotovo bomo potrebovali vsaj tri različne animacije: eno, ko bo igralec v mirovanju, drugo, ko se bo premikal, ter tretjo, ko bo igralec skočil.

Na levi strani zgoraj bomo našli orodno vrstico ( ),

za nas pa bo najbolj pomemben drugi gumb iz leve strani ( ), s katerim bomo začeli snemati animacijo. Pod orodno vrstico bomo našli gumb Add Property, ki ga bomo kliknili vsakič, ko bomo želeli dodati nov element v animacijo. Z elementom animacije mislimo na sličico, ki je del animacije in jo želimo spreminjati, npr. na sličici 8 želimo postaviti glavo glavnega igralca malenkost višje. Možnosti, ki nam bodo na voljo, bodo odvisne od tega, kakšen je izbrani objekt, ki mu dodajamo animacijo.

Na desni strani je časovnica animacije, ki je na začetku prazna. Karkoli bomo v animacijo dodali, bo vidno na tej časovnici, tukaj pa bomo lahko tudi določili, kako hitro se bo animacija izvajala.

Najprej bomo ustvarili animacijo, ko bo igralec v mirovanju. Na začetku ne smemo pozabiti na gumb snemaj, saj se v nasprotnem primeru animacija ne bo posnela. Želeli bomo, da bo

(31)

17

igralec v mirovanju izgledal, kot da diha, torej da malce premika glavo gor in dol ter morda podobno premika tudi roko. Lahko pa se tudi poljubno odločimo, kaj bo igralec ob mirovanju počel.

Najprej bomo s klikom na Add Property dodali trenutno pozicijo igralca oziroma tistega dela telesa, ki ga bomo nato premikali. To storimo tako, da izmed možnosti, ki se nam bodo ob kliku prikazale, izberemo position, pod orodno vrstico pa se nam bo izpisalo to, kar smo dodali (npr. glava : position). Vidimo lahko, da smo s tem to dodali tudi na časovnico, in sicer na začetek in na konec animacije. Igralec oziroma objekt mora biti na začetku in na koncu animacije na isti poziciji ter enake velikosti, saj bi se lahko zgodilo, da bi v nasprotnem primeru animacija delovala neživljenjsko.

Vmes bomo dodali spremembe pozicije glave, vse skupaj pa bo nato izgledalo tako, kot da igralec glavo premika gor in dol. To storimo tako, da navpično belo črto na časovnici premaknemo nekam vmes med začetkom in koncem animacije ter nato kar na sceni glavo premaknemo malce višje. Nazadnje bomo glavo malce pred koncem premaknili še malo nižje od začetne pozicije. Za zaključek ustvarjanja animacije še enkrat kliknemo na tipko snemaj.

Če želimo preveriti, kako ustvarjena animacija deluje, kliknemo na tipko Play v orodni vrstici in animacija se bo začela izvajati. V primeru, da se animacija izvaja prepočasi, moramo konec na časovnici premakniti bližje začetku. Obratno storimo, če se animacija izvaja prehitro.

Na podoben način lahko ustvarjamo animacije za različne objekte ter jim spreminjamo pozicijo, rotacijo ali pa celo velikost. Pri tem se moramo le odločiti, kateremu izmed objektov bomo dodali animacijo ter kaj se bo z izbranim objektom dogajalo.

2.6.1. Animator

Animator je orodje, s pomočjo katerega lahko preklapljamo med različnimi animacijami. Tudi okno Animator bomo morali dodati v projekt, kar bomo storili na podoben način, kot smo dodali okno Animation. Pod zavihkom Window bomo pri možnosti Animation izbrali možnost Animator ter ga s klikom dodali v projekt. Tako kot vsa okna bomo lahko tudi to okno premikali in postavili poljubno.

V oknu bomo lahko videli končni avtomat stanj različnih animacij, ki jih predstavljajo pravokotniki različnih barv. Poleg pravokotnikov z imeni Entry, Any State in Exit, bomo našli pravokotnike, ki bodo poimenovani tako, kot smo prej poimenovali posamezne animacije. Za prehajanje iz ene animacije v drugo bomo morali posamezne pravokotnike med seboj še povezati.

(32)

18

Slika 19: Okno Animator

Povezavo ustvarimo tako, da desno kliknemo na tisto animacijo, od katere želimo, da poteka povezava, ter izberemo možnost Make Transition, nato pa kliknemo še na animacijo, s katero želimo vzpostaviti povezavo.

V zgornjem levem kotu okna bomo s klikom na “plus” dodali parameter, s pomočjo katerega bomo kasneje določali, ob katerem pogoju se bo izvajanje ene animacije zaključilo ter začelo izvajanje druge. Predstavili bomo primer, ko izberemo možnost bool, parameter pa potem še preimenujemo. Parameter bomo poimenovali igralecTece ter nato ustvarili povezavi med animacijo mirovanje ter animacijo tek v obeh smereh.

Lastnosti posamezne povezave bomo določili tako, da bomo povezavo označili s klikom, nato pa bomo v Inspectorju pod zavihkom Conditions dodali parameter igralecTece ter vrednost parametra nastavili na True. S tem bomo dosegli, da se bo animacija teka začela izvajati le v primeru, ko se bo igralec začel premikati oziroma ko bomo parameter v kodi na mestu, ki odslikava to stanje, nastavili na True. Podobno bomo storili še za povezavo v nasprotni smeri, le da bomo vrednost istega parametra tokrat nastavili na False, kar bo pomenilo, da se bo animacija mirovanja začela izvajati takrat, ko se igralec ne bo več premikal, torej na tistem delu kode, ki kodira mirujoče stanje.

Nazadnje bomo odkljukali možnost Has Exit Time ter s tem zagotovili, da se bo druga animacija začela izvajati takoj, ko bo pogoj za njeno izvajanje izpolnjen, in to tudi v primeru, ko se prva animacija še ne bo izvedla do konca. Hitrost prehoda med dvema animacijama pa nastavimo preko vrednosti Transition Duration.

Ko bomo vse animacije povezali med seboj, da bodo kot celota delovale, kot smo si zamislili, bomo morali v skripti, v kateri smo definirali premikanje igralca, določiti, kdaj naj se katera od animacij začne izvajati. Potrebovali bomo referenco do Animatorja, ki jo bomo pridobili z ukazom public Animator animator, nato pa bomo pod kodo, ki skrbi za premikanje, preverili, kje v kodi je določeno stanje, ko igralec miruje. V tem primeru bomo vrednost parametra igralecTece nastavili na False, v primerih, ko bomo želeli, da se premika, pa na True.

(33)

19

Slika 20: Preklapljanje med animacijami

Na podoben način dodamo tudi parameter za skok (igralecSkace). Skok predstavlja posebno vrsto animacije, saj se mora izvesti v vsakem primeru, ne glede na to, ali igralec miruje ali pa se premika. To naredimo tako, da v Animatorju dodamo povezavo med Any State in skokom.

Pravokotnik Any State namreč predstavlja katerokoli stanje, v katerem je lahko igralec. Na povezavo bomo dodali parameter igralecSkace in vrednost nastavili na True. Nato bomo skok povezali še z animacijama mirovanje in tek. Na obe povezavi bomo dodali parameter igralecTece, le da bomo pri povezavi med skokom in tekom vrednost nastavili na True, pri povezavi med skokom in mirovanjem pa na False. Tokrat možnosti Has Exit Time ne bomo spreminjali, saj se mora animacija skoka vedno izvesti do konca. Na koncu bomo to, kdaj naj se animacija skoka izvede, preverili in določili še v skripti pod kodo, ki skrbi za skakanje, le da bomo tokrat spreminjali vrednost parametra igralecSkace.

2.7. Trkalniki

Pomembna komponenta, ki jo bomo pri izdelavi igre zagotovo uporabljali, so trkalniki (angl.

colliders). Trkalnike bomo dodali tistim objektom, za katere bomo želeli, da bodo zaznavali trke oziroma dotike z drugimi objekti, ki jim bomo prav tako dodali trkalnike. Dogajanje ob posameznem trku oziroma dotiku bomo definirali v skripti. Pri tem bomo uporabili ukaze OnTriggerEnter2D, OnCollisionEnter2D ter še nekatere druge, ki jih bomo uporabili pri nekaterih primerih v nadaljevanju.

Ukaz OnTriggerEnter2D uporabimo takrat, ko želimo, da se nekaj zgodi takrat, ko objekt s trkalnikom preide skozi objekt, ki ima obkljukano možnost IsTrigger, oziroma se takšnega objekta dotakne. Primer uporabe tega ukaza bi bil ta, da igralec stopi skozi vrata, pri tem pa se besedilo, v katerem je napisana številka nivoja, poveča za ena.

Ukaz OnCollisionEnter2D pa se od zgoraj opisanega ukaza razlikuje v tem, da ga uporabimo ob trku dveh objektov, ki imata dodan trkalnik, pri tem pa noben od objektov nima obkljukane možnosti IsTrigger, zato se ne moreta prekriti. Uporabili bi ga lahko takrat, ko se igralec zaleti v rob vrat in ne more stopiti skozi, ob tem pa se prikaže sporočilo, naj najprej odpre vrata oziroma poskusi znova.

Isto velja za uporabo obeh ukazov v tridimenzionalni različici.

Trkalnike dodamo tako, da izberemo želeni objekt ter v Inspectorju poiščemo ustrezen trkalnik. Objektom lahko dodamo tudi več trkalnikov, ki se med seboj lahko prekrivajo.

(34)

20

Primer uporabe večih trkalnikov je priporočljiv pri igralcu, kjer uporabimo kombinacijo okroglega ter štirikotnega trkalnika.

V sami igri trkalnikov ne bomo videli, bodo pa zato vidni na sceni, kjer jih bomo prepoznali po tanki zeleni črti, ki bo imela na sredini vsake stranice majhen zelen kvadratek. Če z obliko, ki nam jo bo podal program, ne bomo zadovoljni, jo lahko tudi spremenimo. To storimo tako, da pri nastavitvah komponente v Inspectorju izberemo možnost Edit Collider, nato pa obliko trkalnika spreminjamo z vlečenjem zelenih kvadratkov na stranicah. Ko zaključimo z urejanjem, moramo urejanje še izklopiti s ponovnim klikom na Edit Collider.

V naslednjih dveh podpoglavjih si bomo ogledali različne vrste trkalnikov, ki se med seboj razlikujejo po obliki, ter nekaj primerov, v katerih bomo trkalnike uporabili. Če bomo pri izdelavi igre uporabljali kompleksnejše trkalnike, bodo le-ti vzeli več procesorske moči.

2.7.1. 2D trkalniki

Če bomo izdelovali dvodimenzionalno igro, bomo pri tem uporabljali dvodimenzionalne trkalnike. Glede na obliko objekta se bomo odločili, kakšen trkalnik bomo uporabili.

Najenostavnejša oblika ter tudi oblika, ki jo bomo verjetno uporabljali najpogosteje, je Box Collider 2D v obliki štirikotnika.

Slika 21: Box Collider 2D

Za okrogle objekte bomo uporabili Circle Collider 2D, če pa bomo potrebovali obliko elipse, bomo objektu dodali Capsule Collider 2D.

Slika 22: Circle in Capsule Collider 2D

(35)

21

Naslednja oblika trkalnika, ki ga bomo uporabili pri tleh, je Edge Collider 2D, saj ga bomo lahko preoblikovali v premico ter ga postavili na rob tal tako, da se bo igralec ob stiku s tlemi ustavil.

Slika 23: Edge Collider 2D

Objektom pa lahko dodamo še eno obliko trkalnika, Polygon Collider 2D, ki deluje tako, da se prilagodi objektu.

Slika 24: Polygon Collider 2D

2.7.2. 3D trkalniki

V tridimenzionalnem načinu imamo na voljo tridimenzionalne trkalnike. Nekateri so poimenovani isto kot 2D trkalniki, le da v imenu nimajo dodanega zapisa 2D.

Trkalnik, ki je v obliki škatle, je Box Collider.

Slika 25: Box Collider (3D način)

Capsule Collider bomo uporabili takrat, ko bo objekt imel obliko kapsule.

Slika 26: Capsule Collider (3D način)

(36)

22 Objektom v obliki kroga bomo dodali Sphere Collider.

Slika 27: Sphere Collider

Trkalnik, ki ga bomo uporabili, ko bomo želeli, da se bo prilagodil obliki objekta, je Mesh Collider. Namesto tega pa lahko uporabimo tudi kombinacijo ostalih trkalnikov.

2.8. UI

V tem poglavju bomo predstavili in oblikovali uporabniški vmesnik (angl. user interface), na katerega lahko dodamo platna (angl. canvas), plošče (angl. panel), gumbe, slike, besedilo, drsnike ter še nekatere druge elemente. Izgled uporabniškega vmesnika bomo oblikovali glede na to, za kakšen stil igre se bomo odločili, temu primerno pa bodo izgledali tudi elementi.

Oblikovanje uporabniškega vmesnika bomo začeli tako, da bomo na sceno najprej dodali platno (angl. canvas), ki služi kot osnova oz. podlaga, nanj pa bomo nato dodajali različne elemente. Če bomo želeli, da bo velikost platna prilagojena kameri, bomo morali to pri lastnostih platna določiti tako, da bomo pri nastavitvi Render Mode izbrali možnost Screen Space - Camera.

Elemente dodamo tako, da z desnim klikom na Canvas pod možnostjo UI izberemo želeni element, ki se bo nato prikazal na sceni. Dodane elemente lahko postavimo na poljubno mesto na platnu, pri čemer za določanje pozicije uporabimo sidra (angl. anchorje) v Inspectorju. S tem bomo zagotovili, da bo element zagotovo na želenem delu platna in posledično tudi kamere, ne glede na dimenzije zaslona, na katerem bomo igro igrali. Če bomo pozicijo elementov poskusili spremeniti tako, da jih bomo le slepo premikali po platnu v oknu Scene, se nam bo zgodilo, da ob zagonu igre element ne bo na želenem mestu, čeprav bo na sceni vse izgledalo pravilno. Prav tako bo na različnih zaslonih element na različnih mestih.

Sidra uporabimo tako, da kliknemo na kvadrat (slika spodaj), pri čemer se nam bo spodaj prikazalo več možnosti. Želeno možnost izberemo tako, da držimo tipko Alt in kliknemo nanjo. Element lahko nato poljubno odmaknemo od roba.

(37)

23

Slika 28: Sidra in prikaz sider ob kliku tipke Alt

2.8.1. Števec

Ne glede na to, za kakšen stil igre se bomo odločili, bomo najverjetneje potrebovali nek sistem, ki bo štel točke. To bo bodisi števec življenj bodisi točk, morda pa tudi števec porabljenega časa. Tukaj si bomo ogledali, kako izdelati števec življenj, na podoben način pa bomo potem lahko izdelali tudi ostale števce.

Najprej se bomo odločili, kako bo igralec pridobil dodatno življenje. Na voljo imamo veliko različnih načinov, s števcem, ki ga bomo izdelali, pa bomo naredili tako, da bo pridobil novo življenje ob dotiku objekta na sceni. Za sliko objekta bomo izbrali srce, ki ga lahko najdemo na Unity Asset Store ali pa ga preprosto izdelamo sami ter ga uvozimo v projekt. Na sceno bomo dodali poljubno število src, za vsa srca, ki jih bomo dodali, pa bomo ustvarili novo oznako (Zivljenje). Nazadnje bomo vsem srcem dodali trkalnike (box collider) ter obkljukali možnost IsTrigger.

Nato bomo na canvas dodali text, na katerem se bo izpisalo število življenj ter ga preimenovali v SteviloZivljenj. Besedilu lahko poljubno dodamo kakšno ozadje ali pa na canvas dodamo sliko srca ter nanj postavimo besedilo.

Slika 29: Prikaz števca življenj

Pri tem ne bomo potrebovali nove skripte, saj bomo potrebno kodo dodali v skripto, kjer smo prej definirali premikanje igralca. Uporabili bomo funkcijo OnTriggerEnter2D, prav tako pa bomo pridobili referenco do polja z besedilom, ki smo ga dodali na canvas ter preko posebej temu namenjene spremenljivke določili začetno število življenj (public static int stevilo_zivljenj = 0). Ker bomo želeli pridobiti referenco do polja z besedilom, ki je element uporabniškega vmesnika, bomo morali na vrhu v skripti vključiti using UnityEngine.UI.

(38)

24

V funkciji OnTriggerEnter2D bomo preverili, če je oznaka objekta, ki smo se ga dotaknili, enaka oznaki, ki smo jo prej nastavili vsem srcem (t.j. Zivljenje). Če bo to držalo, bomo objekt uničili, spremenljivki stevilo_zivljenj prišteli ena in v polju z besedilom izpisali trenutno vrednost števila življenj. V polju z besedilom lahko prikazujemo le nize, zato bomo številko v stevilo_zivljenj spremenili v niz z ukazom ToString in tako dosegli, da se bo izpisala.

Slika 30: Števec

2.8.2. Prikaz besedila ob kliku

Če bomo igro zastavili tako, da bomo poleg tipk pri igranju uporabljali tudi miško, bomo lahko z uporabo funkcije OnMouseDown definirali različne dogodke, kot na primer prikaz besedila ob kliku, prikaz slike ob kliku, prikaz navodil ob kliku na tablo, dodajanje, odstranjevanje objektov ter še veliko drugih možnosti. Natančneje bomo opisali eno izmed možnosti za izdelavo prikaza besedila ob kliku.

Na canvas bomo dodali ploščo, na katero bomo nato dodali še polje z besedilom. To bomo storili, da bo besedilo bolje vidno, saj bomo lahko izbrali ustrezen kontrast med barvo plošče in barvo besedila, poleg tega pa se besedilo ne bo kar pojavilo nekje v zraku, temveč bo v nekakšnem »oblačku«. Tudi tukaj bomo ploščo preimenovali v nekaj takšnega, kar nam bo kasneje olajšalo delo, ko bomo morali pridobiti referenco do te plošče (primer: navodila).

Ustvarili bomo novo skripto (PrikazBesedilaObKliku) ter najprej pridobili referenco do plošče, ki se bo ob kliku prikazala. Kot smo že zgoraj omenili, bomo uporabili funkcijo OnMouseDown, v kateri bomo definirali, kdaj se bo plošča z navodili prikazala ter kdaj se bo skrila. S kodo, ki jo bomo napisali, bomo poskrbeli, da se bo plošča ob kliku na nek objekt prikazala ter se nato ob ponovnem kliku tudi skrila. To storimo tako, da preverimo, ali je plošča aktivna oziroma prikazana, nato pa v primeru, da je aktivna, ploščo skrijemo, v nasprotnem primeru pa prikažemo. Pri tem uporabimo ukaz SetActive, ki mu dodamo vrednost true ali pa false.

Slika 31: Prikaz plošče ob kliku

Reference

POVEZANI DOKUMENTI

»Za naložbo v novo tovarno, s katero bomo podvojili proizvodne zmogljivosti, bomo namenili 51 milijonov evrov.. Izpeljali jo bomo v

V ˇ clanku se bomo najprej seznanili s pojmom pametni mo- bilni telefon, nato si bomo ogledali zakaj so pametni telefoni sploh zanimivi za potencialne vdore, nato ˇ se o ˇ

Za primerjavo testnih orodij smo razvili spletno aplikacijo, ki jo bomo upo- rabili za izdelavo in izvajanje avtomatiziranih testov v orodjih Selenium, Appium in Eggplant

Višino kamere lahko nastavimo tudi v oknu scene tako, da izberemo kamero in povlečemo prikazane puščice v želeno smer (slika 4).. Slika 4: Prikaz možnosti

Dodaja se jih lahko s klikom na gumb (v oknu Inspector ) Add Component ali pa se jih preprosto povleče v objekt (npr. skripte, slike,...).. S komponentami se lahko upravlja ročno

V tem poglavju pa si bomo pogledali ˇse abstraktno karakterizacijo diedrske grupe, si ogledali njene generatorje in natanˇ cno pre- gledali vse podgrupe D n.. Za konec si bomo na

V zadnjem poglavju bomo predstavili izvedbo treh učnih ur na izbrani osnovni šoli, kjer smo uporabili program Scratch za izdelavo digitalne zgodbe s pomočjo multimedijskih

V tem primeru bomo za izdelavo vsebine potrebovali bolj profesionalno orodje, ki znotraj orodja ponuja veliko različnih funkcij, interaktivnih elementov, možnost