42
UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA DOMEN BRGLEZ PROGRAMIRANJE IZOBRAŽEVALNIH IGER V PROGRAMU UNITY DIPLOMSKO DELO Ljubljana, 2017

PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

UNIVERZA V LJUBLJANI

PEDAGOŠKA FAKULTETA

DOMEN BRGLEZ

PROGRAMIRANJE IZOBRAŽEVALNIH

IGER V PROGRAMU UNITY

DIPLOMSKO DELO

Ljubljana, 2017

Page 2: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 3: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

UNIVERZA V LJUBLJANI

PEDAGOŠKA FAKULTETA

DVOPREDMETNI UČITELJ

DOMEN BRGLEZ

Mentor: izr. prof. dr. JOŽE RUGELJ

Somentor: asist. MATEJ ZAPUŠEK

PROGRAMIRANJE IZOBRAŽEVALNIH IGER V PROGRAMU

UNITY

DIPLOMSKO DELO

Ljubljana, 2017

Page 4: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 5: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Zahvaljujem se mentorju izr. prof. Jožetu Ruglju, da me je sprejel pod svoje mentorstvo.

Iskerna zahvala tudi prof. Mateju Zapušku, za vse napotke, popravke, pomoč in potrpe-

žljivost ter spodbudne besede pri pisanju diplome.

Zahvaljujem se tudi vsem, ki so mi v času študija stali ob strani in verjeli vame.

Page 6: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 7: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

POVZETEK

Pri poučevanju nas vedno zanima, kako izboljšati učenje s pomočjo novih učnih metod, ki bi

olajšale razumevanje, povečale motivacijo in imele za rezultat poglobljeno znanje. Ena izmed

inovativnih metod je poučevanje s pomočjo izobraževalnih računalniških iger.

Igre uporabljamo pri poučevanju v situacijah, kjer bi lahko z njimi bolje razložili učno snov,

ponudimo učencem varno okolje za eksperimentiranje, simuliramo realne situacije... Prav

zato pa je uporaba dobrega okolja za izdelavo igre nujna, saj nam celoten postopek izdelave

igre zelo olajša.

Eden izmed teh programov je Unity, katerega sem se odločil opisati v diplomski nalogi.

Z njim lahko naredimo 2D in 3D igre, sami napišemo programsko kodo, igro pa izvozimo v

katerikoli sodobni format.

Ker sem se že prej srečal s programom za izdelavo iger (eAdventure), sem najprej program

Unity primerjal z njim, nato pa vse stvari, ki se dajo izdelati v njem opisal, kako se naredijo

v Unity ter dodal še več uporabnih stvari za izdelavo kvalitetnejše igre. Unity ima možnost

programiranja kode in skript, zato sem še prej izluščil bistvene stvari programskega jezika

C#, ter nekaj njegovih sintaktičnih značilnosti.

Končna diplomska naloga se izkaže kot nekakšen vodič (guide) za vse, ki si želijo ustvar-

jati (izobraževalne) računalniške igre in so se prvič srečali s programom Unity.

Ključne besede: eAdventure, Unity, računalniške igre, izobraževalne igre, C#

Page 8: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 9: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

ABSTRACT

We are always trying to improve learning process by finding new ways to increase motivation,

make things easier to understand and last but not least to get better learning results. One

method to do that is by creating educational video games.

Video games are used in situations that can explain certain situations better, where we

can make safe environment for students to experiment new things, to simulate real life si-

tuations and last but not least to increase their motivation in learning process. That is the

main reason to use a good program when creating video games.

One of these programs is Unity, which is described in this diploma. 2D and 3D games

can be created in Unity, we can write our own scripts and do the programming. Games can

be exported to every nowadays platform.

In the beginning I made a comparison to a known program which I used before called eAd-

venture. Then all the things that can be made in eAdventure are made in Unity with specific

upgrades. Because of programming function in Unity I made some basic description of C#

programming language and some specific syntax.

Diploma in general turned out to be sort of a guide for all of those who want to create

(educational) video games but they never worked with Unity.

Key words: eAdventure, Unity, video games, educational games, C#

Page 10: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 11: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Kazalo

1 Program eAdventure 1

1.1 O programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2 Stvari, ki jih ponuja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.3 Slabosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Programski jezik C# 4

2.1 Predstavitev jezika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2 Predstavitev osnovnih stvari . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2.1 Vrednostne spremelnjivke . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2.2 Nizi (String) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2.3 Definiranje in incializiranje spremenljivk . . . . . . . . . . . . . . . . 5

2.2.4 Operatorji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2.5 Pogojni stavki in zanke . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 Povezava v Unity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 Uvod v Unity 8

3.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.2 Razlaga nekaterih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.2.1 Nadzorovanje dela . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.2.2 Uporaba Namespace-ov . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.2.3 Komponente objekta . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.2.4 Metoda Start() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.2.5 Metoda Update() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.2.6 Metoda FixedUpdate() . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.2.7 Metoda LateUpdate() . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.3 Ena ideja organizacije okolja . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.4 Dodajanje zvoka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.5 Igralec (Player) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.6 Animacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Page 12: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3.7 Trkalniki (Colliders) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.7.1 Box Collider 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.7.2 Circle Collider 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.7.3 Edge Collider 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.7.4 Polygon Collider 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.7.5 Capsule Collider 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.8 Drag&drop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.9 Premikanje igralca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.9.1 Premikanje z miško . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.9.2 Premikanje s tipkovnico . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.10 Prehod med scenami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.10.1 Prehod s pomočjo gumba . . . . . . . . . . . . . . . . . . . . . . . . 22

3.10.2 Prehajanje med scenami ob dotiku oz. trku . . . . . . . . . . . . . . 23

3.11 Kamera sledi igralcu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.12 Projekt do .exe datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4 Seznam priloženih skript 26

5 Viri 27

Page 13: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 14: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slike

1 Sintaksa if stavka. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Sintaksa if-else stavka. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

3 Sintaksa while in for zanke. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

4 Zaslon po privzetih nastavitvah. . . . . . . . . . . . . . . . . . . . . . . . . . 10

5 Subjektivna organizacija oken. . . . . . . . . . . . . . . . . . . . . . . . . . . 12

6 Primer Sprite Sheet-a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

7 Primer grafa v Animator-ju. . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

8 Oblika Box Collider-ja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

9 Oblika Circle Collider-ja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

10 Oblika Edge Collider-ja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

11 Oblika Polygon Collider-ja. . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

12 Oblika Capsule Collider-ja. . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

13 Okno Build Settings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Page 15: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki
Page 16: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

1 Program eAdventure

1.1 O programu

EAdventure je program razvit v okviru e-UCM raziskovalnega projekta. Program dostopen

na naslovu http://e-adventure.e-ucm.es/.

Namenjen je ustvarjanju izobraževalnih iger. Žanr iger, ki se jih da ustvarjati je omejen na

