În lucrarea de fa ță se abordează domeniul jocurilor, mai exact, subdomeniul jocurilor pe [627392]
1
Introducere
În lucrarea de fa ță se abordează domeniul jocurilor, mai exact, subdomeniul jocurilor pe
smartphone -uri (telefone inteligente).
Principalul obiectiv al proiectului este realizarea unui joc arcade pe telefonul mobil de tip
“endless game” (jo c fără sfârșit ), care se folose ște de giroscopul telefonului pentru mi șcare.
Platforma aleasă pentru crearea acestui joc a fost varianta gratuită a game engine -ului Unity3D –
Personal Edition.
Sistem de operare am ales Android -ul datorită popularită ții atât în rândul jocurilor, cât și a
aplicaților. Datorită flexibilită ții oferită de Unity jocul se poate u șor implementa și pe celelalte
sisteme de operare mobile , cât și sisteme pe Windows / Mac /Unix .
Am ales această lucrare datorită pasiunii pentru jocuri le video, încă de mic, când acestea
existau pe console. Această pasiune a crescut în timp și s-a transformat în curiozitate.
Curiozitatea de a cerceta modul de creare al unui joc, mai ales că acum am cuno științele necesare
pentru a implementa o astfel de a plicație.
2
Capitolul 1: Analiza stadiului actual în domeniul problemei
1.1 Evoluția jocurilor
Au trecut peste 70 de ani de la apari ția primului joc, o simulare de rachete pe un tub catodic,
creat de către Thomas T.Goldsmith Jr. și de Estle Ray Mann. Puțin mai târziu în 1952, o versiune a
jocului X și 0, numită “Noughts and Crosses” a fost creat ca parte a diserta ției de doctorat la
Universitatea din Cambridge de către Alexander. S. Douglas, fiind o ilustrare despre interac țiunea om –
computer.
În 19 58 William Higinbotham a creat “Tennis for
Two” în laboratoarele na ționale din Brookhaven
(Upton – New York). Jocul “SpaceWar” a fost
finalizat în 1962 de către Steve “Slug” Russel,
fiind ajutat de Martin "Shag" Graetz și Wayne
Wiitanen. “SpaceWar” (Figura 1) este considerat
de c ătre speciali ști ca și primul joc realizat pe
calculator, totodată, printre cele mai importante
realizate vreodată. Acesta rula pe DEC PDP -1
(Digital Equipment Corporation). [1]
Figura 1. Primul joc pe calculator SpaceWar [1]
Una dintre personalită țile cele mai importante în
geneza jocurilor video o reprezintă Ralph Baer
(1922 – 2014) cunoscut astăzi ca și “Părintele
jocurilor Video ”, datorită contribu ților aduse
jocurilor, dar și industriei acesteia. În 1967 a creat
un joc d e ping -pong care semăna cu “Tennis for
Two” și cu viitorul joc arcade Pong. În colaborare
cu Magnavox a realizat în 1972 prima consolă de
jocuri video, numită Magnavox Odyssey (Figura
2). [2] Meritul pentru această realizare a fost recunoscut (mai t ârziu, mai exact) în 2006, unde a
primit „Medalia Na țională pentru Tehnologie”.
Figura 2. Prima consolă de jocuri Magnavox
Odyssey [2]
3
Dezvoltarea jocurilor de tip arcade a avut loc in
jurul anilor ’70. Datorită u șurinței utilizării, au
crescut în popular itate rapid, ceea ce a dus la
perioada de aproximativ un deceniu numită și
“epoca de aur a jocurilor Arcade”. “Computer
Space” creat de Nolan Bushnell și Ted Dabney în
1971, este primul joc arcade coin -operated
(funcționează cu bani) (Figura 3) [3]
Jocuril e încep sa crească din ce în ce mai mult în
popularitate.
Evoluția acestora pe cele 3 platforme : consol ă,
calculator (PC) și arcade, începe să se dezvolte în
paralel, mai puțin pentru partea de arcade, unde
epoca de aur din anii 1978 -1986 reprezint ă
apoge ul maxim atins vreodată. Deși arcade există
și în ziua de azi, aceasta nu va mai cunoaște o
astfel de faimă.
Figura 3. Primul joc arcade Computer Space [3])
Figura 4. O versiune cu grafică a jocului
Adventure [4]
La finalul primei genera ții de co nsole ( 1972 –
1977) a fost creat jocul pe calculator “Adventure”
de către Will CrowTher (Figura 4) [4].
Jocul este de tip text -aventură, fiind foarte
populare în această perioadă. Aproape de anii ’80
calculatoarele personale erau suficient de
puternice încât să ruleze acest joc, dar ca și astăzi,
evoluția grafică era în cre ștere, iar pe pia ță încep
sa apară alte jocuri mai bune din acest punct de
vedere. ”Pool of Radiance” ori “Bard’s Tale” sunt
jocuri care apar țin de colec ția ”SSI Gold Box”, și printre pr imele care încep să facă asocierea între comenzile
date textului cu partea grafică .
4
Pentru primele console, codul mașină jocuri se făcea cu ajutorul logic ii discrete și era codat direct în
microcipuri, prin urmare alte jocuri nu puteau fi rulate. Prin anii 1970 jocurile au început să fie distribuite și
cu ajutorul casetelor. Programele lor erau stocate pe chip -uri ROM. Chip -urile erau montate foarte u șor în
casete de plastic, care puteau fi introduse în sloturile de pe console. Odată introduse, microprocesoarele din
console citeau din memoria ca setei apoi rulau programul stocat. După o perioadă de aproximativ 20 de ani,
aceste casete în variante mai noi, apar și în Romania.
Popularul joc “Space Invaders” este dezvoltat de către Tomoh iro Nishikado în anul 1978. Compania
Taito a preluat acest joc și l-a lansat mai întâi în Japonia.
Un alt joc foarte cunoscut este “Pac-man”, apărut pentru prima oară în anul 1979 -1980, de către
compania Namco. Acesta apare mai tărziu în 1982 pe Atari 80 0,rulând pe computer personal.
Probabil cel mai celebru joc, “Mario Bros” a apărut în anul 1983. De și personajul Mario apare prima
oară în anul 1981 în jocul “Donkey Kong”, în acest joc care îi poartă și numele se face cunoscut și fratele său
Luigi, frate le mai mic al lui Mario.
În 1981 “Centipede” a fost primul joc arcade realizat de o femei e numită Dona Bailey în asociere cu
Ed Logg. Scopul jocului era ca jucătorul să omoare centipede ce încercau să coboare din partea de sus a
ecranului.
Anii 1977 -1983 , reprezintă a doua genera ție de console, era fiind reprezentată de pia ța companiilor ce
oferă console. La finalul acestei perioade, datorită numeroaselor companii care încearcă să intre pe pia ță, cu
jocuri la un nivel calitativ foarte scăzut, în anul 1983 are loc o scădere bruscă a popularită ții jocurilor numită
și “video game crash of 1983”.
În ciuda crizei jocurilor, aceasta s -a limitat la nivelul pie ței consolelor. În timp ce aceasta scade,
calculatoarele personale se ridică în popularitate, datorită modelelor precum “Commodore 64”, fiind la un
preț rezonabil și în format color.
Tot în această perioadă, apar și primele jocuri online pe calculator. Jocul “Snipes” dezvoltat de
SuperSet Software în 1983, împreună cu “Maze War” din 1974 Și “Spasim” tot di n 1974, sunt considerate a
sta la baza jocurilor din domeniul online.
A treia genera ție de console începe în anul 1985 o dată cu apari ția celebrului joc “Tetris”, jucat și în zilele
noastre, de către persoane de toate vârstele. Faimosul joc a fost creat în Iunie de către Alexei Pajitnov.
Numele Tetris provine din grecescul tetra , pentru a face referire că toate piesele sunt formate din patru
pătrățele, și tenis, care era jocul preferat al creatorului.
Această genera ție se încheie în anul 1989, an în ca re Nintendo lansează Game Boy, prima consolă
portabilă, fiind foarte potrivită pentru încorporarea jocului Tetris, având vânzări de top .
5
.
Figura 5 . Prima consolă portabilă Game boy [5 ])
Deși au apărut și alte console portabile până la
mijlocul anil or ’90, Game boy a rămas în topul
vânzarilor de -a lungul vie ții sale.
În timp ce tehnologia calculatoarelor era în
evoluție,
Celebra franciză de jocuri “Mortal
Kombat” își are debutul în anul 1992, în timpul
generației a patra de console (1987 -1996). Ace sta
a fost lansat pe SNES, sistem care s -a dovedit a fi
un rival foarte puternic încă de la apari ția lui în
1991.
În anul 1994 a apărut pentru prima dată un joc pe un telefon mobil. Tetris putea fi jucabil de pe un Hagenuk
MT-2000.
Deși primul joc a fos t o versiune de Tetris, startul pentru jocurile pe telefoane, a fost dat de lansarea
jocului Snake de către Nokia în 1997 (Figura 6) . Acesta urmând să fie preinstalat în toate modele Nokia
lansate. A rămas de atunci unul din jocurile cele mai jucate pe mob il, fiind găsit în mai mult de 350 de
milioane de device -uri. [5]
Figura 6 . Snake pe telefon mobil Nokia [6]
Odată cu apari ția primelor jocuri pe telefonul
mobil, genera ția a cincea de console (1994 -2002)
face tran zicția la jocurile 3D. Nu era ceva n ou,
3D-ul apăru -se de ceva timp pe calculator, c ât și
pe arcade. Se poate spune că un pionier al jocurilor
3D pe calculato r, “Elite” a apărut încă din 1984,
deși nivelul de grafică atunci era foarte scă zut.
După anul 2000 au mai existat c âteva genera ții de console. Nu se pot spune exact anii, pentru că
multe persoane au păreri diferite asupra încadrării între ani ale acestor generații, datorită evoluției consolelor
aparțin ând unei firme anume. Totuși, se consideră că generația a șasea și a șaptea au avut loc între anii 1998 –
2005, respective 2005 -2011. În acest timp apar modele de console pe mai mul ți biți, tot mai noi, cunoscute și
astăzi : PlayStation, Xbox, Nintendo, etc. Deși consolele erau specific pentru jocuri, evoluția calculatoarelor
a permis o com petiție interesantă, jocurile fiind dezvoltate într -un mod masiv încă din anii 1990 spre prezent.
6
Ne aflăm în generația a opta de console (2011 – present), nu știm c ând aceasta se va termina, dar datorită
competiției pe piață, ne putem bucura de rapiditate a cu care jocurile evoluează. [6]
1.2 Actualitatea în domeniul jocurilor pe telefoanele mobile
Domeniul jocurilor pe telefoanele mobile este foarte t ânăr. Dac ă în 1997 Nokia lansa cu succes jocul
Snake, pe device -urile lor, dezvoltarea de jocuri pe telefoan e începe mai serios după anii 2000, c ând mobilele
începeau să dețină WAP (Wireless Application Protocol). WAP -ul le permitea desc ărcarea de jocuri de la
operatori. Aceasta este lăsată la margine în 2008 o dată cu apariția “Apple App Store”. Schimbarea este una
benefic ă pentru consumatori, aceștia put ând acum descărca aplicații, direct de la sursă.
Acest domeniu a avut o evoluție cu adevărat rapidă, datorită dezvoltării tehnologiei. Dacă acum 20 de
ani, primul joc apărut era tetris în variantă alb -negru, în ziua de azi avem jocuri pe ecrane HD (High
Definition) ,chiar Ultra HD, accelerometre pentru rotirea automata a ecranului, giroscop -uri pentru mi șcarea
în spațiu, interfețe intuitive, asigurându -ne doza de adrenalină necesară, experiențele fiind cu adevăra t
distractive .
Piața jocurilor pe telefoane mobile este una vastă, datorită numeroaselor sisteme de operare existente.
Un joc există pe o anumită platformă, iar în cazul în care există și pe o altă platformă, acesta arată diferit.
Acest lucru crează comp etiția, fiind la mijloc și motivul principal de creare al unui joc, acela al dobândirii
banului, iar beneficiarul principal este consumatorul.
O listă cu cele mai importante platforme mobile:
• Android
• iOS • Windows Phone
• Altele
Capitolul 2: Elemente de programare utilizate la elaborarea aplicației
2.1 Android
Este o platformă software și un sistem de operare pentru dispozitive și telefoane mobile bazată pe
nucleul Linux. A fost dezvoltată ini țial de compania Google, dar mai târziu de consor țiul come rcial Open
Handset Alliance (OHA), acesta inclunzând 48 de companii hardware, software și de telecomunica ții, stabilit
dezvoltării de standarde deschise pentru dispozitive mobile.
Platforma Android a fost lansat ă pe 5 noiembrie 2007, iar începând cu data de 21 octombrie 2008, a
fost disponibil ca Open Source (Surs ă deschis ă -permite oricarei persoane sa dezvolte si sa îmbunat ățească
codul ,acces liber la cod/sintax ă de programare) . Acesta permite dezvoltatorilor să scrie cod gestionat în
7
limbajul Java, exi stând și posibilitatea dezvoltării scrierii aplicaților în limbajul C, sau alte limbaje, care pot
fi compilate în cod mașină ARM și executate, dar acest mod nu este sprijinit oficial de către Google.
2.2 Unity
2.2.1 Despre Unity
Unity technologies a an unțat apariția game engine -ului Unity 1 în 2005, pentru sistemul de operare
Mac OS. De atunci au mai apărut 8 versiuni, cea curentă fiind Unity 2019 , lansată pe Martie 201 9, folosit
parțial și pentru acest joc. Această versiune suportă acum peste 25 de pla tforme, printre care, cele mai
importante : Windows, OS X, Linux, Unity WebPlayer, Android, iOS, Blackberry 10, Windows Phone 10,
Playstation, Xbox, Samsung Smart TV, LG Smart TV (OS 3 )
Unity este în mare parte un “ecosistem” de dezvoltare al jocurilor vi deo, ce oferă un set complet de
unelte pentru a crea cât mai ușor conținutul necesar pentru acestea. Nu este limitat doar la dezvoltarea
jocurilor pe diferite platforme, ci poate fi folosit și la crearea unor aplicații sau programe.
Unity Technologies con turea ză piața de jocuri la nivel mondial, aflată în plină expansiune, prin
engine -ul lor Unity, care s -a ridicat în ultimii ani din ce în ce mai mult ajungând în top. Platforma lor este pe
departe software -ul cel mai folosit pentru dezvoltarea de jocuri. M ai multe jocuri sunt realizate cu Unity
decât cu orice altă tehnologie. Mai mul ți jucatori joacă jocuri realizate cu Unity, și mai mulți dezvoltatori se
bazează pe instrumentele și serviciile oferite pentru a conduce afacerea lor.
Figura 7 – Cota de piața mobila a engine -urilor de jocuri dominat ă de Unit y [7]
La nivel mondial, Unity are o cotă de piața device -urilor mobila a engine -urilor de jocuri de 45% din total,
aproape de 3 ori mai mult de cel mai apropiat competitor (Figura 7 ).
8
Tot la nivel m ondial, propor ția alegerilor dezvoltatorilor de jocuri a platformei dorite este în favoarea
Unity (Figura 8) .
Figura 8. Alegerea dezvoltatorilor de jocuri a platformei Unity [7]
Popularitatea de care are parte Unity, se datorează mediului de luc ru plăcut pe care acesta îl oferă, cât
și rezultatele obținute, datorită performanței aduse de caracteristicile acestei platforme.
O animație simplă și puternică, sistemul fiind capabil să redea caractere umane și non -umane cu
mișcări incredibil de natu rale și fluide. Grafica considerată ca fiind printre cele mai bune existente, având
printre altele un sistem de iluminare global, umbrire pe bază de fizicul obiectului, etc.
Se pot crea jocuri 2D, sau 3D, simple sau complicate, de dezvoltatori independen ți, sau de echipe
întregi. Datorită flexibilității, jocul construit o dată, poate fi transportat pe celelalte platforme, fără mari
probleme.
2.2.2 Asset Store
Unity asset store este o “librărie” tot mai mare de assets (“resurse”) atât gratuite cât și comerciale
create de Unity Technologies , dar și de către membri ai comunită ții. E locul unde se poate descărca aproape
orice fel de asset : texturi, modele, modele 3 D, animații.
Preluarea acestora este foarte u șoară, prin existen ța unei interfe țe în interiorul edito rului Unity care le
descarcă și importă direct în proiect.
2.2.3 Introducere în Unity
Primul contact cu Unity, ar putea fi pu țin confuz, datorită prezen ței a mai multor ferestre. Dar acest
lucru dispare în timp, după câteva utilizări ale programului. Una dintr e cele mai importane ferestre, o
9
reprezintă scena, unde se pot manipula obiectele, camera principal ă, și alte elemente. (Figura 9) Foarte
important este faptul că aici există două moduri de vizualizare: 2D și 3D. Schimbarea între ele nu afectează
jocul decâ t modul de vizionare.
Figura 9. Default Scene view
Un proiect nou deschis în Unity va arăta astfel (Figura 10) :
Figura 10. Default project in unity
10
• Fereastra Game : aici se poate vedea exact cum arată scena creat ă
• Butoanele de testare și utilizare a scenei:
– aici se rulează scena curentă folosind primul buton, al doilea fiind de pauză, iar al treilea setează
scena pe pauză în cazul în care nu se află deja, și la fiecare click al acestuia, va derula jocul câte un
frame.
– unde toate scripturile de cod s unt active și rulate astfel încât codul scris va fi citit.
• Fereastra Inspector : unde se pot face anumite modificări diferitelor fi șiere sau obiecte existente.
• Fereastra Hierarchy : afișează toate obiectele existente în proiectul creat, în ordine alfabetic ă.
• Fereastra Project : afișează toate fi șierele și dosarele create, precum și conținutul lor, cum ar fi script –
uri, texturi etc.
• Fereastra Toolbar : fereastra de unelte pentru manipulare a scene view
• Fereastra Meniu : fereastra de adaugare obiecte și creare de proiecte noi.
Fiecare proiect nou deschis va avea două obiecte de bază în Hierarchy. Unul este Directional Light,
care se ocupă de luminarea scenei, și alte setări legate de aceasta. Al doilea este MainCamera , reprezentând
ecranul pe care îl vede jucăt orul (Game View).
2.3 Monodevelop
Monodevelop este mediu de dezvoltare integrat, care se furnizează automat cu descărcarea și
instalarea platformei Unity. Acest IDE (integrated development environment) combin ă operațiile familiale
ale unui editor de text e cu caracteristici suplimentare pentru depanare și alte sarcini de management de
proiect.
Permite dezvoltatorilor să scrie rapid aplica ții desktop și web pe Linux, Windows și Mac OS X. De
asemenea, face mai u șor pentru dezvoltatori să transmute aplica țiile .NET create cu Visual Studio, pe Linux
și Mac OS X men ținând la bază un singur cod pentru toate platformele.
Codul scripturilor în Monodevelop este realizat pentru Unity folosind limbajele Javascript sau C#.
Scripturile pentru acest joc au fost scrise folosind C#, datorită cuno ștințelor mai ample de ținute în acest
limbaj.
2.4 Limbajul de programare folosit
C Sharp (sau mai simplu scris C#) este un limbaj de programare modern, imperativ, obiect –orientat,
conceput de Microsoft la sfâr șitul anilor 90. Este considerat a fi un limbaj relativ simplu, cu circa 80 de
11
cuvinte cheie și 12 tipuri de date predefinite. Este foarte asemănător cu Java și C++, motiv pentru care curba
de învățare este foarte lină.
C# este intregrat în platforma Microsoft.NET F ramework, un cadru (Framework) de dezvoltare
software unitară. Acesta are o legătură deosebită cu mediul său de rulare. Pe de o parte, C# a fost dezvoltat
pentru crearea codului pentru arhitectura .NET, iar pe de altă parte bibliotecile utilizate de C# sun t cele ale
arhitecturii .NET.
Precum Java și C++, C # moștenește sintaxa, operatori și multe din cuvintele cheie, de la C. Acesta a
fost proiectat pentru a produce cod portabil. Între C# și Java există o rela ție similar celei dintre “veri”, ele
deriv ă din același strămoș, dar deosebindu -se prin multe caracteristici importante. Acestea se referă la
suportul încorporat pentru componente software. C# dispune de facilită ți care implementează direct elemente
care alcătuiesc componentele software, cum ar fi prop rietățile, metodele și evenimentele. Poate cea mai
importantă facilitate de care dispune C# este posibilitatea de a lucra într -un mediu cu limbaj mixt.
Exist ă o gamă diversă de programe dezvoltate cu C# pe platforma .NET : aplicații web, desktop,
mobile , jocuri, etc.
2.5 Android SDK
Android software development kit (SDK) reprezint ă mediul cel mai folosit, pentru dezvoltarea de
aplicații noi pe sistemul de operare Android. Acesta este oferit împreună cu mai multe programe software,
care ajută la o mai bună dezvoltare a aplica ților.
Unity se folose ște singur de Android SDK, pentru transformarea aplica ției înt -un apk.
Capitolul III: Dezvoltare pe Android
3.1 Unity Remote
Pentru o dezvoltare mai bună a jocului, am descărcat pe telefonul meu mobil Samsung J5 2018 , cu
sistem de operare Android, aplica ția Unity Remote (versiunea 5) . Aceasta este doar pentru sistemele de
operare Android și iOS.
Aplicația se conectează la Unity în timp ce se execută modul Redare din editor. Ie șirea vizuală din
editor este trimis la ecranul dispozitivului. În timp real, input -ul (intrările trimise de la telefon: mi șcarea
telefonului, atingerea ecranului) este trimis înapoi la editorul Unity.
Această aplica ție ajută foarte mult deoarece nu mai trebuie compilat de fiecare dată proi ectul, salvat
pe telefon, și reinstalat, pentru a testa func ții de bază.
Deoarece am intampinat ceva probleme pentru a reu și funcționalitatea pe telefon a programului Unity
Remote, am să scriu exact pa șii care trebuie urma ți, ordinea fiind importantă :
12
1. Mod ul depanare USB trebuie sa fie activat pe telefonul mobil,
2. Descărcarea gratuită a Unity Remote pe telefonul mobil,
3. În editorul Unity verificarea path -ului pentru Android SDK: Editor ->Unity Preferences -> External
Tools -> Android SDK Loca tion s ă aibă loca ția folder -ului root a -l Android SDK
4. În Unity, Edit -> Project Settings -> Editor, Device s ă fie pe op țiunea: ”Any android device” (Orice
dispozitiv)
5. Cel mai important pas, pentru reu șita rulării (de cele mai multe ori aici se gre șește și apar erori ) :
cone ctarea telefonului prin USB la calculator/laptop f ără a avea Unity deschis. După asigurare,
deschideți Unity remote pe telefon, și după editorul Unity pe calculator
Observa ție: Pentru a face posibil ă rularea jocului pe Android, am configurat editorul Unity astfel :
a)Pentru telefon :Adăugarea path -lui Android SDK în Unity, astfel: Editor ->Unity Preferences ->
External Tools -> Android SDK Location select ând locația fișierului root a -l Android SDK
b)Pentru calculator : În Editor -> Project Settings -> Player, am selectat pentru platforma Android.
3.2 Prezentare generală
Numele jocului este R ushCar-2D. Acesta este un “endless game”, deoarece scopul jocului este unul
competitiv, de a face mai mult punctaj decât celelalte persoane care mai joacă, scorul fiind af ișat într -o tabelă
cu cele mai bune cinci punctaje. Mașina se mișcă doar stânga -dreapta, folosindu -se de giroscopul telefonului.
Giroscopul este un senzor folosit cel mai adesea în jocuri, care recunoaște mișcarea smartphone -ului în spațiu:
sus-jos, dreapt a-stânga, înainte -înapoi. În timpul jucării, se află constant două săgeți:
• prima în partea dreapt ă – cu vârful înainte ce indică să meargă reprezintă accelerația
• a doua în partea stângă – cu vârful înapoi ce indică să se opreasă, reprezintă frâna.
Mecanis mul jocului este bazat pe mișcarea obiectelor – acestea derulându -se în mod repetitiv, în timp ce
mașina jucătorului rămâne în aceeași poziție. Jucătorul poate să aleagă între două mașini.
Jocul este format din 4 scene. Scena principală, este cea a desfășu rării jocului.
Celelalte trei scene sunt părți ale interfeței, inclusiv meniul principal.
3.3 Project
Fereastra Project (Figura 11) conține toate fișierele proiectului. Acesta are un fișier principal (creat
automat la începerea unui nou proiect) Assets, cu subfișierul creat de mine, numit Resources, unde am decis
să-mi pun fișierele jocului. Când un dosar este selectat prin click, conținutul acestuia va fi afișat în panoul
din partea dreaptă.
13
Figura 11. Fereastra Project
Dosarul meu Resources conține:
• ExternalAssets
• Prefabs
• Scenes • Scripts
• Textures
Fișierul ExternalAssets conține toate resursele preluate de pe AssetStore. Copacii, roca, tufișurile și
mașinile au fost toate achiziționate gratis. În imaginea de mai jos se află toate aceste resurse, câ t și alte fișiere
extra care fac parte din construirea acestora
Figura 12. ExternalAssets
În proiect sunt folosite următoarele resurse:
• Copac mare [8]
• Copac mic (Sursa [9]
• Mașină traffic 1 (Sursa [10]
• Mașină traffic 2 (Sursa [11]
• Mașină traffic 3 (Sur sa [12] • Mașină traffic 4 [13]
• Mașină player 1 [14]
• Mașină player 2 [15]
• Roca [16]
• Cele 5 tufi șuri [17]
14
Figura 13. Prefabs
Prefabs conține toate prefaburile jocului. Un prefab este un gameObject salvat prin metoda drag and
drop din Hierarchy într -una din fișierele din Project. Odată modificat aici acel obiect, își va păstra
caracteristicile. Desigur, și dacă modificăm un gameobject din Hierarchy, acesta își va păstra trăsăturile, și
putem crea oricâte copii dorim ale acestuia.
Problema intervine atunc i când dorim ca un obiect să ne apară în joc, nu să existe deja. Problema este
rezolvată prin existenta prefab -urilor, scriind cod, acesta va înștiința când vrem, ori de câte ori acel obiect
prefab.
În scenes se află scenele jocului:
Figura 14. Scenele jocului
Scripts conține scripturile cu cod scris în Monodevelop folosind limbajul C#.
Diagrama de clase se poate vizualiza în anexa 1 .
15
Figura 15. Scripturile
Figura 16. Textures
Textures conține materiale folosite la obiectele jocului. Aici se află resursele create de mine.
În imagine se află mai multe poze cu mașini, realizate cu “Snipping Tool”, pentru interfața meniului
principal și interfața ce cuprinde selectarea între cele două mașini. Pentru scena cu jocul, am realizat săgețile
folosind o imagine cu doua săgeți [17], poza butonului de pauză, și strada. Aceasta din urmă a fost creată din
doua imagini, una ce cuprinde o stradă [18], iar cealaltă o poză cu iarba [19]. Atât pentru săgeți, cât și pentru
stradă am folosit mediul de luc ru Photoshop CS6 și Paint.
3.4 Scena jocului
Scena jocului este cea mai importantă scenă din cele patru. Aici se află majoritatea obiectelor jocului,
celelalte scene conținând elemente pentru interfață. Obiectele se numesc în Unity gameObjects.
Scene View (Figura 17) este cea mai importantă fereastră a unei scene, aici se desfășoară lucrul
folosind obiectele din Hierachy. În figura de mai jos este prezentată modul de vedere al scenei (Figura 17).
16
Figura 17 Scene view
Nu trebuie confundat Scene view cu scena jocului. Scene View (Figura 17) este fereastra care ajută la
manipularea obiectelor, a camerei, la fel cum Game View (Figura 18) arată rezultatele modificărilor din
Scene View.
Figura 18. Scena jocului
În Game View (Figura 18) se poate vizualiz a exact cum va arăta jocul la rulare.
17
3.5 Hierarchy și Scripts
GameObject Script
Street AsphaltManager
Player
Player2 Player Controller
Player Controller
TreeRandomizer TreeRandomizer
BushRandomizer BushRandomizer
Outside 1 AsphaltManager Outside 2 AsphaltManager
GameSpace ObjRemover
Left –
Right
LeftEnd
RightEnd –
–
–
Figura 19. GameObjects și scripturi ale Scenei Jocului
Obiectele din Hierarchy ale scenei curente, cu
scripturile corespunzătoare fiecăruia (Figura 19)
Unele obiecte nu ex istă în joc (Hierarchy) la
momentul începerii acestuia, ci sunt instanțiate pe
parcursul jocului.
Aceste obiecte prefabs (Figura 20) cu scripturile
corespunzătoare fiecăruia sunt :
GameObject Script
Car 1 – 4 Car Script
Broadleaf_mobile(Copac mare) Obj Mover
Sycamoresmall(Copac mic) Obj Mover
RockMesh Obj Mover
Bush 1 – 5 Obj Mover
Figura 20 . Prefabs și Script-uri ale Scenei Joculu i
3.6 Street
Totul începe cu crearea străzii, un gameObject dintre cele mai importante ale aplicației, deoarece susține
celelalte obiecte: mașinile, vegetația.
18
Acest lucru este realizat prin adăugarea
componentei Box Collider, folosind Inspectorul.
Un Box Collider permite intrarea în contact a
doua gameObjects, neexistând acesta, obiectele ar
fi transpar ente.
Altfel spus, este componenta ce asigură
detectarea coliziuni. Strada este situată în centrul
jocului, la punctele de coordonate (0,0,0). Strada
este formată din nouă GameObjects, fiecare
reprezentând o parte identică de stradă. Strada este
un empty gameObject, creat posterior pentru a
parenta cele nouă străzi.
Figura 21. Componenta Box Collider a străzii
Un gameObject poate parenta alte obiecte prin simpla trecere, utilizând drag&drop, a acestora în
dreptul obiectului țintă (părinte). Obiectele parentate devin copii obiectului părinte. Utilitatea este redată de
aplicarea componentelor în inspectorul părintelui, acestea fiind preluate și de către copii, cât și de
manipularea prin cod a acestor obiecte folosind părintele.
Figura 22. Strada joc ului și marginile.
O dată cu dezvoltarea acestui joc, a trebuit să introduc și margini, pentru a umple spațiile libere, la
vizualizarea jocului pe telefon. Aceste margini sunt redate de: Outside 1 și Outside 2.
19
În imaginea următoare se poate vedea s trada formată din cele 9 părți, cât și marginile (Figura 20).
Principiul jocului este de a muta celelalte elemente în timp ce jucătorul rămâne pe loc.
Schimbarea poziției străzii se realizează, ca și celelalte elemente după viteza jucătorului. Fiecare par te din
stradă va trece pe sub jucător , iar la un anumit punct ultima bucată va trece prima, și așa mai departe.
Componenta script numită AsphaltManager se ocupă de acest lucru. Această componentă este folosită și de
către cele două margini.
Pentru realiza re, au fost nevoie de patru variabile, declarate private (Figura 23) . O variabilă
pController de tipul Player Controller, care reprezintă scriptul jucătorului. Acesta caută jucătorul și va
inițializa variabila cu componenta Player Controller a acestuia. O variabilă de tip șir Transform, numită
allChildren, care preia fii străzii prin metoda GetComponentsInChildren<Transform>() .
Ultimele două variabile startScroll și finishScroll, reprezintă poziția de început a primei străzi,
respectiv poziția de sfârșit a ultimei străzi, valoare calculată în funcția Start() (Figura 23).
Acestea sunt de tip Vector3, vector ce primește ca parametri trei variabile (x,y,z), și folosit în general
pentru modificarea poziției obiectelor în spațiu. În funcția Start() este folo sită o metodă a acestuia,
Vector3.Distance care primește doi parametri de tip același tip pentru a calcula distanța.
Figura 23 . Declararea variabilelor și funcția Start() a scriptului AsphaltManager
În cazul de față este calculată distanța între două străzi, această valoare fiind folosită pentru a scădea
din ultima stradă, dimensiunea unei străzi, și a afla punctul de final, la care va trebui ca ultima bucată de
stradă, să-și schimbe poziția, trecând prima (Figura 23).
Orice script nou creat în Unity, are atașat două metode de bază. Prima este Start() (Figura 23) , metodă
care este apelată doar o dată la fiecare GameObject, în cazul in care sunt mai multe. Este similar cu un
20
constructor in C++, la instanțierea unui obiect de tip clasă. A doua este Update(), metodă apelată la fiecare
frame al jocului. (Figura 24).
După calcularea valoarei finishScroll, și inițializarea variabilei de tip vector allChildren cu numărul
de copii componente al obiectului stradă, în funcția Update() (Figura 24 ) se va mișca p e fiecare frame al
jocului fiecare parte de stradă. Aceasta va verifica constant ajungerea la punctul de sfârșit al ultimei părți de
stradă pentru a realiza mutarea acesteia pe prima poziție. ( Time.delta Time) (Figura 24 )
Figura 24. Funcția Update() a scriptului AsphaltManager
3.7 Player
Player -ul este cel mai important obiect al jocului, reprezentând jucătorul. Pe scenă sunt două mașini,
una activă, cealaltă inactivă. În funcție de mașina aleasă acestea își schimbă stările.
Player -ul este singurul Gameobject care nu -și schimbă poziția pe durata jocului,. aceasta fiind de
coordonate: X: 2.5, Y: 1.3, Z: 0, poziția formată din (0,0,0) reprezentând centrul. Așadar player -ul este așezat
cu valoarea X de 2.5 unități care indică poziția stânga -dreapta, valoar ea pozitivă fiind dreapta. Astfel, la
începutul jocului, mașina nu va fi poziționată pe linile ce despart cele două sensuri de mers. Valoarea Y de
1.3 unități, indică poziția sus -jos, pozitiv fiind sus. Deoarece strada are Y = 0, iar mașina o inălțime de
aproximativ 2 unități, valoarea Y luând în considerare centrul obiectului, (deci partea de sus a mașini ar
21
atinge +1, iar cea de jos -1 ), mașina este așezată la o distanță de 1.3 unități față de centru. Cei trei parametri
sunt apelați de metoda transform.p osition.
În general spațiul în Unity se măsoară în unități (prin default), deși se poate seta pentru măsurarea în
pixeli, dar pentru acest joc este folosită prima variant, de bază.
La crearea unui empty object (obiect nou de bază,
gol) acesta nu are decâ t componenta transform.
Aceasta se ocupă de poziționarea în spațiu a
obiectului. Componenta transform a player -ului se
poate vedea în Figura 25
Figura 25. Componenta Transform a Player -ului
După cum se poate vedea din figură componentă Transform mai conține “Rotation” și “Scale”. Cea
din urmă se ocupă de dimensiunea obiectului, astfel: X va mări obiectul în lățime, Y în înălțime, iar Z în
lungime. Transform.rotațion se ocupă cu rotația obiectului în spațiu, neavând astfel de obiecte, aceastea sunt
setate pe 0 la fiecare obiect, mai puțin camera principală.
Aceasta are parametrii Y, Z egale cu valoarea 0,
iar X valoarea 45, ce oferă un unghi de vedere de
45 de grade asupra scenei. Po ziția camerei se
poate vedea în Figura 26.
Figura 26. Componenta T ransform a MainCamera
Ca și toate celelalte obiecte, mașinile conțin componenta Mesh Renderer. Această componentă redă
obiectul în funcție de materialele pe care le are.
Pentru player, cât și pentru celelalte obiecte
preluate de pe AssetStore, acestea sunt dezvoltate
de către creatori. (game design -eri).
Componenta Rigidbody (Figura27) oferă
fizică obiectului. Aici se poate activa sau dezactiva
gravitația prin bifarea “Use gravity”.
La fel și pentru “Is kinematic”, care oferă
obiectului posibilitatea să fie transparent la
coliziuni cu alte obiecte deși are un rigidbody
atașat. Mașinile au gravitație, și nu sunt cinematice.
Figura 27. Componenta Rigidbody a Player -ul
22
BoxCollider este prezentă și ea, dar înt -un alt mod. Player -ul și GameSpace -ul sunt singurele obiecte
din joc care au bifat butonul pentru “Is trigger”. Când acesta este activat nu mai înregistrează o coliziune cu
un RigidBody, în schimb returnează trei metode: “OnTriggerEnter”, “OnTriggerStay”, și ”OnTriggerExit”.
Aceste metode sunt active astfel: primul – la detectarea coliziunii, al doilea – cât timp există coliziune, iar al
treilea – la ieșirea din coliziune.
Ultima componentă și cea mai importantă este scriptul cu cod numit “Player Controller”.
În prima parte a scriptului sunt d eclarate variabilele. Există șapte variabile publice: speed, maxspeed,
minspeed, MeniuInGame, PauseButton, GameOver, shouldMove. Primele trei sunt de tip float. Cea mai
importantă este speed, deoarece reprezintă viteza mașinii, adică viteza de derulare a c elorlalte obiecte în
raport cu mașina. Celelalte două variabile float reprezintă viteza minimă, respectiv viteza maximă de
deplasare a mașinii.
Acestea sunt de tip public pentru o dezvoltare mai bună a jocului, deoarece cele declarate publice apar
în Ins pectorul din Unity, și pot fi modificate chiar și în timpul derulării jocului, pentru diverse teste.
Următoarele trei variabile sunt de tip GameObject, fiind publice pentru a utiliza metoda drag&drop și a face
referire la trei elemente din partea grafică ( acestea fiind trase peste inspector – vezi Figura 28 ).
Figura 28. Variabilele scriptului Player Controller
Figura 29. Obiectele luate prin drag&drop și
introdu -se în inspector
Figura 30.Variabilele publice din inspector ale
scriptului Player Co ntroller
MeniuInGame la opțiunile de pauză, PauseButton la butonul de pauză din dreapta sus a
ecranului, iar GameOver la obiectul cu același nume din partea grafică, ce indică finalul jocului
23
.
Variabila touch este de tip Touch, și este specifică pentru partea de telefoane mobile, semnificând atingerea
ecranului. Ultimele două variabile sunt de tip private. Prima este distanța, care reprezintă scorul. A doua este
“box”, fiind de tip BoxCollider. Variabila booleană shouldMove este responsabilă pentru acce sul la controlul
mașinii.
Funcția Start() (Figura 31) în script -ul jucătorului
inițializează variabila box cu Boxcollider -ul
jucătorului, și asigură că timpul jocului este pe 1,
adică derulare normală.
Figura 31. Funcția Start() a scriptului Player
Controller
Funcția Update() (Figura 32) fiind apelată la fiecare frame, este responsabilă de următoarele:
• Calcularea distanței (scorului)
• Este responsabilă de înregistrările atingerilor ecranului, iar pe baza acestora apelează metodele de
accelerare sau d ecelerare.
• Verifică constant dacă jocul se află în pauză, s -au dacă a luat sfâr șit pentru a bloca controlul mașini .
Totodată acesta verifică dacă nu mai este în pauză pentru a reda controlul mașinii. Inițial variabila
shouldMove este true, pentru a permi te mișcarea mașinii la începutul jocului.
Metoda transform.Translate de parametrii ( X,Y,Z ) realizează controlul mașinii folosind giroscopul
telefonului. Player -ul se mișcă doar stanga -dreapta prin setarea parametrilor Y și Z pe 0 , iar X :
Input.accelerat ion.x (Figura 32) .
Datorită realizării de către designer -i, a mașinilor în mod diferit, acel if află ce mașină trebuie să
controleze fiecare ramură. Se poate observa din cod, că pentru una din mașini este –Input.acceleration.x
(Figura 32)
24
Figura 32.Funcția Update() a scriptului Player Controller
Întreaga ecuație a fost creată ca și idee de joc,
jucătorul alegând între două mașini, una mai
rapidă decât cealaltă, dar controlată mai greu, prin
acest cod . Funția accelerate crește viteza mașinii ,
atât timp cât aceasta este apăsată (Figura 3).
Figura 33. Funcția accelerate() a scriptului Player
Controlle r
Figura 34. Funcția brake() a scriptului Player
Controller
Figura 35 . Funcția decelerate() a scriptului Player
Controller Funcția brake descrește considerabil viteza
mașinii, atâta timp cât este apăsată. (Figura 34).
Funcția deccelerate descrește viteza
mașinii, atâta timp cât nu este detectată nici o
apăsare pe ecran (Figura 35).
Funcția OnTriggerStay() (Figura 37) este
dedicat încetini rii mașinii dacă acesta încearcă să
ajungă înafara șoselei. Aceasta este formată din
patru pereți invizibili în joc. Două pe partea stângă,
și două pe partea dreaptă, după cum se poate vedea
in Figura 36 .
25
Figura 36 . Cei patru pereți invizibili din scena jocului (scene view)
Figura 3 7. Funcția OnTriggerStay() a scriptului Player Controller
Cele patru GameObjects se numesc: Left, LeftEnd, Right, RightEnd. Left, peretele din partea stângă, și Right,
cel din partea dreaptă reprezintă primul nivel de în cetinire a -l mașinii (Figura 38).
Acestea apelează funcția decelerateOut() .
26
LeftEnd și RightEnd constitue al doilea nivel care oprește mașina jucătorului. Acestea apelează funcția
decelerateOut2() (Figura 3 9).
Figura 3 8. Funcția decelerateOut() a scri ptului
Player Controller
Figura 3 9. Funcția decelerateOut2() a scriptului
Player Controller
Funcția OnTriggerEnter() (Figura 40) rezolvă cazurile de coliziune cu celelalte obiecte. Un prim caz ar fi că,
deși există parapeți invizibili în joc, până l a încetinire acesta se poate lovi de unul din obiectele de vegetație
și jocul i -a final imediat. Totodată, vegetația se poate insanția foarte aproape de șosea, la nivelul unu de
oprire a -l mașinii, existând șanse mari de coliziune. Al doilea caz îl reprezi ntă mașinile.
Acesta se poate observa în cod prin if (other.gameObject.name.Contains("Car")).
Dacă obiectul coliziunii este o mașină atunci,
întreabă poziția x a mașinii. Poziția 0 fiind cele două
linii de separare a sensurilor de mers, atunci dacă x <0,
adică mașinile vin de pe sens opus, codul va încheia
jocul prin activarea GameOver.
Înainte de asta va seta timpul de derulare al jocului la
0, și va bloca posibilitatea de intrare în meniul din
interiorul jocului.
Dacă mașina lovită se află pe sens ul de mers,
atunci va dezactiva componenta isTrigger pentru a
permite ciocnirea ușoară a acestora.
Dacă viteza este prea mare atunci jocul va lua sfârșit.
Figura 40. Funcția OnTriggerEnter() a Player
Controller
Ultima funcție de coliziune, OnTriggerE xit() (Figura 41) care este returnată la ieșirea din coliziune cu un alt
obiect, este ca o completare pentru cazul în care mașina lovește o
27
altă mașină de pe același sens de mers dar nu cu o
viteză mare pentru a încheia jocul.
Figura 41. Funcția OnTriggerExit() a scriptului
Player Controller
Această funcție setează isTrigger() înapoi pe false,
pentru a putea detecta alte coliziuni în viitor.
Ultima funcție a scriptului Player
Controller este getDistance() (Figura 41), fiind o
metodă publică de r eturnare a distanței, folosită
pentru afișarea scorului.
Figura 42 . Funcția getDistance() a scriptului
Player Controlle r
3.8 Mediu
3.8.1 Traficul jocului (Mașini )
Traficul jocului este reprezentat de mașini. Ele sunt patru ca număr, și se pot vedea în Figura 43.
Figura 4 3. Traficul jocului Aceastea ca și cele două mașini ale
jucătorului prezintă rigidBody și boxCollider. Ele
sunt obiecte prefab, care nu sunt inițial în joc.
Acestea sunt preluate de script din fișierul cu
resurse, din dosarul cu prefabs/car s și instanțiate în
joc la momente diferite de timp.
În funcția Start() (Figura 44) a scriptului CarRandomizer, se realizează această instanțiere prin
metoda Resourses.Load care preia dintr -o anumită locație un obiect. Foarte important, trebuie precizat tipul
obiectului, acestea fiind aici GameObjects.
Tot în această funcție, mai este inițializat un vector de zece elemente de tip float, numit
randomChoices. Acestea redau pe ce poziții este posibilă crearea unei clone a unei mașini, din prefabul
nostru ca și gameObject.
28
Figura 44. Declararea variabilelor și funcția Start() a scriptului CarRandomizer
Variabilele de tip float timer și spamTimer calculează timpul până la următoarea instanțiere a unei mașini.
Timer este valoarea ce se va incrementa pâ nă va atinge valoarea din spamTimer, atunci se crează clona, iar
timer va lua valoarea 0. SpamTimer va lua o valoare random dintre două variabile: minFreq și maxFreq.
Valoarea random este dată de apelul funcției
Random.Range().
Pentru o instanțiere m ai bună a mașinilor,
ca și interval de timp, am pus o condiție if, care va
modifica parametrii minFreq, maxFreq în funcție
de viteza mașinii jucătorului.
Aceasta poate fi văzută în prima parte a
funcției Update() (Figura 45) ,
Figura 45.Prima parte a funcței Update() a
scriptului CarRandomizer
29
În a doua parte a funcției Update() (Figura 46) se
va genera o poziție random x, în variabila pozițieX,
ce va determina pe ce sens de mers, și pe ce banda
se va genera mașina. În funcție de bandă, if -ul din
cod, va schimba rotația mașinii, pentru a așeza
clona obiectului din prefab în mod corespunzător.
Figura 46. A doua parte a funcței Update() a
scriptului CarRandomize r
Odată generate mașinile acestea vor folosi
scriptul Car pentru deplasare (Figura 47).
Acest script este plasat în fiecare prefab cu
mașina din folderul Prefabs.
Mașinile vor fi generate conform setărilor
realizate mașinilor din acel folder. Scriptul preia
viteza mașinii player -ului în funcția Start() .
În funcția Update() este folo sită această
viteza, pentru echilibru, cât și adăugarea unei
viteze random pentru diversitate.
Figura 47. Scriptul Car
3.8.2 Vegetație
Vegetația în joc este dată de următoarele: tufișuri, copaci și rocă. Elementele de vegetație sunt r edate
în joc într -un mod similar mașinilor.
Vegetația este pusă în două scripturi, una pentru tufișuri, iar cealaltă pentru celelalte două, pentru a nu
încurca codul și pentru a avea o ordonare mai bună.
Cele două scripturi sunt :
*TreeRandomizer (Figura 48)
*VegRandomizer (Figura 49).
În funcția Start( ) (Figura 48) se preiau prefab -urile din fișier și se inițializează ca și gameOjects.
Totodată, se găsește mașina jucătorului, și este preluat scriptul acesteia.
30
Figura 48. Funcția Start() a scri ptului
TreeRandomizer
Figura 49. Funcția Start() a scriptului
VegRandomizer
Figura 50 Funcția Update() a scriptului
TreeRandomizer
În funcția Update() (Figurile 50 -52) se alege
random poziția X. Aceasta este aleasă random și
va determina pe ce par te va fi instanțiat obiectul
(excluzând strada). Vegetația folosește următorul script pentru
mișcare. ( Figura 53). Aceasta preia viteza
jucătorului în funcția Start(), iar funcția Update()
(Figurile 50 -52) va realiza mișcarea uniformă a
obiectelor din fo lderul cu prefab -uri.
Figura 51 . Prima parte a funcției Update() a
scriptului VegRandomize r
31
Figura 52 . A doua parte a funcției Update() a
scriptului VegRandomizer
Figura 53 . Scriptul ObjMover
3.8.3 GameSpace
Elementele generate trebuie la rândul lor distruse.
Gamespace este obiectul în interiorul căruia se
desfășoară jocul. Toate obiectele care trec de player,
la un moment dat vor ieși din spațiul obiectului
GameSpace și vor fi distruse. Acesta este un obiect
invizibil de mari dimensiuni care are componenta
BoxCollider cu metoda isTrigger activată. Funcția OnTriggerExit () (Figurile 54) ce distruge
obiectele ieșite se află în scriptul ObjRemover.
Figur a 54. Funcția OnTriggerExit() a scriptului
ObjRemove r
3.8.4Mind
Mind este un empty (nou) gameObject care nu are nici un impact fizic asupra jocului. Acesta a fost
creat pentru a susține fișierul de muzică și scriptul numit CarStart pentru selectarea mașinii, înainte de
începerea jocului.
Metoda Awake() (Figura 55) oferă posibilitatea de a realiza mod ificări înaintea rulării scenei.
Ca și în cazul de față, am avut nevoie ca mașina să apară pe scenă înaintea afișării scenei, deoarece
celelalte obiecte caută obiectul mașină.
.
32
Pentru o înțelegere mai bună, dacă codul
din Awake() (Figura 55) ar fi fost scris în start()
jocul ar fi trecut de compilare, dar ar apărea erori,
deoarece celelalte obiecte nu găsesc la timp
jucătorul .
Aici, codul preia mașina selectată de
jucător și setează în funcție de modelul ales care
mașină să fie activă.
Figura 55 . Funcția Awake() a scriptului CarStart
3.9 Interfața
3.9.1 Canvas -ul scenii jocului
În Unity, toate elementele de GUI (“Graphic User
Interface”) se realizează prin Canvas (Figura 56)
La crearea unui obiect de tip UI (“User Interface”)
aceasta se va atașa la C anvas -ul existent ca și fiu,
sau va crea automat unul în cazul în care nu există.
Obiectele de tip UI oferite de Unity sunt: Panel,
Button, Text, Image, Raw Image, Slider, ScrollBar,
Toggle, Input field, Canvas, Event Canvas.
În Figura 56 se poate vedea c e conține
interfața din scena jocului:
Figura 56. Obiectele interfață ale scenii jocului
3.9.2 Arrows
Arrows sunt săgețile de orientare a jucătorului pentru accelerare și frână. Acestea sunt constant pe ecran în
timpul jucării. UpArrow reprezintă accelerarea , iar DownArrow frâna. Amândouă sunt de tip button.
3.9.3 Pause
Pause este butonul de pauză, disponibil la atingere întregii perioade de joc. Odată apăsat acesta activează
scriptul MeniuInGame folosind propria metodă OnClick() din fereastra Inspector.
Acest s cript este folosit pentru activarea opțiunilor jucătorului în joc. Scriptul declară un singur
parametru numit Options de tipul obiectului din canvas numit cu acelați nume Options.
33
Este inițializat folosind editorul Unity, în
același mod cum am văzut la variabilele publice
ale player -ului. Scriptul conține două metode,
Pause() și Unpause() (Figura 57)
Butonul de pauză activează metoda Pause()
(Figura 57) care setează să fie activă fereastra în
joc a obiectului de tip UI, Options.
Înainte de acest lucru , linia de cod
Time.timeScale = 0; va seta timpul de derulare al
jocului la 0 pentru pauză.
Figura57. Funcția Pause() a scriptului
MeniuIngame
3.9.4 Options
Spre deosebire de primele două, elementul
Options nu este activ pe ecran, decât atunci când
este apelat de butonul de pauză.
Odată activat, acesta activează și fii lui,
reprezentând opțiunile disponibile în timpul pauzei
jocului: BackToGame, BackToMainMeniu,
ExitGame.
În Figura 58 se poate vedea meniu Options,
totodată, buton ul de pauză în stânga -sus, cele două
săgeți, cât și scorul și punctajul jucătorului,
prezentate în subcapitolul următor.
Figura 58. Elementele grafice: Options, arrows,
pause, speed&score
• Butonul Back to Game activează metoda
Unpause() (Figura 59) a scriptului
MeniuInGame care redă derularea jocului
înapoi pe valoarea 1, și dezactivează
meniul Options.
Figura 59. Funcția Unpause() a scriptului
MeniuIngame
34
• Butonul Back To Main Meniu : întoarce
jucătorul la meniul principal. Folosește
scriptul LoadOnClick(). Script care realizează
schimbarea între scene.
• Metoda Application.LoadLevel() (Figura60)
care primește ca și parametru un int, schimbă
scenele în funcție de numărul scenei.
Figura 60. Funcția LoadScene a scriptului
MeniuIngame
• Buton ul Exit Game (Figura 61) va închide
jocul și va ieși din aplicație prin apelarea
funcției QuitQame() a aceluiași script.
Figura 61.Funcția QuitGame a scriptului
MeniuIngame
3.9.5 Speed & Score
Speed & Score este alcătuit din SpeedText, ce reprezintă viteza de deplasare a mașinii, și Score, ce
reprezintă punctajul acumulat pe durata timpului de joc. Ambele sunt de tip text, și folosesc o parte a
scriptului GUIManager pentru a fi afișate
3.9.6 GameOver
Cealaltă parte a codului este folosit de elementul UI, GameOve r (Figura 62) care este activat atunci
când jucătorul a pierdut. Cuprinde următoarele elemente:
• Your Score: este de tip text, și afișează punctajul la care a ajuns înainte de a pierde jucătorul.
• Top Score: de tip text, care afi șează punctajul de pe primul loc, din tabela de scoruri.
• By Player: componenta de tip text, care afi șează numele jucătorului care este în top
• Back To Main Meniu: butonul cu acelea și funcții ca și cel din Options.
• Ultima componentă este de tipul InputField, numită sName.
Aceasta dev ine activă în joc doar în cazul în care jucătorul a reușit să depășească punctajul ultimului
jucător din lista de scoruri, și permite utilizatorului pentru a -și scrie numele.
Scriptul GUIManager (Figura 63) realizează aceste lucruri cât și afișarea conti nuă a vitezei și
punctajului jucătorului.
35
Sunt declarate nouă variabile. Primele două
de tip private, folosite doar în acest context. Prima
este pController care este de tip PlayerController.
Aceasta caută player -ul în joc și preia
scriptul acestei a. A doua este o valoare string
numită nume, care preia din metoda PlayerPrefs
numele jucătorului de pe primul loc.
Figura 62.Elementele grafice ce aparțin de
GameOve r
Figura 63. Scriptul GUIManage r
Această metodă este locul de salvare ș i preluare a
informației player -ului, între sesiuni de joc ( la
ieșirea din acesta, până la o nouă întoarcere), creat
de Unity.
TopScore pentru a afișa scorul jucătorului
cel mai bun.
Variabila numele este folosită la afișarea numelui
jucătorului cu cel mai bun scor.
Ultimele două variabile sunt acelea ale elementelor speed&score, ce sunt afișate constant pe ecranul
jucătorului. SpeedText afișează viteza jucătorului, iar distanceText distanța.
Singura componentă a GameOver, care folosește alt scri pt este cea de tipul InputField, numită sName.
Aceasta folosește scriptul LoanOnClick() pentru returnarea la meniul principal după ce player -ul iși va trece
numele, și funcția HighScores (Figura 64) .
Aici sunt declarate cinci variabile publice. O variabi lă numită setname, care este de tipul InputField.
În această variabilă preluându -se numele introdus de utilizator. O variabilă finalScore, care reprezintă scorul
final.
Un gameObject numit inputfield , care reprezintă obiectul de tip inputfield, utilizat aici pentru
activarea și dezactivarea acestuia. Penultimul obiect este de tip Canvas, numită gameCanvas, și preia obiectul
canvas al jocului (Figura 64).
În Update() se activează inputfieldul dacă jucătorul are mai mare punctajul decât cel al jucătorului de
pe ultimul loc
36
Odată ce îndeplinește condiția if -ului din Update()
aceasta va lăsa jucătorul să -și scrie numele, și să
apeleze funcția addScore() (Figura65) a aceluiași
script. În această funcție se realizează salvarea
noului numelui jucătorului cu p unctajul respectiv.
Codul funcției este conceput pentru
salvarea a primilor cinci jucători cu cele mai bune
scoruri. Acesta are patru variabile, două string și
două float. Cele două de tip șir de caractere
reprezintă numele jucătorului vechi numită
oldNam e, și numele jucătorului nou numită
newName.
Figura 64 . Declararea variabilelor, funcțiile Start()
și Update() a scriptului HighScores
Similar pentru cele două variabile de tip float,
avem scorul vechi, și scorul nou, numite oldScore,
respectiv newSc ore.
Punctajul nou intrat în topul scorurilor va fi
comparat începând cu cel mai bun scor.
În momentul în care se găsește locul
acestuia se va face schimbarea, iar cel de pe locul
respectiv va fi “scorul cel nou”, continuându -se if-
ul până la ultimul l oc, și realizând schimbările.
Figura 65 . Funcția addScore() a scriptului
HighScores
3.9.7 LoadingImage
LoadingImage este folosit de către toate scenele (Figura 66). Acesta este introdus în codul funcției
LoadScene() din scriptul LoadOnClick(), prin linia de cod LoadingImage.SetActive(true) (Figura 66).
Acesta este format dintr -o componentă UI de tip Image și o componentă fiu de tip text.
37
Figura 66. Elementul Loading Image al Canvas -ului
3.9.8 Main Meniu
Meniul Principal reprezintă o altă scenă ( Figura 67). Este scena de început a jocului, cea pe care o
vede utilizatorul prima dată. Această scenă conține doar obiecte de tipul GUI, precum conțin și scenele
HighScores și Select Car. În această scenă avem un obiect de tip Panel cu numele Background care susține
imaginea de fundal, și un obiect de tip Panel cu același nume , fiu al acestuia, ce susține cele patru butoane
ale meniului: Play, HighScores, SelectedCar și Exit.
Primul buton conduce către scena jocului, cea prezentată până acum. Highscores con duce către tabela
cu cele mai bune scoruri. Butonul Select Car ne permite alegerea între cele două mașini, iar ultimul buton
Exit facilitează ieșirea din joc.
Figura 67. Scena ce cuprinde Meniul Principal
38
Fiecare buton activează funcția LoadScene()
din scriptul LoadOnClick() ( Figura 68 ).
Aceasta primește ca și parametru un număr
int ce reprezintă numărul scenei. Meniul principal
are numărul 0, scena cu jocul numarul 1,
HighScores – 2, iar Car Selection numarul 4.
Figura 68. Componenta onClick() a butonului Play
Legătura între butoane și această funcție se
realizează în editor prin componenta de bază a
unui buton numită onClick() ce este menită să
declanșeze evenimente.
Pentru butonul Play se poate vedea in
(Figura 69) , similar este și pen tru celelalte
butoane, acestea având numărul scenei schimbat.
Meniul principal mai conține în Canvas -ul
acestuia scriptul TheCar, folosit pentru a păstra
alegerea mașinii de către jucător pentru scena
jocului.
Figura 69. Scriptul TheCar.
3.9.9 Highscores
Scena tabelei cu scoruri se poate vedea în Figura 70:
Aceasta prezintă un panel părinte numit Top. Are ca și componente fără descendenți name – numele și score
– scorul. Acesta mai conține un panel numit Scores, ce conține cele 5 locuri ale tabelei, și u n panel numit
Buttons, ce conține butonul de întoarcere la meniu principal (Back – apelează LoadScene() ) și butonul de
resetare a tabelei.
39
Figura 70. Scena tabelei de punctaje
În elementul Scores se află scriptul de umplere a
tabelei.
Scriptul se n umește LeaderBoard. ( Figura 71)
Acesta are ca și variabile trei vectori de șiruri :
-primul este de tip Text numit allChildren, care
preia toate componentele de tip fiu ale acestuia.
-al doilea este de tip string, care incarcă din
PlayerPrefabs numele celo r cinci jucători,
– al treilea de tip float care preia puncajele acestora.
Figura 71. Declararea variabilelor și funcția Start()
a scriptului HighScores
Butonul Reset apelează funcția
ResetHighscores() din același script. (Figura 72)
Aceasta resetea ză tabela și apelează funcția
Start() pentru umplerea cu valori nule a tabelei.
Figura 72. Funcția ResetHighscores() a
scriptului HighScores
40
3.9.10 Car Selection
Ultima scenă este cea a selectării mașinii (Figura 73).
Aici jucătorul își poate alege una din cele două mașini disponibile.
Figura 73. Scena selectării mașinii
Aici sunt prezente elementele d e UI ce susțin
cele două butoane importante, care ne oferă
posibilitatea de a selecta una din acestea, cât și două
obiecte de tip text ce surprind informații despre cele
două mașini.
Ambele apelează scriptul SelectCar (Figura74).
-Prima mașină apelează funția FirstCar() ,
– A doua apelează funcția SecondCar().
Figura 74. Scriptul SelectCar() .
41
Capitolul 4. Concluzii, contribuții și direcții de continuare a dezvoltării
Jocurile pe telefoanele mobile reprezintă un domeniu de viitor. A înregistrat un succes considerabil în
mai puțin de 2 5 de ani de la apariție. Asta înseamnă că un dezvoltator de jocuri se poate bucura de venituri
considerabile.
Jocul îndeplinește cu succes scopul pentru care a fost creat. Acesta este un “endless game” care
provoacă jucătorul să fie mai bun, decât ceilalți jucători aflați în competiție. Pentru a atrage utilizatorii,
jocurile introduc de obicei, un element de conflict foarte bine descris și definit care cere implicarea
jucătorului. Scopul principal în acest joc este d e a realiza punctajul cel mai mare. În a atinge obiectivele,
jucătorul trebuie să acționeze conform legii jocului: evitarea accidentului.
Aplicația poate fi dezvoltată pe mai multe ramuri. Cea care ar ajuta cel mai mult proiectul ar fi partea
de animații și fizică a obiectelor. Totuși și această parte n -ar însemna mult fără prezența a cât mai multor
elemente de grafică. Mediul înconjurător a schimbat întotdeauna soarta multor jocuri. Un jucător cere o
anumită ambiață a jocului, un design reușit va transfo rma jocul radical.Totodată un joc mai complex
înseamnă un joc mai distractiv. Adugarea mai multor elemente sau reguli de joc. O altă ramură ar fi
dezvoltarea pe plan de multiplayer și trecerea jocului intr -un mod 3D sau VR.
42
Bibliografie
[1] http://ro.wikipedia.org/wiki/Spacewar!#/media/File:Spacewar1.png
[2] http:/ /ro.wikipedia.org/wiki/Magnavox_Odyssey#/media/File:Odysseye2m.png
[3] https://ro.wikipedia.org/wiki/Computer_Space#/media/File:Nutting_ComputerSpace -Blue.JPG
[4] http://en.wikipedia.org/wiki/Colossal_Cave_Adventure#/media/File:Colossaladventure.gif
[5] http://ro.wikipedia.org/wiki/Game_Boy#/media/File:Gameboy.jpg
[6] http://www.pocketgamer.biz/feature/10619/a -brief -history -of-mobile -games -in-the-beginning -there -was-
snake/
[7] https://unity3d.com/public -relations
[8] https://www.assetstore.unity3d.com/en/#!/content/5980
[9] https://www.assetstore.unity3d.com/en/#!/content/44
[10] https://www.assetstore.unity3d.com/en/#!/content/2610
[11] https://www.assetstore.unity3d.com/en/#!/content/33675
[12] https://www.assetstore.unity3d.com/en/#!/content/67
[13] https://www.assetstore.unity3d.com/en/#!/content/29602
[14] https://www.assetstore.unity3d.com/en/#!/content/12133
[17] https://www.assetstore.unity3d.com/en/#!/content/13568
[16] https://www.assetstore.unity3d.com/en/#!/content/13168
[17] http://icons.mysitemyway.com/3d -transparent -glass -icons -arrows/
[18] http://imgkid.com/road -texture.shtml
[19] http://seamless -pixels.blogspot.ro/2014/07/grass -4-seamless -turf-lawn -green -ground.html
[20] Novak, Jeannie , Game development essentials : An introduction / Jeannie Novak , 2nd edition
[21] http://ro.wikip edia.org/wiki/Joc_video
[22] http://en.wikipedia.org/wiki/Video_game
[22] http://en.wikipedia.org/wiki/History _of_video_games#Transition_to_3D
43
Anex a 1: Diagrama de clase
44
Anexa 2: Lista de imagini
• Figura 1. Primul joc pe calculator SpaceWar [1]
• Figura 2. Prima consolă de jocuri Magnavox Odyssey [2]
• Figura 3. Primul joc arcade Computer Space [3]
• Figura 4. O versiune cu grafică a jocului Adventure [4]
• Figura 5. Prima consolă portabilă Game boy [5]
• Figura 6. Snake pe telefon mobil Nokia [6]
• Figura 7 . Cota de pia ța mobila a engine -urilor de jocuri dominat ă de Unit y [7]
• Figura 8. Alegerea dezvoltatorilor de jocuri a platformei Unity [7]
• Figura 9. Default P roject în Unity
• Figura 11. Fereastra Project
• Figura 12. ExternalAssets
• Figura 13. Prefabs
• Figura 1 4. Scenele jocului
• Figura 15. Scripturile
• Figura 16. Textures
• Figura 17 . Scene view
• Figura 18. Scena jocului
• Figura 19. GameObjects și Scripturi ale Scenei Jocului
• Figura 20. Prefabs și Script -uri ale Scenei Jocului
• Figura 21. Componenta Box Collider a str ăzii
• Figura 22. Strada jocului și marginile
• Figura 23. Declararea variabilelor și funcția Start() a scriptului AsphaltManager
• Figura 24. Funcția Update() a scriptului AsphaltManager
• Figura 25. Componenta Transform a Player -ului
• Figura 26. Componenta Transf orm a MainCamera
• Figura 27. Componenta Rigidbody a Player -ului
• Figura 28. Variabilele scriptului Player Controller
• Figura 29. Obiectele luate prin drag & drop și introdu -se în Inspector
• Figura 30.Variabilele publice din Inspector ale scriptului Player Cont roller
45
• Figura 31. Funcția Start() a scriptului Player Controller
• Figura 32. Funcția Update() a scriptului Player Controller
• Figura 33. Funcția accelerate() a scriptului Player Controller
• Figura 34. Funcția brake() a scriptului Player Controller
• Figura 35. Funcția decelerate() a scriptului Player Controller
• Figura 36. Cei patru pereți invizibili din scena jocului (scene view)
• Figura 37. Funcția OnTriggerStay() a scriptului Player Controller
• Figura 38. Funcția decelerateOut() a scriptului Player Controller
• Figura 39. Funcția decelerateOut2() a scriptului Player Controller
• Figura 40. Funcția OnTriggerEnter() a Player Controller
• Figura 41. Funcția OnTriggerExit() a scriptului Player Controller
• Figura 42. Funcția getDistance() a scriptului Player Controller
• Figur a 43. Traficul jocului
• Figura 44. Declararea variabilelor și funcția Start() a scriptului CarRandomizer
• Figura 45.Prima parte a funcței Update() a scriptului CarRandomizer
• Figura 46. A doua parte a funcței Update() a scriptului CarRandomizer
• Figura 47. Scr iptul Car
• Figura 48. Funcția Start() a scriptului TreeRandomizer
• Figura 49. Funcția Start() a scriptului VegRandomizer
• Figura 50 Funcția Update() a scriptului TreeRandomizer
• Figura 51. Prima parte a funcției Update() a scriptului VegRandomizer
• Figura 52. A doua parte a funcției Update() a scriptului VegRandomizer
• Figura 53. Scriptul ObjMover
• Figura 54. Funcția OnTriggerExit() a scriptului ObjRemover
• Figura 55. Funcția Awake() a scriptului CarStart
• Figura 56. Obiectele interfață ale scenii jocului
• Figura 57. Funcția Pause() a scriptului MeniuIngame
• Figura 58. Elementele grafice: options, arrows, pause, speed & score
• Figura 59. Funcția Unpause() a scriptului MeniuIngame
• Figura 60. Funcția LoadScene a scriptului MeniuIngame
• Figura 61. Funcția QuitGame a scrip tului MeniuIngame
46
• Figura 62. Elementele grafice ce aparțin de GameOver
• Figura 63. Scriptul GUIManager
• Figura 64. Declararea variabilelor, funcțiile Start() și Update() a scriptului HighScores
• Figura 65. Funcția addScore() a scriptului HighScores
• Figura 66. Elementul Loading Image al Canvas -ului
• Figura 67. Scena ce cuprinde Meniul Principal
• Figura 68. Componenta onClick() a butonului Play
• Figura 69. Scriptul TheCar
• Figura 70. Scena tabelei de punctaje
• Figura 71. Declararea variabilelor și funcția Start() a scriptului HighScores
• Figura 72. Funcția ResetHighscores() a scriptului HighScores
• Figura 73. Scena selectării mașinii
• Figura 74. Scriptul SelectCar() .
Anexa 3:Lista de prescurt ări
SDK= Software Development Kit = pachetul software pentru dezvoltare
Jr.=Junior
DEC PDP-1= Digital Equipment Corporation Programmed Data Processor
PC=Personal Computer =calculator personal
SSI Gold Box=Small Scale Integration Gold Box =Integrare la scara mica Gold Box
ROM= Read Only Memory=Memorie doar accesibila la citire
Mario Bros= Mar io Brothers= Frații Mario
SNES= Super Nintendo Entertainment System
WAP =Wireless Application Protocol= Protocal pentru aplicații fără fir
App=Application=Aplicație
HD=High Definition=Definitie Înaltă (pentru imagini)
iOS=i Operating System=Sistem de oper are Apple
OHA= Open Handset Alliance
47
ARM= Acorn RISC Machine
Mac OS= Macintosh Operating System
OS X=Operating System X=versiunea 10 a sistemului de operare Apple
TV=Television=Televizor
OS 3=Operating System 3=Sistem de operare versiunea 3( pentru televiz oare LG)
Etc=Etetera=și așa mai departe
2D/3D= 2 Dimension/ 3 Dimension=2 dimensiuni (lungime x latime) -plan/3 dimensiuni (lungime x inatime
x latime) -spatial
IDE= Integrated Development Environment= Mediu pentru dezvoltare integrată
.NET=Network=Retea
C#=C Sharp=C diez
C++=C plus plus
USB=Universal Serial Bus= Magistrala Serială Universală
CS6= Creative Suite (Adobe)
Apk= Android packege kit
GUI= Graphic User Interface
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: În lucrarea de fa ță se abordează domeniul jocurilor, mai exact, subdomeniul jocurilor pe [627392] (ID: 627392)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