pustolovske igre (adventure games). Igre se ustvarja v 2D formatu in sicer lahko izbiramo

med prvoosebnim načinom ali tretjeosebnim načinom (1st person, 3rd person).

Dobra stran je ta, da je na voljo za najbolj razširjene operacijske sisteme: Windows, Mac

OS in Linux. Ustvarjanje iger s tem programom ne zahteva nobenega znanja programiranja,

nobenega znanja programskega jezika, le malce logičnega povezovanja in razmišljanja. To

velja za del ustvarjanja igre, kjer se srečamo z omejitvenimi pogoji oz. pogoji, kdaj je nekaj

vidno/nevidno. Več o tem bo opisano v nadaljevanju.

1.2 Stvari, ki jih ponuja

Glavne stvari, ki so pomembne za ustvarjanje igre so opisane v nadaljevanju, opis ostalih pa se

najde v njihovi dokumentaciji (dostopno na: http://e-adventure.e-ucm.es/tutorial/).

Chapters so poglavja, ker celotno igro razdelimo na več manjših poglavij. Vsako poglavje si

lahko predstavljamo kot mini igro, ki jo posebej izdelujemo in na koncu povežemo v prvotno,

celotno igro.

Scenes, Cut-Scenes so scene, del igre, kjer se ta odvija, poteka interakcija med igralcem in

okoljem, med seboj pa jih povežemo z uporabo izhodov (Exits). Animacija se lahko vstavi

kot video animacijo ali kot zaporedje slik, ki jih prikazuje v določenem časovnem razmiku.

Glede na to, da v igri ponavadi pričakujemo tudi glasbo, je vredno omeniti, da eAdventure

sprejema zvočne zapise oblike .mp3.

Predmete (Items) lahko dodajamo kot sliko in ji odstranimo ozadje, drugače povedano, lahko

ozadje slike naredimo nevidno oz. prozorno.

Stvarem lahko dodajamo akcije oz. interakcije na uporabnikovo zahtevo. Te akcije so:

Examine (preglej), Grab (primi), Use (uporabi), Drag to (povleci (do)) in druge.

1

Page 17: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slednja med temi akcijami je zelo uporabna pri ustvarjanju izobraževalnih iger, ker nam

pomaga ustvariti metodo drag&drop.

Characters je poimenovanje za karakterje, s katereimi lahko igralec govori s pomočjo dolo-

čenega principa, ki bo podan v nadaljevanju tega razdelka. V angleščini so znani bolj pod

kratico NPC (Non Player Characters), torej "neigralski karakterji". Dodaja se jim lahko

animacije, drugega pa se z njimi ne da početi. So le nekakšen dodatek za usmerjanje igre in

interakcije z igralcem.

Pogovori (Conversations), se uporabljajo za 3 stvari: vodenje igralca, ocenjevanje igralca

in podajanje informacij igralcu. Pogovori imajo strukturo grafa (vozlišča in povezave med

njimi), celoten pogovor pa poteka linearno. Dodaja se lahko tudi knjige (Books).

Kot napredne možnosti (advanced features) avotrji navajo več različnih stvari, ki so upo-

rabne, ko želimo igro narediti naprednejšo, jo omejiti v določenih trenutkih in jo povezati

med seboj po naših željah. Vse naše želje pa žal ne bodo realizirane.

Pogoji in efekti (Conditions and effects), se uporabljajo za upravlanje poteka zgodbe

naše igre. Upravljamo jo z zastavicami (Flags) in spremenljivkami (Variables). Zastavice

delujejo kot stikala, pri katerih ločimo stanji, ko je zastavica aktivna oz. neaktivna (active,

inactive). Torej gre za Boolovo vrednost.

Spremenljivke se uporabljajo kot deli pogojev, ki so manjše, večje ali je enako. Po privzetih

nastavitvah so nastavljene na 0, njihove vrednosti pa ne morejo zavzeti negativnih števil.

Upravlajmo jih tako, da povemo, za koliko se bo povečala ali pomanjšala. Spremenljivke

nam pomagajo pri definiranju pogojev s pomočjo primerjanja (<, >, =, <=, >=). Imamo

tudi možnosti uporabe globalne spremenljivke, ki nam je potem na voljo v celotni igri, se

pravi skozi vsa naša poglavja.

S pomočjo pogojev lahko naredimo nekaj uporabnih stvari. Uporabljamo jih lahko pri pogo-

vorih, upravljamo obnašaje izhoda (bo na voljo ali ne), za prikaz, skritje določenega elementa,

postavitev ovir, ...

Premikanje igralca se upravlja na dva načina. Brez dodatnih nastavljanj in spreminjanj

osnovnih nastavitev, se lahko igralca premika po v naprej določeni poti (trajectory) ali

z nastavitvijo začetne pozicije v sceni (initial position) ter prosto premikanje s klikom

2

Page 18: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

miške.

Z ovirami in aktivnimi površinami scene (barriers, active areas), preprečimo igralcu do-

stop do nekega mesta na sceni oz. označimo mesto, kjer se bo ob kliku nanj nekaj zgodilo

(interakcija s tem področjem).

1.3 Slabosti

Kljub temu, da je program eAdventure primeren za izdelavo izobraževalnih iger, pa najdemo

kar nekaj stvari, ki nam onemogočijo izdelavo bolj dodelane igre.

Kot prva stvar, ki jo opazimo, da se igre da narediti le v 2D, kar je sicer dobro, grafično igra

ni zahtevna, 3D pa bi lahko le otežil delo za ustvarjalce iger. 3D efekte lahko do neke mere

nadomestimo s pravilno uporabo grafičnih elementov, kot so elementi senčenja...

Za eno izmed stvari, ki nam najbolj manjka ob ustvarjanju iger je funkcija random, kot jo

poznamo iz drugih programskih jezikov, ki nam naključno vrne neko število. To pomeni,

da direktno ne moremo narediti igre, kjer bi se pri neki nalogi odločili za nekaj, kar bi radi

naključno generirali. To največjo oviro predstavlja pri igrah, ki bi rade preizkušale računsko

znanje učencev, ter raznolikost števil pri takih tipih nalog.

Če nekdo ustvarja igro, kjer mora v pogoje in zmanjševanje spremenljivk vključiti nega-

tivna števila se tu zatakne. Vrednosti spremenljivke so definirane samo za pozitivna števila,

vključno s številom 0. Tudi če zmanjšujemo vrednost spremenljivke, se da le to znižati samo

do 0.

Kot največji problem pa je za moje mnenje odsotnost funkcije programiranja. Programiranja

v smislu tega, da lahko sami napišemo skripto, jo dodamo igralcu, predmetu ali okolju. Glede

na to, da je igra v zaključku kot celota Java projekt, bi se lahko to možnost vključilo, pa

če tudi samo za programiranje v jeziku Java. S tem bi se odprla nova dimenzija za izdelavo

iger, ter omogočilo veliko novih stvari, ki bi jih lahko naredili, poleg zgoraj naštetih.

3

Page 19: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

2 Programski jezik C#

2.1 Predstavitev jezika

C# je objektno orientiran programski jezik. Prvič se pojavi leta 2000, od takrat pa je dobil

kar nekaj nadgradenj. Razvilo ga je podjetje Microsoft, ter ga vseskozi razvija in nadgrajuje.

Za razvoj je odgovorna ekipa pod vodstvom Andersa Hejlsberga.

Sodi v družino C programskih jezikov. Glavni cilj je, da bi bil sodoben, preprost programski

jezik za objektno programiranje. Kot zanimivost, ime je sestavljeno iz glasbene lastnosti

višaja (#), ki pomeni zvišanje tona, kot naj bi ta jezik predstavljal "višji, naprednejši"

jezik, kot je C++.

(vir:https://en.wikipedia.org/wiki/C_sharp_(programing_language))

2.2 Predstavitev osnovnih stvari

V tem razdelku je privzeto, da znanje programiranja bralec že ima, zato gre tu za osnoven

opis funkcij in predvsem sintakso jezika. Poudarek je na stvareh, ki so pomembne za ustvar-

janje igre v okolju Unity in ustvarjanju skript v jeziku C#.

C# je občutljiv na velike/male črke, zato si je dobro izbrati način, kako bomo zapisovali

spremenljivke, razred, funkcij, ter imena programov in se tega držati skozi celotno delo (kot

je to priporočljivo za vsako programiranje). Telo zank in pogojev pišemo znotraj zavitih

oklepajev ({}), izjave in izrazi pa se končajo s podpičjem (;).

Če želimo dodati kakšen komentar in ga ne upoštevati ob izvajanju kode, to naredimo z upo-

rabo //, ki ponazarja enovrstične komentarje, z /* */ pa lahko pišemo daljše, večvrstične

komentarje.

V C# so spremenljivke razdeljene v naslednje podatkovne tipe: vrednostn, referenčni in

kazalni tip.

4

Page 20: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

2.2.1 Vrednostne spremelnjivke

V programskem jeziku C# je več kot 10 vrednostnih spremenljivk, ki so vsaka zase unikatna.

Za začetno delo pa so dovolj spremenljivke, ki so podane v spodnji tabeli.

TIP OPIS

bool Logična vrednost true ali false

int Predstavlja 32-bitno celo število

float Število z enim decimalnim mestom (zapis npr. x = 4.5f)

2.2.2 Nizi (String)

Z nizi (stringi) zapisujemo črke, besede, stavke oz. besedila.

Sintaksa:

Najprej je potrebno deklarirati, za kakšen tip spremenljivke gre (string), nato določiti ime

spremenljivke in ji prirediti vrednost, tako da besedilo zapišemo znotraj narekovajev.

Primer: string Ime = "Kevin";

2.2.3 Definiranje in incializiranje spremenljivk

Pri deklariranju spremenljivk v jeziku C# je obvezno, da jim na začetku določimo podatkovni

tip. Podatkovni tip spremenljivke lahko med izvajanjem programa spremenimo, saj ima C#

vključene funkcije, ki znajo pretvarjati med kompatibilnimi tipi.

2.2.4 Operatorji

Aritmetični operatorji so operatorji za osnovne računske operacije (+, -, *, / ), deljenje

po modulu oz. računanje ostanka pri deljenju s številom, ter posebna znaka, ki pomenita

povečanje celega števila za 1 (++) in zmanjšanje celega števila za 1 (--).

Relacijski operatorji so operatorji, ki opisujejo razmerje med vrednostima dveh spremen-

ljivk. Ti so definirani kot pri večini ostalih programskih jezikov (npr. , ==, !=, >, <...)

Logični operatorji so operatorji, ki operirajo kot logični vezniki med različnimi logičnimi

5

Page 21: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

izjavami. Logični in je predstavljen z znakom &&, logični ali pa je predstavljen z dvema

navpičnima črtama ||. Negacija nečesa (logični ne), se označi s (!) pred spremenljivko tipa

boolean.

2.2.5 Pogojni stavki in zanke

Glede na to, da so to stavki, ki jih pri programiranju vedno potrebujemo, je potrebno ome-

niti, da so v konceptu ti stavki podobno definirani kot pri ostalih jezikih. Drugačna je le

sintaksa, ki je vidna na spodnjih slikah.

Slika 1: Sintaksa if stavka.

Slika 2: Sintaksa if-else stavka.

6

Page 22: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slika 3: Sintaksa while in for zanke.

2.3 Povezava v Unity

Unity ima možnost programiranja skript v treh jezikih. To so C#, Java in Boo (programski

jezik, ki ima podobno sintakso kot Python).

V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki je tudi bolj

uporabljen kot pa Java in Boo.

Za pisanje skript lahko uporabljamo zunanji program, kot je Microsoftov Visual Studio ali

pa že vgrajeni program okolja Unity, ki se imenuje MonoDeveloop.

7

Page 23: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3 Uvod v Unity

3.1 Uvod

Vsi elemnti igre (slike, zvoki, skripte, animacije, ipd.) se nahajajo v mapi Assets. Mapa se

samodejno ustvari, ko naredimo nov projekt. Zaradi preglednosti, urejenosti in boljše organi-

zacije v njej ustvarimo še podmape: Sprites (za objekte s sliko), Sounds (zvoke), Animations

(animacije), Scripts (za skripte) in Prefabs (za razrede objektov), kamor shranjujemo ustre-

zne gradnike igre.

Uporabniški vmesnik okolja Unity sestavljajo naslednja okna:

• Project - prikaže vsebino mape Assets,

• Hierarchy - prikaže seznam objektov trenutne scene, poleg tega pa tudi razmerja child

- parent med objekti,

• Scene - v tem oknu je vidna scena, prikažejo se objekti, ki so v Hierarchy,

• Console - izpisujejo se obvestila programa Unity in sporočila, ki jih prikazujemo preko

skript (ukaz Debug.Log),

• Inspector - okno, v katerem se prokazujejo komponente objekta, ki jih lahko nato

spreminjamo, brišemo ali ustvarjamo nove (npr. Transform, RigidBody...).

3.2 Razlaga nekaterih pojmov

3.2.1 Nadzorovanje dela

V oknu Console se ob zagonu projekta izpišejo morebitne napake, sporočila, ki so ključna za

delovanje igre. Tako lahko s pomočjo tega okna sproti preverjamo, če se kje pojavi napaka,

kdaj kaj deluje in kdaj ne. Zato je zelo koristna stvar za preverjanje funkcija Debug.Log().

Ta funkcija v oknu Console izpiše to, kar ima zapisano v navednicah v oklepaju.

8

Page 24: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3.2.2 Uporaba Namespace-ov

Namespace-i so široko uporabljeni v programskem jeziku C#. To so elementi programskega

jezika C#, ki so narejeni z namenom, da je program (skripta) organizirana. Nekateri se že

privzeto uporabijo v vsaki skripti, ki je ustvarjena, sicer pa jih je potrebno uvoziti.

Taki so recimo UI, EventSystems in drugi. Uvozi se jih z uporabo besede using na začetku

skripte in nato ime, kakršnega ima.

Primer : using UnityEngine.UI;.

3.2.3 Komponente objekta

Komponente objekta GameObject-a, so lastnosti, ki jih ta objekt ima. Med primeri je dobro

omeniti trkalnike (Colliders), skripte, transformacijo (Transform) in druge. Te se najde s

klikom na objekt, izpišejo pa se v oknu Inspector. 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 oknu Inspector), bolj elegantno in uporabno pa

se do njih dostopa v skripti in se jih preko skripte tudi spreminja.

Slaba stran ročnega spreminjanja je, da je zamudno in ponavadi zaradi velikega števila kom-

ponent ta način ni uporaben. Zato se jih, kot že omenjeno, elegantneje spreminja s pomočjo

skripte.

Ukaz oz. funkcija, ki to omogoči je GetComponent<>();.

Sintaksa: Komponenta izbrano_ime = GetComponent<Komponenta>();

(opomba: Komponenta pomeni ime komponente, ki je določeno v programu Unity, npr.

Rigidbody2D, Transform...)

3.2.4 Metoda Start()

Je metoda, ki se odvije samo enkrat ob zagonu in nikoli več. Izvede se pred vsemi metodami

Update().

Uporablja se predvsem za inicializacijo spremenljivk in povezav do drugih stvari (npr. refe-

renc do komponent).

9

Page 25: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3.2.5 Metoda Update()

Metoda, ki se odvije vsako sličico (frame), vsakič, ko se slika posodobi. Najpogosteje se

uporablja za implementiranje obnašanja igre (premikanje, preverjanja pogojev...)

3.2.6 Metoda FixedUpdate()

Metodo je dobro uporabiti, če gre za spreminjanje in upravljanje s komponento RigidBody2D,

ko se ukvarjamo s fiziko telesa.

3.2.7 Metoda LateUpdate()

Metoda, ki se izvede za vsemi Update metodami. Uporablja se za upravljanje kamere, ki

sledi igralcu. Ta mora slediti igralcu, ki se je morda v funkciji Update() premaknil.

3.3 Ena ideja organizacije okolja

Razporeditev, ki je spodaj opisana je subjektivne narave in ni nujno, da bo bralcu ustrezala,

je le eden izmed možnih načinov, kako si urediti okna, za lažje in bolj učinkovito delo.

Že takoj po nekaj delovnih minutah in poskušanju, kaj program zmore se opazi, da so neka-

tera okna bolj uporabljena kot druga.

Slika 4: Zaslon po privzetih nastavitvah.

Glede na to, da si postavljamo okolje, ki bo nam primerno, je dobro nekaj osnovnih dej-

stev vedeti o določenih razdelkih, ki se nam pojavijo na zaslonu.

10

Page 26: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Hierarchy je razdelek, v katerem se nahaja seznam vseh elemntov, ki bodo potem nastopali

v naši igri. Te elemente določimo mi. Po privzetih nastavitvah je v tem razdelku sprva samo

ime scene in Main Camera, ki sodi v sceno. Struktura je lepo tudi vizualno urejena, saj je

očitno vidno, kateri deli, ki jih imamo v igri spadajo kam.

Project razdelek nam pokaže stvari, ki se nahajajo v naši mapi, kamor shranjujemo projekt.

V ta del lahko dodajamo stvari, ki jih potrebujemo za delo. Druga možnost je, da jih doda-

jamo v mapo, kjer je shranjen naš projekt, vendar je to bistveno lažje.

Scene je del okna, kjer stvari, ki smo jih prej dodali sestavljamo skupaj. Tu vidimo dejansko

podobo in izgled, kako vse skupaj izgleda. Stvari lahko premikamo, vlečemo, rotiramo itd..

Game se nam pokaže, ko zaženemo igro in jo lahko preizkusimo.

Inspector pa je najpomembnejši del programa Unity, saj v tem razdelku urejamo skoraj vse

kar se dogaja v igri. Elementom določamo pozicije, jim dodajamo komponente, značilnosti,

ki želimo, da jih imajo.

Glede na pomembnost elementov je priporočena razporeditev oken sledeča.

Skrajno desno je najbolje nameniti prostor razdelku Inspector, ki se raztegne čez celotno

višino, poleg njega na levi združeni razdelki Scene, Game, Animator v tem zaporedju. Po-

novno je najbolje raztegniti ga čez celotno višino ekrana, da imamo večji pregled nad igro.

Inspector je del, kjer stvarem dodajamo razne komponente, spreminjamo njihove lastnosti,

dodajamo skripte, zato je res vredno imeti dober pregled nad tem delom. Preostali prosotor

na levi razdelimo na dva "kvadrata", kjer se zgoraj levo nahaja razdelek Hierarchy, pod njim

pa Project in Console. Project si potem še razdelimo tako, da se jasno vidijo mape, kjer

imamo stvari za lažje iskanje.

Pomembno pa je, da si okna glede na način dela prilagodimo in naredimo tako, da je čim

bolj viden tisti del, ki je za nas pomemben (Animator, Scene, Game, Console,...).

11

Page 27: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slika 5: Subjektivna organizacija oken.

3.4 Dodajanje zvoka

Zvok, ki bi ga v igri radi predvajali v ozadju dodamo tako, da kliknemo na GameObject

→ Audio → Audio Source. V oknu Hierarchy se pojavi nov objekt tipa GameObject preko

katerega lahko nastavljamo lastnosti zvoka.

3.5 Igralec (Player)

Igralec je v igri sestavljen iz veliko stvari, ki ga naredijo kompletnega, ter privlačnega za

igranje.

Ena izmed glavnih stvari, ki naredijo igralca privlačnega za igranje so animacije. Animacija

je niz sličic, ki se z določeno hitrostjo zaporedno priakzujejo, kar nam daje občutek gibanja.

V igrah imamo ponavadi veliko animacij (za glavni lik, NPC-je, animirani elementi ozadja...),

prav tako pa je običajno, da ima en objekt veliko različnih animacij, ki se zamenjujejo glede

na dogajanje v igri.

Glavni igralec lahko npr.: hodi, teče, skače, govori, ipd.. Narediti dobro animacijo je zah-

tevno, zato si običajno pomagamo s t.i. Sprite Sheet-i - slikami, na katerih so manjše sličice

za različne animacije. Tako imamo na isti sliki sličice, ki sestavljajo animacijo za hojo, tek,

skoke...

12

Page 28: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slika 6: Primer Sprite Sheet-a.

Na sliki vidimo primer Sprite Sheet-a. Včasih je bilo rezanje takih slik časovno zelo

potratno, saj je bilo potrebno narediti to vse na roke, danes pa obstajajo programi, ki to na-

redijo sami. Za rezanje sličic lahko uporabimo zunanji program, bolj priročno pa je uporabiti

orodje, ki je vključeno v Unity.

Kako se tega lotimo? Ko kliknemo na sliko v mapi, se nam v Inspector-ju pojavijo njene

lastnosti. Če želimo doseči, da bo Unity razumel, da je slika sestavljena iz več manjših sličic,

moramo privzeto lastnost Sprite Mode iz vrednosti Single (predstavlja eno sliko), spreme-

niti v Multiple. Preko Inspector-ja nato zaženemo Sprite Editor, kjer lahko Sprite Sheet

uredimo na dva načina:

• Avtomatsko

Program, z uporabo vgrajenega algoritma avtomatsko prepozna in razreže Sprite Sheet

v mrežo posameznih sličic.

• Ročno

Če z avtomatskim razrezom nismo bili zadovoljni, kar se redko zgodi, pa lahko to

naredimo ročno.

Ni odveč poudariti, da nam ročni proces razreza običajno vzame veliko časa.

Tu sta dve možnosti, ki nista na voljo v avtomatskem načinu in sicer Grid by Cell

Size oz. Grid by Cell Count, s pomočjo katerih določimo velikost delčka slike oz.

kako naj to sliko obreže.

Ko z delom zaključimo, se ob sliki, ki smo jo uredili, pojavijo njeni razrezi.

13

Page 29: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3.6 Animacija

Unity vsebuje veliko uporabnih orodij, eno od njih je orodje za ustvarjanje animacij. Ani-

macije so v igrah zelo pomemben del, saj se z njimi naredi igro bolj privlačno za igranje.

Sploh ko gre za gibanje igralca oz. drugih računalniško vodenih likov v igri (NPC-jev), torej

animacij hoje, teka, skakanja...

Animacija je sestavljena iz več slik, ki se v nekem zaporedju prikazujejo. Več kot je v ani-

maciji sličic, bolj se nam zdi realna in kvalitetna.

Animacija ponavadi vsebuje neko začetno animacijo, npr. ko lik stoji. Novo animacijo je

enostavno narediti, postopek poteka tako, da najprej označimo slike, ki bodo v animaciji

in jih povlečemo v okno Scene. Unity bo sam prepoznal, kaj želimo in bo ustvaril novo

animacijo, ki ji moramo nato določiti ime in jo shraniti v posebno mapo. Poleg animacije pa

bo avtomatsko dodal še komponento, ki skrbi za nastavitve animacij - Animator.

Ob kliku na okno Animator se pokaže graf, ki prikazuje prehode med stanji (vsako stanje

pomeni animacijo). Ta stanja so podana v obliki pravokotnikov. Ob dodajanju animacij se

v graf dodajajo nova stanja.

Prvo stanje v grafu je Idle. Ta je iz stanja Entry povezan z enosmerno puščico, kar po-

meni, da se bo ob zagonu igre (Entry) izvedla ta animacija. Ob pogledu na graf opazimo,

da je stanje Idle obarvano oranžno, ostala stanja pa s sivo. Oranžo stanje pomeni, da je to

privzeto stanje (Default State). Če želimo privzeto stanje spremeniti, moramo klikniti na

želeno stanje z desnim klikom in izbrati možnost Set as Layer Default State. Začetno

stanje je lahko samo eno.

Prehodi med animacijami so grafično prikazani s pomočjo usmerjenih puščic. Puščica tako

pokaže možna stanja v katera se lahko premaknemo iz trenutnega stanja. Prehode dodamo z

desnim klikom in izbiro Make Transition. Lastnosti prehoda si lahko ogledamo s klikom na

puščico, ki označuje prehod. Pomembna lastnost, ki vpliva na potek animacije in se določa na

prehodih (na puščicah), je Has Exit Time. Če je ta možnost označena, bo animacija imela

prehod z zakasnitvijo. To je uporabno pri 3D igrah, kjer se lik ne pramakne takoj ob kliku,

ampak potrebuje nekaj časa, da začne hoditii. To naredi premikanje realistično. Protiprimer

tega pa je igra Super Mario, kjer morata Mario ali Luigi skočiti natačno v tistem trenutku,

ko je pritisnjena tipka za skok.

14

Page 30: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slika 7: Primer grafa v Animator-ju.

V oknu Animator se nastavlja parametre. V okolju Unity je sistem tak, da najprej

določimo spremenljivke, od vrednosti teh spremenljivk pa je odvisno, katero animacijo bo

predvajal.

Nastaviti je možno različne vrste spremenljivk (Bool, Intiger, Trigger in Float). Ti pogoji

bodo s pomočjo skripte vplivali na to, kdaj se bo določena animacija odvila.

Kot primer je ta, da imamo dve animaciji. Prva je animacija Idle, druga pa animacija teka.

Ustvarimo parameter hitrost (tipa Intiger). Nato v skripti sprogramiramo, da, ko je hitrost

lika enaka 0, predvajamo animacijo Idle, sicer pa animacijo hoje.

V skripti sta uporabljeni samo metodi Start() in Update().

V metodi Update() skripta preverja, če je pritisnjena določena tipka in spremenila vrednost

parametra, ki smo ga ustvarili v oknu Animator in s tem določi, katera animacija se bo odvila.

Ko pa bo tipka dvignjena, se bo vrednost vrnila na začetno, ter s tem zagnala animacijo Idle.

3.7 Trkalniki (Colliders)

Trkalniki (angl. Colliders) so komponenta, ki jo lahko določimo objektu, da zaznava trke,

klike in dotike. Trkalniki so del knjižnice fizike (Physics). So nevidni, torej se jih ob igranju

ne vidi, so pa pomembna komponenta za bolj realistično igro. Po obliki se jih da prilagajati

glede na obliko objekta.

Če ustvarjamo igro v 2D grafiki, potrebujemo posebne trkalnike, ki so del knjižnice Physics2D.

V osnovi gre za isto stvar, kot v 3D grafiki, kjer je potrebno določiti del objekta, na katerem

15

Page 31: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

bo igra zaznala trk.

Obstajajo različne oblike trkalnikov, ki se med seboj razlikujejo po obliki in kompleksnosti

izračuna ali je prišlo do trka. Primer: za Polygon Collider 2D, se porabo več strojne moči,

kot pa za Box Collider 2D.

Trkalniki se med seboj lahko pokrivajo, kar pomeni, da ima lahko en objekt več trkalnikov.

3.7.1 Box Collider 2D

Trkalnik, ki je pravokotne oblilke. Ima določeno pozicijo, širino in dolžino glede na velikost

objekta.

Slika 8: Oblika Box Collider-ja.

3.7.2 Circle Collider 2D

Trkalnik, ki ima obliko kroga. Določena sta mu pozicija in njegov polmer (radij).

Slika 9: Oblika Circle Collider-ja.

16

Page 32: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3.7.3 Edge Collider 2D

Trkalnik, ki je uporaben za natančno določanje dotikov in trkov v točki, na robu... Obliko

se da spremeniti v premico ali pa eno samo točko.

Slika 10: Oblika Edge Collider-ja.

3.7.4 Polygon Collider 2D

Poligonalni trkalnik ima posebno lastnost, saj se, ko ga dodamo objektu, prilagodi njegovi

obliki, kot jo sam zazna. To pomeni, če bo objekt narejen brez ozadja, se bo ta poskušal kar

se da prilagoditi njegovi obliki.

Ustvarjalci Unity-ja pa opozarjajo, da se najbrž ne bo popolnoma prilagodil obliki, če je

objekt zahtevne oblike, če pa je dokaj nezahtevne oblike, pa se bo ta zelo dobro prilagodil

njegovi obliki (vir: https://docs.unity3d.com/Manual/CollidersOverview.html).

Slika 11: Oblika Polygon Collider-ja.

3.7.5 Capsule Collider 2D

Trkalnik v obliki kapsule (oblika nekakšne elipse). Uporaben predvsem za objekte, ki so

popačene krožne oblike.

17

Page 33: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slika 12: Oblika Capsule Collider-ja.

V 3D prostoru pa obstaja še trkalnik v obliki sfere (Sphere Collider), trkalnik v obliki

kolesa (Wheel Collider) in terenski trkalnik (Terrain Collider).

3.8 Drag&drop

Princip drag and drop srečamo v mnogih igrah, v zelo različnih situacijah, zato v orodju

Unity ne obstaja predpripravljen sistem, ki bi ga lahko samo uporabili, ampak ga moramo

po svojih željah in posebnostih uporabe ustvariti.

Unity vsebuje zelo veliko knjižnic, med njimi tudi razred EventSystems, ki sodi v knjižnico

UnityEngine, ki je uporaben pri programiranju principa drag and drop. Knjižnica vsebuje

metode, ki jih potrebujemo pri implementiranju tega principa. Njihovo sintakso lahko najde-

mov priročniku Unity Manual oz. kar direktno dopišemo imena ustreznih metod za metodo

MonoBehaviour.

Metode so tri: Za začetek vlečenja (IBeginDragHandler), med vlečenjem (IDragHandler) in

konec vlečenja (IEndDragHandler). Ko jih dodamo na konec Monobehaviour razreda, jih z

desnim klikom pod Refactor→ Implement Interface vstavimo v skripto. Ko to odklikamo, se

pokaže rumena črta, ki prikazuje, kje se bo sintaksa izpisala. S tipko enter potrdimo izbrano

pozicijo.

Še preden začnemo s pisanjem skripte, je potrebno postaviti okolje, kjer bodo objketi stali

in se premikali. Za to je potrebno ustvariti Canvas, ki si ga lahko predstavljamo kot omejen

prostor, kjer se nahajajo grafični elementi.

Canvas je del UI (User Interface-a), natančneje GUI (Graphical User Interface). Canvas

ustvarimo tako, da kliknemo na GameObject → UI → Canvas.

18

Page 34: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Zaradi boljše preglednosti in lažjega pisanja skripte je dobro ustvariti Panel. Panel je del

Canvas-a, ki ga zapolni kot nekakšno platno, ki se pokaže na zaslonu. Celoten okvir se na

začetku obarva sivo. Ta siv pravokotnik je najbolje spremeniti na željeno velikost, saj bodo

na njem objekti, ki se jih bo dalo premikati.

Nato na Panel dodajamo objekte, ki jih bomo premikali (v nadaljevanju jih bomo poime-

novali ikone). Ko ikone dodamo, jih Unity ponavadi poljubno postavi v neko točko, bodisi

eno na drugo, bodisi jih malce premeče, skratka skoraj gotovo niso urejeni, kot bi si želeli.

Uredimo jih tako, da območju, kjer se nahajajo dodamo t.i. Layout Group (Script), ki

skrbi, da so ikone urejene. Obstaja več možnosti kako jih uredi po Panel-u: če gre za gumbe

v eni vrstici, je pametno izbrati Horizontal Layout Group (Script), ki jih uredi v vrsto.

Nato se lahko odločimo, kako bodo postavljeni (od leve proti desni, v centru...), kar se določi

s pomočjo lastnosti Layout Group (Script-a, ki se imenuje Child Alignment. Na voljo je 9

možnosti.

Spacing je lastnost, ki določi razmik med ikonami, ko so urejene.

Ikonam lahko dodamo še veliko stvari, kot so npr.: besedilo (Text), slike (Image) in druge.

Ko končamo z definiranjem postavitve in izgleda ikon, jim moramo dodati skripto, preko

katere bomo lahko implementirali njihovo premikanje.

Vsaki ikoni je potrebno določiti začetni Panel, v katerem se nahaja. Za določitev si poma-

gamo s pomočjo komponente Transform.

V metodi OnBeginDrag je potrebno določiti začetnega starša (podobno kot začetna pozicija),

da bomo lahko ikono vrnili na začetno pozicijo, če je uporabnik ne bo postavil na ustrezno

mesto.

V metodi OnDrag se nato vedno znova osvežuje pozicija objekta, ko vlečemo objekt po za-

slonu.

Ko uporabnik konča z vlečenjem se sproži metoda OnEndDrag. Ob tem dogodku preverimo,

če je pozicija ikone ustrezna. V primeru, da ta ne ustreza mestu, kamor je potrebno ikono

povleči, jo vrne ne začetno pozicijo, ki je bila določena na začetku skripte.

V skripti je spremenjena lastnost objekta in sicer blockRaycasts. Na začetku premikanja je

nastavljena na false, na koncu pa na true.

Spreminjanje vrednosti blockRaycasts v tem primeru omogoči, da se ikono, ki jo vlečemo

19

Page 35: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

lahko spusti na mesto, ki je zanjo predpisano, sicer bi jo avtomatsko postavilo na začetno

mesto. Z nastavitvijo vrednosti blockRaycasts na false dovolimo, da se lahko dva objekta

prekrivata. Ko pa je ikona na pravem mestu, s spremembo vrednosti na true omogočimo, da

se ikona "pripne" na pravilno mesto.

Skripto DropZone moramo dodati vsem objektom, ki služijo kot mesta, kamor lahko ikone

povlečemo. Skripta preverja, če je to pravo mesto za objekt, ki ga je uporabnik povlekel

na to pozicijo, če ni, ga vrne na začetno mesto. Iz skripte Dragable uvozimo spremenljivko

KateraPozicija. Ta spremenljivka pove, katera pozicija je za ikono pravilna.

3.9 Premikanje igralca

3.9.1 Premikanje z miško

Objekt sledi kliku miške

Ko imamo objekt/sliko, ki naj bi se premikala po zaslonu, jo prenesemo v sceno oz. v okno

Hierarchy. Ustvarimo novo skripto s poljubnim imenom. To skripto dodamo kot komponento

temu objektu.

Skripta bo naredila to, da bo ob kliku na poljubno mesto na zaslonu objekt sledil temu kliku

ali pa se bo direktno prestavil tja (kot neke vrste teleportacija).

Katera izmed teh dveh situacij se bo zgodila, je odvisno od spremenljivke določene v skripti

in sicer MoveSpeed, ki določa, kako hitro bo objekt sledil kliku. Če je ta hitrost nastavljena

na zelo majhno vrednost, bo objekt sledil miški, dokler bo ta kliknjena (cilj doseže zelo po-

časi).

V skripti smo uporabili funkcijo Lerp vektorja Vector2, ki ima matematično ozadje in naredi

to, da se pozicija predmeta premakne za toliko kolikor določimo spremenljivko t v funkciji

Lerp, glede na razdaljo med miško in objektom. Če jo določimo na 0.5, bo vedno premaknil

objekt na polovico razdalje med objektom in pozicijo miške. Če pa MoveSpeed nastavimo na

dovolj veliko (npr. 50 ali 100), pa izgleda, kot da se objekt takoj prestavi na pozicijo, kamor

smo kliknili z miško (neke vrste teleportacija).

Premikanje objekta po zaslonu s prijemom

Unity ponuja veliko možnosti za rešitev tega problema, spodaj pa je opisana ena, ki zgleda

20

Page 36: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

dokaj zahtevna, vendar je povsem logična. Ključne ideje v rešitvi pa so lahko v pomoč za

več nadaljnih stvari.

Na začetku definiranja razreda uporabimo IBeginDragHandler, IDragHandler, IEndDragHandler.

Za uporabo teh funkcij z desnim klikom in pod Refactor→Implement interface, izpiše celotno

sintakso metode.

Ko so vse te tri metode v istem zaporedju dodane v skripto, je potrebno določiti, da gre za

objekt in mu dodamo ime. Začetno pozicijo shranimo v spremenljivko tipa Vector3.

Začetna pozicija pomaga olajšati zadevo, če so v skripto vključena tudi druga preverjanja

(npr. ali je objekt še na zaslonu).

V metodi OnBeginDrag moramo inicializirati objekt, kateremu skripta pripada ter začetno

pozicijo.

V metodi OnDrag shranimo trenutno pozicijo, na kateri se objekt, ki ga vodimo z miško,

nahaja. Ta pozicija se ves čas posodablja.

OnEndDrag je metoda, v kateri določimo, kaj se zgodi z objektom, ko se vlečenje ustavi.

3.9.2 Premikanje s tipkovnico

Pomembna razlika med programoma eAdventure in Unity je v nadzoru nad glavnim likom.

Pri eAdventure je nadzor možen zgolj preko miške, pri Unity-ju pa lahko lik nadziramo z

miško, tipkovnico, kontrolerjem oz. neko drugo vhodno napravo.

V zavihtku Edit → Project Settings → Input se v Inspector-ju odpre okno Input Manager,

kjer je možno videti privzete nastavitve za različne načine interakcije z igro. To je pomembno

vedeti zaradi dejstva, da v skripti vemo, katera tipka predstavlja katero smer, katere tipke

so njena alternativa, ipd..

Predstavili bomo postopek, s katerim dosežemo, da se objekt premika glede na uporabo smer-

nih tipk (gor, dol, levo, desno). Objekt postavimo na sceno (oz. Hierarchy) in mu dodamo

skripto. V njej ustvarimo spremenljivko MoveSpeed, preko katere bomo nastavljali hitrost

premikanja in jo v metodi Start() inicializiramo na neko poljubno vrednost.

V metodi Update() zaznavamo pritisk tipk in se odzovemo s premikom v željeno smer. Za

zaznavanje pritiska tipke uporabimo metodo Input.GetAxis z vhodnim parametrom "Hori-

zontal" oz. "Vertical", ki določa os premika. Input.GetAxis vrača vrednosti od -1 do 1, kar

21

Page 37: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

je odvisno od smeri premika (levo-desno, gor-dol) in časa, ko držimo tipko pritisnjeno. Pre-

mik pa naredimo z uporabo komponente Transform oz. njene metode Translate, ki prestavi

objekt na želeno lokacijo. Pozicijo na ekranu določa 3D vektor, zato je potrebno v 2D načinu

njegovo z koordinato nastaviti na vrednost 0f. S spremenljivko MoveSpeed nadziramo hitrost

premikanja in sicer tako, da z njo pomnožimo vrednost teh dveh koordinat.

3.10 Prehod med scenami

Za prehajanje med scenami je potrebno znotraj porjekta imeti vsaj dve sceni. Začetno in

drugo, v katero bomo naredili prehod.

Vse scene, med katerimi se prehaja, morajo biti shranjene v mapi Assets oz. v eni od njenih

podmap. Novo sceno ustvarimo z desnim klikom na mapo, v kateri imamo shranjene scene

in izbiro Create → Scene.

Prehod med scenami je lahko narejen na različne načine, odvisen pa je od izbire in poteka

igre, ki jo ustvarjamo.

3.10.1 Prehod s pomočjo gumba

Gumb, ki bo sprožil prehod na novo sceno, se ustvari pod zavihtkom GameObject → UI →

Button.

Gumbu, ki se pojavi na zaslonu, se da spreminjati napis, barvo, obliko, sliko... Med drugim

se da spreminjati tudi to, da se bo barva gumba spremenila, ki bo kazalec miške nad njim.

Besedilo, v gumbu lahko spremenimo pod menijem Button → Text.

Če želimo, da bomo s pritiskom na gumb prešli na novo sceno, pa mu moramo dodati skripto.

Skripta, ki to počne je zelo preprosta, saj le sporoči na katero sceno se mora kamera prema-

kniti. Glavna funkcija, ki jo bomo za to uporabili je Application.LoadLevel(string), ki

kot vhodni podatek dobi ime scene v obliki niza in s tem določi, kam naj se kamera prema-

kne.

Ime scene, kam se bo kamera premaknila naknadno določimo v oknu Inspector.

Skripto za premikanje kamere na izbrano sceno, moramo dodati objektu Main Camera. Če

želimo, da bo funkcija v skripti našla naše scene v igri, moramo pod zavihtkom File → Build

Settings preveriti ali so vse scene na katere lahko prehajamo v oknu Scene in Build. Sicer jih

22

Page 38: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

dodamo ročno.

Da se bo ob kliku na gumb zagnala skripta in s tem prehod na novo sceno, moramo temu

gumbu dodati funkcijo On Click(). Funkcijo dodamo komponenti Button (Script). V funk-

ciji On Click() je pomembno, da je izbran objekt, ki se menjava oz. spreminja Main Camera.

Med funkcijami, ki se mora izvesti, izberemo metodo iz skripte, ki skrbi za prehod na novo

sceno.

Ko je le ta izbrana, ob zagonu igre prehod med scenama deluje.

3.10.2 Prehajanje med scenami ob dotiku oz. trku

Pri tem prehajanju med scenami je zelo uporabna knjižnica UnityEngine.SceneManagement,

ki jo je potrebno dodati na začetku skripta. Uporablja se za nadzorovanje scen in upravljanje

z njimi. Za naše delo je uporabljen razred SceneManager, ki vsebuje funkcije nalaganja scen

z vpisom njihovih imen. Vsebuje še veliko drugih uporabnih funkcij, ki pa za nas trenutno

niso pomembne.

Prehod se v tem primeru sproži ob kliku oz. trku dveh ali več objektov. Za zaznavanje teh

dogodkov, moramo vsakemu objektu dodati komponenti: RigidBody2D in Collider (trkal-

nik). S komponento Rigidbody2D omogočimo, da objekt dobi lastnost fizičnega objekta z

maso na katerega vpliva gravitacija in zunanje sile, ki jih sprogramiramo preko skript. Če

ne želimo, da bodo objekti popadali iz zaslona, jim moramo silo gravitacije (Gravity Scale)

zmanjšati na 0. S trkalniki pa objekti dobijo zmožnost zaznavanja ali je med njimi prišlo do

trka oz. prekrivanja. Več o trkalnikih je napsano v poglavju Trkalniki.

Vsem objektom, ki bodo sprožili menjavo scene, je potrebno v komponenti trkalnika (Col-

lider), obkljukati možnost Is Trigger. Če je lastnost Is Trigger obkljukana, se trkalnik ne

obnaša kot trden objekt ampak dovoli, da drugi trkalniki potujejo skozi njega.

Metoda, ki je uporabljena je OnTriggerEnter2D (Collider2D col), ki se sproži vedno, ko

nek objekt pride v trigger (sprožilec) objekta, ki vsebuje to skripto. Nato pa z if stavkom

preverimo, če je objekt, ki je prišel v trigger ustrezen. Če je if stavek resničen, se bo izvedla

zamenjava scene.

23

Page 39: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

3.11 Kamera sledi igralcu

To je koristno takrat, ko je vidno polje manjše od celotnega ozadja ali pa je igra preprosto

narejena tako, da se igralec veliko premika okoli.

Stvar je načeloma preprosta, saj moramo doseči le, da bo pozicija kamere sledila koordinatam

igralca in zamisel zapisati v kodi. V skripti bo samo funkcija Update(), ki bo vsakič spreme-

nila pozicijo kamere glede na pozicijo igralca. Najprej je potrebno definirati spremenljivko

Transform Igralec, glede na katero se bodo koordinate kamere posodabljale. Ker gre za 2D

prostor, je koordinata z enaka kot je koordinata kamere na začetku, lahko pa jo posodablja

glede na igralca. Torej z zadnjim razmislekom je skripta uporabna tudi v 3D ustvarjanju

igre.

Skripto je potrebno dodati kot komponento kamere (ponavadi Main Camera). Če želimo,

da se bo ozadje premikalo s kamero, to preprosto dosežemo tako, da nastavimo ozadje kot

otroka (child) objekta kamere (postane njen otrok). V praksi pomeni, da se lastnosti kamere

prenesejo na njene otroke.

Na tak način se da narediti "neskončno" ozadje v igri, kot je to recimo pri igri Super Mario,

kjer se ozadje z oblaki vedno premika s kamero.

3.12 Projekt do .exe datoteke

Ko smo naredili vse scene in zaključimo projekt, kot je bilo to načrtovano ali pa se sproti

pojavi želja, da bi videli kako bo vse skupaj izgledalo kot končen program (ne le v oknu

Game), je projekt potrebno zgraditi in zaključiti.

Pod menijem File → Build Settings (bližnjica Ctrl+Shift+B) se odpre okno za dokonča-

nje/izgradnjo projekta.

24

Page 40: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

Slika 13: Okno Build Settings.

Najpomembnejša in glavna stvar tu je, da se v delu Scenes in Build nahajajo vse scene,

za katere želimo, da so v igri, saj jih drugače ne bo vključil.

Poleg vsake scene se nahaja številka. Začetno sceno se določi tako, da se jo postavi najbišje

v seznamu vseh scen. Lahko bi to naredili s pomočjo skripte, vendar je tako enostavneje.

Začetna scena ima številko 0.

V delu Platform je potrebno izbrati, za katero napravo/operacijski sistem je igra namenjena.

Ta stvar se sicer že od samega začetka upošteva, ko se začne sestavljati igro. To pa zato, ker

je poimenovanje tipk in določanje stvari drugačno za npr. PC, Xbox in sploh za zaslone na

dotik.

Ko so te stvari izbrane, je potrebno s klikom na gumb Build shraniti igro kot .exe datoteko.

25

Page 41: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

4 Seznam priloženih skript

• PlayerManager.cs

• Draggable.cs

• DropZone.cs

• Sledenje_Kamere.cs

• Gumb_Prehod.cs

• Menjava_Trigger.cs

• Premikanje_Z_Misko.cs

• Sledenje_Miski.cs

• Premikanje_S_Tipkami.cs

• Trigger_Scene.cs

26

Page 42: PROGRAMIRANJEIZOBRAŽEVALNIH IGERVPROGRAMUUNITYpefprints.pef.uni-lj.si/4779/1/Celotna_Diploma_DB.pdf · V tej diplomski nalogi se bom osredotočil na programiranje v jeziku C#, ki

5 Viri

SCOLASTICI, Claudio. 2015. Unity 2D Game Development Cookbook. Velika Britanija:

Packt Publishing Ltd. ISBN 978-1-78355-359-4.

DOYLE, Barbara. 2014. C# Programming: From Problem Analysis to Program Design.

ZDA: Cengage Learning. ISBN: 978-1-285-09626-1.

The <e-Adventure> platform: User’s Guide [online]. Madrid: april, 2011. Dostopno na sple-

tnem naslovu: <http://e-adventure.e-ucm.es/tutorial/files_EN/eAdventure-v1.3RC-2-User_s-

guide-en_EN.pdf>.

2D Game Creation: Everything you need to start making 2D games in Unity [online]. 2017.

Unity – Game Engine. [Citirano: 11. feb. 2017; 10:15]. Dostopno na spletnem naslovu:

<https://unity3d.com/learn/tutorials/topics/2d-game-creation>.

27