Referitor la conținutul lucrării, fac următoarele aprecieri: [307381]
UNIVERSITATEA ”TITU MAIORESCU” DIN BUCUREȘTI
FACULTATEA DE INFORMATICĂ
LUCRARE DE LICENȚĂ
JOC ÎN MOTORUL DE GENERARE GRAFICĂ UNITY3D
COORDONATOR ȘTIINȚIFIC:
Conf. univ. dr. PÎRNĂU Mironela
ABSOLVENT: [anonimizat]
2017
ANEXA NR. 2
UNIVERSITATEA TITU MAIORESCU FACULTATEA DE INFORMATICĂ DEPARTAMENTUL DE INFORMATICĂ
REFERAT
DE APRECIERE A LUCRĂRII DE LICENȚĂ
TITLU: JOC ÎN MOTORUL DE GENERARE GRAFICA UNITY3D
ABSOLVENT: [anonimizat]: CONF. UNIV. DR. [anonimizat]:
[anonimizat] a fi susținută în fața comisiei pentru examenul de licență din sesiunea IUNIE 2017 și o apreciez cu nota________________________.
[anonimizat]. 1
UNIVERSITATEA TITU MAIORESCU FACULTATEA DE INFORMATICĂ DEPARTAMENTUL DE INFORMATICĂ
FIȘĂ DE EVIDENȚĂ A LUCRĂRII DE LICENȚĂ
TITLU: JOC ÎN MOTORUL DE GENERARE GRAFICA UNITY3D
ABSOLVENT: [anonimizat]: CONF. UNIV. DR. MIRONELA PÎRNĂU
CALENDARUL ELABORĂRII LUCRĂRII DE LICENȚĂ
Se va completa de către student: [anonimizat], va trebui să aibă cel puțin trei întâlniri cu profesorul coordonator în vederea finalizării lucrării.
Studenții, [anonimizat].
Introducere
Aplicația dezvoltată de mine are ca scop exemplificarea unora dintre elementele specifice pe care le regăsim în jocurile video de tip RPG. Am urmărit să folosesc tehnici ușor de reprodus și de înțeles deoarece am observat că nu există o [anonimizat], într-[anonimizat].
Motivația a venit din partea pasiunii pentru jocuri și pentru metodele de dezvoltare ale acestora. Doresc să urmez o carieră în domeniul dezvoltării de jocuri deoarece posibilitatea de a crea propriile lumi cu propriile personaje și fire narative și in fond libertatea de a aduce la viață o idee creativă mă atrage. Un plus în acest domeniu îl constituie industria care este în creștere înregistrând o cifra de $91 miliarde în 2016 cu o creștere estimativă de $8.6 miliarde până la finalul anului 2017.
Istoria jocurilor video
Înaintea jocurilor
În anul 1889, [anonimizat] a [anonimizat], cărți. Marafuku s-a [anonimizat] s-a [anonimizat].
[anonimizat] 1891 pune bazele unei companii ce producea lămpi incandescente. [anonimizat]: Zelda și Mario.
O altă consolă celebră este 3DO care este meritul japonezului Konosuke Matsushita. Această consolă a [anonimizat]. Pentru realizarea acestei console a fost necesară și o nouă firmă și anume Electronic Arts.
În 1979 se lansează seria de console Intellivision creată pe 10 biți. Aceasta a fost primă cu care puteai auzi voci umane sau robotice în timp real. Dezavantajul principal al consolei era inexistentă ergonomiei controllerului care avea 12 butoane. Au existat cazuri de răni la degete din cauza presiunii mari cu care trebuia apăsate butoanele.
În 1958, William Higinbotham inventează jocul Tennis for Two, folosindu-se de un computer analog și de un osciloscop. Acesta este folosit în scopul amuzamentului vizitatorilor Laboratorului Național Brookhaven din New York. Pentru a îl juca aveai nevoie de două controllere sub forma unei cutii care aveau câte un buton pentru lovire și respectiv pentru traiectorie. Succesul jocului a durat doar două sezoane pentru că în 1959 a fost dezmembrat.
Un moment foarte important pentru industria jocurilor a fost când un grup de studenți ai unei universități americane programează un joc care avea nevoie de doi jucători pentru a controla navele spațiale să lanseze rachete către oponent. SPACEWAR! După cum a fost denumit, a devenit primul joc cu influență pentru că s-a folosit de nouă tehnologie și a fost vândut chiar și pe internet. Jocul este unul de mare importanță pentru că a avut în componența sa reguli de acțiune, o viziune clară a victoriei și de asemnea competiția dintre doi oponenți. Acest joc a reușit să deschidă multe oportunități pentru mulți alții.
Epoca de aur
În 1975, Don Daglow a scris primul joc ROLE PLAYNG pe mainframe-urile PDP-10. Atunci se naște DUNGEON, care folosea un sistem de calcul al razei de vedere astfel că hărțile pe care jucătorii le vedeau foloseau și efecte de lumină, întuneric. Între timp, pe calculatoarele CDC apare și jocul DND care reprezintă primul joc role playing pentru calculatoare.
Consolele dominante pe piață erau Video Computer System, Intellivision și ColecoVision.
Prima consolă a fost redenumita Atari 2600 și a avut 9 jocuri dezvoltate pe ea iar ulterior a devenit cea mai populară dintre consolele de pe atunci.
Cea de-a doua consolă a fost introdusă în 1980 și era unică pe vremea aceea datorită procesorului capabil de intrucțiuni cu lățime de 10 biți dar și pentru ca avea o memorie cu lațimea de 16 biți.
În anul 1978 se lansează varianta mulți player a jocului Dungeon. De asemenea, Nintendo lansează jocul Computer Othello, de tip arcade. Atari, la rândul lor, lanaseaza și ei un joc arcade FOOTBAL. Astfel a fost inventat și un nou model de controller, TRACKBALL-ul.
SPACE INVADERS a devenit jocul anului și a avut parte de o popularitate foarte mare. Astfel fiind licențiat mai târziu pe PC dar și pe foarte multe console.
Anul 1978 a fost marcat și crearea jocului SPACE WARS. Acesta dispunea de prima grafică poligonală care a apărut până atunci în jocurile video.
Atari dau lovitura în anul 1979 când au primit titlul de prima firmă producătoare de jocuri video dar independentă de firmele de console. COSMOS, o nouă invenție a acestora, nu a devenit însă un mare succes. Era o mașinărie programabilă și portabilă dar alimentarea se făcea la priză, nu la baterii și asta a fost un prim minus. Deși s-au făcut 8000 de precomenzi, la sfârșitul anului 1981, Atari a fost nevoit să își scoată suportul față de această mașinărie.
Atari, dă lovitura cu ASTEROIDS care devine cel mai vândut joc din istoria lor. Acesta a fost un succes mondial pentru că a introdus un sistem de memorare a scorurilor maxime iar jucătorul putea adăuga trei caractere la sfârșitul jocului. Asteroids s-a vândut în aproximativ 80.000 de exemplare doar în Statele Unite.
Perioada 1982-1984
Un eveniment foarte important al acestei perioade a fost când Coleco lansează COLECOVISION și ulterior se aliază cu Sega, Konami și Universal.
Din păcate, pentru Atari era o perioadă proastă. Au lansat pe piață o variantă pentru jocul PAC-MAN dar au realizat prea multe casete față de cerere. Sperând că își revin, lansează și jocul E.T pentru consola VCS dar nici acesta nu încântă prea tare publicul. Au lansat ulterior o serie de console care să concureze cu Intellivision dar și aceasta a fost un eșec deoarece această consolă nu a fost decât o variantă îmbunătățită estetic a jocurilor pentru 2600 și de asemenea încă un minus la avut joystickul fără centrare.
MS. PAC-MAN dezvoltat de Midway, a cunoscut succesul în America, vandandu-se cu peste 115.000 de unități astfel devenind cel mai mare joc arcade.
Computerele personale pentru jocuri se ridică în această perioadă, întrecând consolele. Acest lucru a fost favorat de faptul că pe 7 decembrie, Atari a anunțat că vânzările consolei VCS sunt mult mai mici decât s-au așteptat. Un plus pe care computerul îl avea era designul la care jucătorii se adaptau mult mai ușor.
Cel mai popular computer al acelor vremuri a fost COMMODORE 64. Succesul l-a cunoscut datorită reclamelor și strategiilor agresive pe care firma le foloseau pentru a îl vinde. Acest computer folosea metode avansate pentru acea perioadă astfel că te puteai juca și cu controllerele de la Atari 2600. Commodore 64 este cel mai vândut computer al tuturor timpurilor.
Perioada 1983-1988
Nintendo lansează în 1985 sistemul Nintendo Entertaniment System. La început aceștia au crezut că va fi un eșec dar au fost surprinși să vadă că defapt a devenit o ediție limitată.
Rusia nu pierde timpul așa că proiectează unul dintre cele mai simple jocuri ce putea fi jucat pe PC-uri. A fost denumit Puzzle și mai târziu i s-a schimbat numele în TETRIS, fiind o combinație între tetramino și tenis. În acel moment, jocul devine foarte popular, creând dependentă printre jucători. Computer Gaming World a spus despre Tetris:” amăgitor de simplu și generator de dependentă într-un mod insidios”. Andromeda, o companie britanică obține copyrightul pentru acest joc.
Nintendo, bucurându-se de popularitatea consolei NES în America a decis să se lanseze pe piața internațională cu jocul SUPER MARIO, astfel devine un mare succes.
Anul Nintendo
În anul 1989 se lansează GAME BOY, consola portabilă de la Nintendo care a fost livrat cu jocul Tetris. Acesta avea un ecran mic fără culori dar care a avut un rol important în vânzări.
Au mai existat și alte variante care au venit cu jocurile Super Mario, Breakout.
Un nou eveniment de amploare pentru Nintendo a fost lansarea jocului Super Mario 3 care a devenit cel mai vândut joc al tuturor timpurilor.
Era pe 64 biți
Atari își lansează o consolă pe 64 de biți numită JAGUAR pentru a nu intra în competiție cu generația de 32 de biți care urma să vină în forță. Ulterior, au descoperit că au făcut o decizie proastă pentru că vânzările erau foarte mici. Încă un titlu negativ adus companiei a fost pentru cel mai prost controller făcut pentru un joc video.
Nintendo vine din spate cu o consolă pe 64 biți cu cipuri proiectate de Silicon Graphics. Proiectul a fost lansat sub numele de Nintendo 64 și a fost avantajos pentru că jocurile nu puteau fi piratate.
Un moment de importantă pentru Playstation a fost la finalul anului 1994 când s-au vândut 102 milioane de console.
Epoca modernă
În anul 1999, Sony recunoaște că pregătesc Playstation 2 care va fi bazată pe DVD-uri, și că procesorul va rula la 250 MHz. Peste trei ani, PS2 se vinde la numai 2 zile de la lansare într-un milion de bucăți.
Microsoft a lansat pe piață o consolă numită XBOX cu un sistem de operare bazat pe Windows NT și Windows XP. Norocul celor de la Microsoft a fost că au venit cu ideea de a face Xbox Live, astfel jucătorii putând comunica mai ușor.
Nintendo încearcă să revină pe piață și lansează GAMECUBE care nu folosește DVD-uri fullsize și o serie de miniDVD-uri. Din păcate, nu au reușit să îi întreacă pe cei de la Sony.
Role-Playing Games (RPG)
Sigur că nu a fost destul de bun la început. RPG-ul modern nu seamănă cu strămoșul său, care era o masă de pixeli atașată unui script de aventuri fantastice scrise în grabă. Cele mai vechi RPG-uri au luat curajul lor din lumea pen-and-paper(cu pixul si foaie) a Dungeons & Dragons și au creat acele mecanici de joc în quest-uri dificile, dar care pot fi jucate.
Majoritatea acestor prime titluri, cum ar fi Ultima, Gateway to Apshai și Wizardry, au fost redate prin intermediul unui computer personal sau al consolelor timpurii și au aderat la un set similar de principii.
Personajul tău, uneori împreuna cu un party de prieteni, ar explora harta, ucide monștrii în timp ce așteaptă cu răbdare rândul în luptă, câștigă experiență, echipament și aur în timp ce aduni suficiente provizii si toate cele necesare pentru o bătălie finală cu un personaj negative de nedescris.
Majoritatea abilităților personajului tău erau bazate pe puncte de experiență și niveluri care influențau fiecare lovitură de sabie. Această formulă a devenit mai nuanțată pe măsură ce anii sau trecut, datorită apariției unor modalitati din ce in ce mai sofisticate de programare și grafică, dar obiectivul final pentru majoritatea RPG-urilor a rămas neschimbat.
Cu alte cuvinte, jucătorul este pus intr-un scenariu creat de dezvoltatorul jocului, unde preia controlul unui caracter ficțional (de cele mai multe ori) și i se dau de îndeplinit diferite sarcini pentru a avansa pe firul narativ sau pentru a ajunge la un nivel mai înalt. Succesul acestor acțiuni este determinat de abilitățile caracterului, dificultatea acțiunii si de noroc.
Caracterul câștigă puncte, prin completarea sarcinilor respective, pe care le poate folosii in obținerea unor abilități mai puternice.
În lumea jocurilor video exista foarte multe genuri și sub-genuri de jocuri, ajungând astfel in ziua de azi sa se poată pleca de la un concept pe o bucata de șervet la masă cu prietenii la idei de milioane print-o singura condiție: Cerul este limita! În opinia mea, nu există un gen de joc pe care să îl recunoști mai repede decât RPG-ul.
Cu elemente specifice ca și:
Sistem de inventar (inventory system);
Abilitați diferite (skill tree);
Semne vitale ca și sete, foame, viață (Vitals);
Poveste (Story line);
Mai nou stilul Open world ( jucătorul are posibilitatea sa exploreze toată harta creată încă de la prima inițializare a jocului);
Sistem noapte/zi (Day and night system).
Lista continuă dar am ales să menționez cele mai des întâlnite aspecte ale RPG-ului.
The Witcher 3: Wild Hunt
Sursă: http://www.pcgameshardware.de/The-Witcher-3-Spiel-38488/News/Neue-Screenshots-zeigen-Geralt-beim-Kampf-und-Kartenspiel-1157374/
RPG-urile sunt în mod fundamental jocuri creative: chiar și cele despre distrugerea și nimicirea tuturor inamicilor. Deoarece chiar și acele RPG-uri nu au de-a face cu distrugerea. Este vorba despre construirea și modelarea personajului, a universului in care jucătorul este plasat, astfel încât toate aceste elemente sa favorizeze stilul de joc al user-ului. Explorarea, misiunile și monștrii – acestea sunt piatra de bază din care aduni resurse pentru a-ți modela personajul.
În continuare voi descrie metodele de programare si implementarea acestora în partea practica a licenței.
Medii de programare utilizate
Unity 3D
Unity este un motor de generare grafică utilizat pe mai multe platforme ( PC, console, si mobil) pentru crearea de jocuri video si simulări pe calculator dezvoltat de Unity Technologies. De la prima apariție doar pentru platforma OS X la Conferința Mondială a Dezvoltatorilor in 2005, programul s-a extins pe 27 de platforme iar până in prezent a fost lansat in 5 versiuni majore, a6-a fiind in stadiul de BETA. La show-ul WWDC în 2006, Apple a numit Unity ca fiind cel mai bun program pentru a folosi pachetul lor Mac OS X Graphics.
Fiind comercializat ca și motor de generare grafică general, Unity suportă si grafica 2D dar și cea 3D, funcționalitate drag-and-drop , programare in 3 limbaje predefinite C#, JavaScript, C++.
Interfața Unity:
Interfața consta în:
Fereastra Hierarchy, unde sunt prezente toate obiectele din proiect, cu care lucram;
Fereastra Inspector, unde găsim mai multe detalii si putem manipula obiectele selectate in fereastra Hierarchy;
Project. Din această fereastra preluam toate obiectele, scripturile, animațiile, texturile etc. pe care le putem găsi in calculator.
În fereastra Cosole ne sunt prezentate erorile și/sau avertismentele din partea compilatorului;
Scene. Acesta este spațiul de lucru propriu zis unde interacționăm cu obiectele în lumea virtuală.
Asset Store, magazin de produse Unity ( texturi, obiecte, animații, caractere, efecte etc.)
Animator, fereastra unde controlăm animațiile atașate unui caracter sau obiect;
Fereastra Game unde utilizatorul poate pre-vizualiza jocul.
Unity conține si alte meniuri și sub-meniuri pe care le voi prezenta pe măsură ce acestea vor fi folosite sau relevante în elaborarea lucrării practice.
Unity este cunoscut pentru abilitatea lui de a dezvolta jocuri pe o gama larga de platforme. Unele și cele mai importante fiind: Windows, Mac, Linux, Android, iOS, Xbox One, Xbox 360, PlayStation 4, PlayStation 3, Oculus Rift, OpenGL, Facebook Gameroom, Wii, Wii U, Nintendo ( linia 3DS și acum Switch) etc.
În opinia multor persoane Unity3D rămâne un program perfect pentru cei care sunt la începutul unei cariere în dezvoltarea de jocuri sau vor să își găsească un nou hobby, datorită interfeței ușor de utilizat, prietenoasă (user friendly), dar totodată având un arsenal de unelte pentru developarea în detaliu pentru utilizatorii veterani.
Unity vine și cu un Mediu de Developare Integrat (eng. IDE) care conține:
Un motor de generare a jocului, care permite jocurilor create să ruleze, sa fie jucate, in diferite medii;
Aplicația care permite manipularea obiectelor din scena cu o pre-vizualizare grafică și un buton “Play” pentru a rula jocul;
Un editor de cod ( Unity are pre-instalat MonoDevelop ca și compilator și editor de cod, dar utilizator poate opta pentru orice alta opțiune);
Altfel spus, dupa instalarea Unity pe PC nu mai este nevoie de alte aplicații pentru a creea bazele unui joc.
Ultima varianta a programului Unity 5.0 aduce îmbunătățiri la Physically-based Standard Shader pentru a face materialele sa pară mai consistente in orice condiții de iluminat, pe toate platformele; Iluminare Globala în timp real; Îmbunătățiri ale sistemului audio, pentru un audio de calitate. În același timp avem îmbunătățiri vizuale cu HDR Reflection Probes, Physx 3.3 pentru îmbunătățiri majore ale sistemului 3D physiscs. Update major la sistemul de animații și adauga o funcție de pre-vizualizare a WebGL.
Adobe Photoshop
Un software de editare a imaginilor dezvoltat si produs de Adobe Systems Inc. Photoshop este considerat unul dintre liderii software-ului de editare a fotografiilor.
Software-ul permite utilizatorilor să manipuleze, să modifice, să redimensioneze și să corecteze culoarea pe fotografiile digitale. Software-ul este deosebit de popular printre fotografi profesioniști, designeri grafici dezvoltatori de jocuri, dezvoltatori WEB și amatori în orice domeniu care necesită editare foto.
Photoshop este una dintre cele mai puternice aplicații de editare foto din lume. Când vine vorba de a lucra cu fotografii, nu există aproape nimic ce nu poate face. Chiar și numele "Photoshop" este un cuvânt cheie .
A fost lansat acum mai bine de 25 de ani, cu toate acestea, a preluat o mulțime de caracteristici noi care i-au permis să facă mai mult. Adobe a dezvoltat Cloud-ul Creativ într-o suită de aplicații care se suprapun. Unele instrumente de programe din Illustrator și-au făcut drum în interfața Photoshop și invers mulțumita acestui sistem de Cloud.
Pe lângă posibilitățile de editare foto, Photoshop ajuta și la pictura digitală, unde cu ajutorul tehnologiei și al unei tablete grafice se poate simula un scenariu “ pensulă pe pânză “ .
Programul prezintă și elemente folositoare pentru design grafic, multe din uneltele folosite in InDesign ( program de design grafic din pachetul Adobe) fiind regăsite și în Photoshop cu ajutorul Creative Cloud. În ciuda numelui, utilizatorul poate folosii Photoshop și pentru editare ușoara a fișierelor de tip video.
Blender
Blender este un software profesionist gratuit pentru grafica 3D, cu utilizare open source, folosit pentru crearea de filme animate, efecte vizuale, arta, modele de printare 3D, si jocuri video.
Caracteristicile Blender includ modelarea 3D, texturarea, editare grafice raster, rigging și skinning, simularea lichidelor și a fumului, simulator de particule, sculptarea, animarea, orientarea camerei, redarea, editarea video și compoziția. Dispune de un motor de generare grafică integrat.
Ca și la Unity , avem diferite arii pe care putem lucra sau modifica diverse setari:
Bara Info Editor;
Zona de lucru unde putem vizualiza 3D obiectul la care lucrăm ;
Outliner în dreapta-sus a ferestrei;
Editorul de proprietăți în dreapta-jos a ferestrei;
Timeline-ul la baza ferestrei unde avem posibilitatea sa manipulam timpul;
Pentru un utilizator nou, Blender nu este ușor de înțeles sau de stăpânit deoarece abordează unul din cele mai complexe operațiuni când vine vorba de developarea unui joc video și anume animațiile pe calculator.
Cu toate ca abordează un subiect dificil, aplicația reușește să fie gratuită și sa rămână destul de intuitivă necesitând doar timp, dedicație și dorința din partea utilizatorului. O dată stăpânit Blender devine un program pe care orice dezvoltator de jocuri video se poate baza.
Am folosit Blender în lucrarea practica doar pentru a realiza o animație care cuprinde una din modalitățile prin care programul realizează animațiile si le exportă in Unity3D.
Visual Studio
Inițial sistemul a fost conceput pentru a dezvolta programe de calculator pentru Microsoft Windows, precum și site-uri web, aplicații web și servicii de natură web.
Astăzi, Visual Studio este utilizat pentru a dezvolta aplicații pentru platforme desktop și mobile, pentru console, aplicații web și servicii bazate pe cloud. Programatorii au, de asemenea, propria lor versiune de Visual Studio, care le permite să lucreze la coduri gratuite pe platforme populare cum ar fi Windows, Mac OS X și Linux, PlayStation 4, Xbox One etc.
Compilatorul Visual Studio vine cu suport IntelliSense ( componentă de completare a codurilor). Mai găsim și un sistem gata instalat cu unelte profesionale pentru proiectarea grafica și pentru aplicațiile GUI, proiectare web, proiectare de clase etc.
Visual Studio funcționează pe platformele de top, oferind posibilitatea utilizatorului sa proiecteze pe Android sau iOS in diversele limbaje de programare suportate: C, C++, CLl (visual C++), C#, HTML/XHTML, XML/XSLT, JavaScript, CSS etc.
Caracteristicile principale ale Visual Studio 2015+ ar fi constituite din : Organizarea de task-uri, crearea de permisii, organizarea utilizatorilor, crearea proiectelor, exportare în Excel, identificare de erori, găzduire inclusa, suport online, tutoriale video, versiune completa gratuită etc.
Limbaje de programare
C Sharp (C#)
C # este un limbaj de programare simplu, modern, cu scop general, orientat spre obiect dezvoltat de Microsoft în cadrul inițiativei sale .NET condusă de Anders Hejlsberg.
C # este proiectat pentru Common Language Infrastructure (CLI), care constă din codul executabil și mediul de execuție care permite utilizarea diferitelor limbaje de nivel înalt pe diferite platforme și arhitecturi.
Caracteristici importante:
Condiții bool;
Librărie standard;
Proprietăți și organizare de evenimente;
Compilare condiționată;
Integrare cu Windows;
Ușor de folosit;
Limbajul C# conține mai multe facilități novatoare, dintre care cele mai importante se refera la suportul incorporat pentru componente software. C# dispune de facilități care implementează direct elementele care alcătuiesc componentele software, cum ar fi proprietățile, metodele si evenimentele. Poate cea mai importanta facilitate de care dispune C# este posibilitatea de a lucra intr-un mediu cu limbaj mixt.
Sintaxa:
using System;
class Example1
{
//orice program in C# contine metoda Main()
public static void Main()
{
Console.WriteLine("Program C#”);
}
}
JavaScript
JavaScript este un limbaj de programare utilizat în mod obișnuit în dezvoltarea web. Acesta a fost inițial dezvoltat de Netscape ca mijloc de a adăuga elemente dinamice și interactive pe site-uri web. În timp ce JavaScript este influențat de Java, sintaxa este mai asemănătoare cu C și se bazează pe ECMAScript, un limbaj de creare a scripturilor dezvoltat de Sun Microsystems.
JavaScript este un limbaj “de partea clientului”, ceea ce înseamnă că codul sursă este interpretat de browserul web al clientului, nu de serverul web. Funcțiile JavaScript se pot executa după încărcarea unei pagini Web fără a comunica cu serverul. De exemplu, o funcție JavaScript poate verifica un formular web înainte de a fi trimis pentru a vă asigura că toate câmpurile obligatorii au fost completate. Codul JavaScript poate produce un mesaj de eroare înainte ca orice informație să fie transmisă efectiv serverului.
Sintaxa JavaScript:
function sum(a,b)
{
return a+b;
}
var total = sum(7,11);
alert(total);
Implementarea Aplicației
Prezentarea jocului
Aplicația dezvoltată de mine are ca scop punerea în evidență a unor elemente RPG regăsite în jocuri video, folosind orice element îmi este pus la dispoziție de către Unity3D și implicit orice alt program de editare foto sau compilator ales de mine. Unity oferă posibilitatea de a realiza un astfel de proiect indiferent de nivelul de pregătire al utilizatorului, atâta timp cat acesta are cunoștințe de bază în programare.
Jocul dezvoltat în aceasta aplicație imită o tematică medieval – fantastică.
Partea mecanica a jocului este controlată de scripturi predominant C# iar la apelarea acestor scripturi Unity le interpretează și afișează rezultatul dorit, fie ca vorbim de o decrementare a punctelor de viață ale jucătorului ori de schimbarea valorii unei variabile de tip bool, sau consola deja integrată în Unity va afișa o eroare.
În Unity fiecare element prezent în joc este referit generic ca și obiect. La cel obiect putem atașa condiții, scripturi, elemente de fizică, animații, sunete, texturi, avem posibilitatea de a atașa o sursa de lumina și multe altele. Fie ca vorbim de caracterul jocului sau de un element de game design ambele sunt obiecte dar cu caracteristici si condiții diferite. În prezentare voi trece prin fiecare componentă folosită, condițiile acesteia, scripturi daca este cazul, si potențiale legături cu alte elemente ale scenei.
Scena conține obiectele din jocul creat. Acestea pot fi folosite pentru realizarea unui meniu, nivele individuale și orice alt ceva. Putem percepe aceste scene ca nivele individuale în care încărcăm obstacole, decorații, mediul în care jucătorul v-a interacționa cu aceste obiecte. Când încărcăm o scena noua, aceasta v-a fi goală cu excepția unor obiecte ca sursa de lumină și camera.
În continuare voi prezenta cu lux de amănunte fiecare element major din aplicație făcând referire și la obiectele și componentele care sunt legate de acesta.
Terenul
Exista 2 posibilități principale prin care putem ajunge sa avem un teren cu care jucătorul v-a interacționa. Prima este implementarea directă a terenului prin Unity și modelarea acestuia cu ajutorul uneltelor din fereastra Inspector
.
A doua metodă, ce-a implementată de mine în aplicație, necesita un program care poate salva o imagine în format RAW ca mai apoi Unity sa interpreteze aceea imagine și mai este necesară o hartă de înălțime a unui teren. Am ales pentru această sarcina Photoshop.
Se deschide harta de înălțime în Photoshop se precizează dimensiunea imaginii, se modifică contrastul dacă este necesar și se salvează imaginea cu extensia RAW.
Sursă imagine: https://danielthenerdyguy.co.uk/tag/heightmap/
Nu este obligatoriu ca harta sa fie descărcată și modificată. Se poate crea o hartă de înălțime a unui teren ficțional atâta timp cat avem în vedere faptul că Unity va interpreta înălțimea fiecărui punct de pe teren ca valoare într-o matrice pătratică. Această matrice poate fi reprezentată utilizând o imagine în tonuri de gri (heightmap). Punctele cele mai înalte ale terenului sunt reprezentate în imagine prin zonele de culoare albă, iar punctele cele mai de jos sunt reprezentate implicit de zonele de culoare neagra.
După pregătirea imaginii trebuie sa o importam în Unity ca acesta sa genereze terenul. Inseram un teren nou în scenă, selectam din Inspector mai multe opțiuni apoi vom selecta din secțiunea Heightmap opțiunea Import Raw. Unity va genera terenul.
Modelarea terenului este posibila si după importare folosind uneltele specifice pentru această sarcină.
Toate modificările pe care utilizatorul ar putea sa le aducă terenului din punct de vedere al texturii sau modelării, cât și adăugarea de texturi pentru iarba, flori, copacii se face din componenta Terrain a terenului generat.
Player
Caracterul este cel mai important element al oricărui joc, acesta fiind responsabil cu legătura dintre utilizator și lumea virtuala creată de noi. Complexitatea caracterului este direct proporțională cu complexitatea jocului. Caracterul folosit este unul generic pentru tema aleasă și îl putem găsi pe pagina Asset Store integrată in Unity3D.
După ce am descărcat și importat caracterul, se observă că acesta nu are nici texturile și nici culori aplicate. Pentru aplicarea acestora avem nevoie pentru fiecare componentă a caracterului ( armura 1, armura 2, barbă, păr și piele) câte un material în care vom salva detaliile componentei respective. Când spunem detalii ne referim la parametrii materialului și anume: Albedo, Specular, Normal map, Occlusion. Putem percepe aceste detalii ca fiind niște straturi, iar fiecare strat are ca sarcină determinarea contrastului, texturii, culorii și modului în care umbra cade pe suprafața modelului toate acestea fiind aplicate pe material iar materialul la rândul său aplicat pe modelul caracterului. După setarea parametrilor pentru fiecare material folosim metoda drag-and-drop pentru a aplica aceste materiale pe caracterul nostru.
Avem harta generată și caracterul, următorul pas este sa facem ca jucătorul sa poată să preia controlul caracterului. Acest lucru este posibil prin intermediul animațiilor și al scripturilor care apelează animațiile respective.
Scripturile caracterului
Primul și cel mai important script al caracterului este scriptul de mișcare (Vasile_motion.cs ) care preia comenzile de la tastatură și le interpretează ca apeluri pentru anumite animații sau interacțiuni. În prima parte a codului declarăm toate variabilele pe care le vom folosii și prin linia “anim= GetComponent<Animator>();” facem referire la componenta Animator a caracterului.
Scriptul calculează ptrintr-o funcție un unghiul de rotație al camerei care va determina direcția de mers a caracterului. Cu alte cuvinte utilizatorul schimba unghiul camerei iar caracterul, daca este apelată funcția de mișcare, va merge pe direcția indicată de orientarea camerei.
În acest script găsim si implementarea unghiului de rotație cat și apelurile către variabilele de tip bool care declanșează sau opresc animațiile.
Scriptul de mișcare
Calcul unghi de rotație
Scriptul de mișcare nu este singurul script al caracterului. Următorul pe listă este scriptul cu care echipăm sau dezechipăm arma, în cazul nostru o sabie legată de spatele caracterului, și tot aici vom verifica și vom declanșa și animațiile de atac.
Pentru a putea crea efectul de echipare și dezechipare a săbii trebuie sa ținem cont de doua lucruri esențiale raportate la sabie, și anume : unde este sabia când este echipată și unde este sabia când este dezechipată.
În aplicația de față, sabia în poziția unequipped este pe spatele caracterului într-o teacă legată de armura acestuia. Amintesc că orice caracter în Unity este ca un puzzle format din multe piese care, puse cum trebuie, formează obiectul dorit. Pe baza acestei idei căutăm în elementele caracterului nostru teaca de care se leagă sabia in poziția unequipped . Aici vom crea un obiect gol care va reține poziția săbii când nu este folosită. La fel vom proceda si pentru poziția equip cu diferența ca sabia este în mâna caracterului când este echipată.
Obiectul gol pentru poziția equip Obiectul gol pentru poziția unequip
Ne vom folosi în script de aceste obiecte pentru ca poziția săbii să aibă punct de legătură cu poziția în care trebuie să stea în ambele cazuri( equip și unequip).
Scriptul (Player_sword.cs) conține condiții de verificare ale imputului de la mouse și o condiție care setează poziția săbii egala cu poziția unuia dintre obiectele goale în funcție de stadiul în care este sabia. Daca aceasta este în poziția equip rularea scriptului va rezulta în modificarea poziției săbii în poziția unequipped și viceversa.
Tot aici testăm daca utilizatorul apasă sau nu pe unul dintre butoanele mouse-ului. Daca unul dintre butoane este apăsat caracterul va intra în animația de atac.
Script player_sword
Funcția sword_pull modifica poziția și rotația săbii în momentul în care utilizator apasă butonul Q al tastaturii.
Animații caracter
Unity3D are implementat un editor de animații care funcționează la un nivel de bază oferind utilizatorului posibilitatea de a crea animații la un nivel de începător. Singurul reproș pe care doresc să îl aduc dezvoltatorilor este că editorul de animații nu este valabil în varianta free a programului.
În căutare de alt program am ajuns la concluzia ca Blender este alegerea cea mai potrivită. Chiar dacă nu este cel mai ușor de folosit program de editat animații în schimb oferă unelte și suport ți pentru proiectele mici dar și pentru cele mari.
Recomandarea tuturor dezvoltatorilor de jocuri pentru oricine dorește să creeze un joc este să cumpere animațiile. Majoritatea animațiilor din Asset Store sau de pe orice alt site de componente pentru jocuri sunt făcute cu un sistem numit Motion Capture.
Blender creează animații printr-o metoda foarte simplă. Utilizatorul selectează numărul de cadre pe care vrea sa le aibă animația, cu tasta I adaugă primul și ultimul cadru cheie și intre aceste cadre manipulează obiectul pe care vrea sa îl animeze iar Blender înregistrează schimbările de poziție, rotație și orice altă modificare pe care o face utilizator între acele cadre cheie selectate. Produsul final este salvat cu extensia .fbx și importat în Unity3D
Blender
Editarea animațiilor, punerea în scenă și procesul de looping se pot edita in fereastra Animator reprezentată prin componenta cu același nume din Inspector-ul obiectului selectat.
Daca fereastra nu este prezenta pe ecran o putem selecta din Window Animator.
Cel mai ușor exemplu pentru a înțelege procesul de looping este să implementăm procedeul pe o animație de mers sau alergat. În momentul în care adaugam o animație noua în spatial de lucru al Animator-ului o putem edita prin dublu click. În Inspector observăm detaliile și uneltele pe care le putem folosii. Procesul de looping nu este altceva decât aranjarea animației în asa fel încat sa se repete între anumite cadre. Spunem ca loopăm o animație dar atunci cănd cand dormi ca aceasta sa se repete, cum ar fi intr-un ciclu de mers sau alergat al caracterului. Animațiile sunt măsurate în cadre pe secundă.
Pentru a selecta pe care dintre cadrele animației le vom utiliza în animația finală ne folosim de unealta Lenght.
Pentru o loopare cât mai eficientă într-o animație de mers sau de alergat urmărim să selectăm un cadru de final cat mai asemănător cu primul cadru al animației. Pe exemplu concret urmărim ca animația de alergat sa înceapă și să se termine pe același picior.
Vom selecta opțiunile Loop Time și Loop Pose ca Unity sa interpreteze faptul că vrem sa loopăm animația și ne mai rămâne să selectam opțiunea Bake Into Pose în secțiunile Root Transform Rotation și Root Transform Position (Y) pentru a mișca caracterul în funcție de animație.
Fereastra Animator
După ce aducem toate animațiile în spațiul de lucru va trebui să facem tranziții între ele. Cu cat exista mai multe tranziții între doua animații cu atât tranziția în sine de la una la alta este mai lină. Pentru a iniția o tranziție apăsăm click dreapta pe animația din care tranzităm și apoi click stânga pe animația în care vrem să tranzităm.
Tranzițiile nu numai că definesc cât timp două animații vor fi suprapuse dar și condițiile în care tranziția va avea loc. Pentru a specifica condițiile în care se întâmplă o tranziție ne folosim de zona Conditions prezentă in fereastra Inspector a tranzițiilor. În exemplul de față condițiile sunt reprezentate de parametrii pe care îi apelăm sau le schimbam valoarea în script.
Listă parametri :
movement (int)
angle (int)
slow_jog (trigger)
sprint (trigger)
sword_pull (bool)
Hit (bool)
Hit2(bool)
Jump(bool)
isdead(bool)
Tranziție
Există posibilitatea de a dori rularea a mai multor animații în același timp. În cazul aplicației acesteia dormi sa putem alerga și să echipam sabia în același timp. Menționez că atunci când o animație este în curs de redare aceasta prea controlul asupra tuturor elementelor ce constituie obiectul animat. Unity rezolvă aceasta problemă printr-un element numit Mask (Mască) .
Mascarea ne permite să ignorăm anumite date dintr-un clip de animație având posibilitatea sa rulam animația doar pe anumite parți ale obiectului sau caracterului. Mascarea se poate aplica pe clipurile animațiilor în timp ce le importăm sau când rulăm aplicația. De asemenea Mascarea rezultă și în viteze de procesare mai mari datorită numărului mai mic de date pe fiecare clip.
Inventar
Un alt element RPG important îl constituie inventarul ( Inventory system ) . Caracterul trebuie să aibă posibilitatea de a aduna diferite obiecte, sa aibă unde sa le stocheze și daca este cazul sa aibă posibilitatea de a le folosi. Există mai multe modalități prin care se poate realiza un inventar în Unity dar cea mai ușoară de înțeles este prin intermediul UI ( User Interface).
Cel mai important element al UI este Canvas-ul care constituie zona unde toate elementele de tip UI se gasesc.
Pentru partea de inventar vom avea nevoie doar de un panou din elementele UI pentru a afișa obiectele adunate din mediu de joc. Fiecare obiect va fi reprezentat cu o imagine generica a acestuia.
În scenariul aplicației avem 3 tufișuri cu 3 obiecte diferite care apar aleatoriu în aria tufișului. Caracterul le poate lua din mediul virtual, daca obiectele sunt de același tip vor fi puse pe același slot iar scriptul le va număra.
Odată ajunse in inventar jucătorul poate sa le folosească printr-un click. Dacă sunt mai mult de două obiecte iar playerul dă click pe ele scriptul va decrementa valoare folosită pentru a afișa numărul obiectelor, iar daca avem un singur obiect în urma unui singur click scriptul va scoate obiectul respectiv din panou.
using UnityEngine;
using UnityEngine.UI;
public class Eat : MonoBehaviour
{
public void eat()
{
if (System.Int32.Parse(this.transform.Find("Text").GetComponent<Text>().text) > 1)
{
int tcount = System.Int32.Parse(this.transform.Find("Text").GetComponent<Text>().text) – 1;
this.transform.Find("Text").GetComponent<Text>().text = "" + tcount;
}
else
{
Destroy(this.gameObject);
}
}
}
La prima inițializare a jocului obiectele sunt încărcate aleatoriu. La coliziunea cu caracterul scriptul atașat fiecărui obiect oprește componentele Collider și Mesh Renderer, acestea fiind responsabile cu aria obiectului și respectiv partea vizibilă a obiectului. Cu alte cuvinte obiectul este încă acolo doar ca jucătorul nu îl mai poate vedea sau interacționa cu el. Scriptul este atașat la fiecare obiect în parte.
Respawn obiecte
În momentul în care caracterul se intersectează cu un obiect scriptul caută dacă acel obiect este deja în panou, daca nu este îl număra și îl introduce în panou în funcție de tagul pe care îl prezintă. Scriptul este atașat caracterului.
Script PickUp
Sistemul de viață și deteriorarea acestuia
Pentru a putea ști momentul în care ne apropiem de o moarte sigură, caracterul nostru are nevoie de o bară care să indice punctele de viață rămase. Pe internet există o multitudine de exemple fiecare cu un nivel de dificultate diferit. În aplicație am implementat un sistem ușor de înțeles și de reprodus.
În primul rând acea bară de viață trebuie să reflecte în mod exact câtă viață mai are caracterul, valoarea acesteia să scadă de fiecare dată când caracterul este lovit și în momentul în care valoarea vieții este 0 caracterul să intre într-o stare de inactivitate după ce o animație reprezentativă este rulată.
Pentru bara de viță ne vom folosi de un alt element al UI-ului, și anume elementul Slider. Controlerul permite utilizatorului sa aleagă o valoare numerică cuprinsă intre 0 și 1 sau 1 și 100 car va fi reprezentată intuitiv pe Slider.
Observăm că odată ce am creat sliderul acesta are 3 componente. Pentru aceasta implementare nu vom avea nevoie de componenta Handle așa că o selectam și o ștergem. Daca nu avem componenta Canvas, Unity o va crea automat pentru noi.
Schimbam culoare fundalului din slider cu roșu, iar culoarea câmpului de umplere cu verde. Adăugam o noua componentă UI de tip Text , o poziționăm sub bara de viață ți schimbăm textul în „Health”.
Scriptul va prelua controlul asupra barei de viață prin simpla declarare publică a acesteia “public Slider healthbar;”.
Ca idee principală vom scădea din valoarea totala a vieții o anumită valoare de fiecare dată când un obiect se va intersecta cu colliederul caracterului. Deja sesizăm o problema daca vom construi scriptul in jurul acestei idei.
Este posibil ca în momentul în care caracterul își scoate sabia aceasta sa se intersecteze cu colliederul caracterului și astfel să ne rănim cu propia armă. O soluție la această eroare o reprezintă tagurile.
Pentru a înregistra daună asupra caracterului sau asupra inamicului, atât inamicului cât și caracterului le vom adăuga pe sabie câte o sferă cu mesh-ul oprit pentru a nu putea fi vizibile în timp ce jocul rulează. Când aceste sfere se intersectează cu caracterul nostru sau cu un inamic înregistram daună.
Sferei inamicului îi punem tag-ul „enemy” iar sfera caracterului nostru va avea tag-ul “player”. În script se observă cum printr-o condiție simplă player-ul poate fi lovit doar de sfera cu tag-ul enemy, iar inamicul poate să fie lovit doar de sfera cu tag-ul player.
Dacă valoarea vieții este mai mică sau egală cu 0 se declanșează animația de moarte.
using UnityEngine;
using UnityEngine.UI;
public class VasManager : MonoBehaviour {
public static int health = 100;
public GameObject player;
public Slider healthbar;
public string opponent;
public deathMenu deathMenu;
void Start () {
}
public void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag != opponent) return;
health = health – 20;
healthbar.value = health;
if (healthbar.value <= 0)
{
player.GetComponent<Animator>().SetTrigger("isdead");
deathMenu.ToggleDedMenu(health);
}
}
}
Script VasManager;
Inamicul
Pentru a reprezenta generic inamicul în această aplicație am descărcat din Asset Store pachetul Fantasy monster care conține un schelet animat cu o sabie.
Animațiile sunt organizate în acealași mod ca și la player. Mulțumită scriptului de inteligență artificială nu trebuie să ne facem griji în legătură cu inamicul
.
Scriptul conține funția OnTriggerEnter unde verificăm daca inamicul a fost lovit și in caz afirmativ, tot în această funcție decrementăm punctele de viață iar dacă valoarea este 0, se declanșează animația de moarte.
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag != opponent);
Debug.Log("Lovit");
health = health – 25;
healthEbar.fillAmount = health / startHeath;
if (health <= 1)
{
anim.SetBool("Die", true);
}
}
Inamicul are două stari principale : patrol și pursuing.
În prima stare inamicul patrulează terenul folosindu-se de patru sfere ( numărul poate să varieze) drept waypoint-uri.
Dacă distanța până la punct este mai mare de 0 animația de mers este declanșată iar inamicul începe să se deplaseze spre primul waypoint, iar după ce ajunge in proximitatea acestuia ( mai exact la 2.0f unități ) schimbă direcția spre cel de-al doilea waypoint și va continua în acest ciclu pana când condiția de a trece în starea următoare este îndeplinită.
if (state == "patrol" && waypoint.Length > 0)
{
anim.SetBool("iddle", false);
anim.SetBool("isWalking", true);
if (Vector3.Distance(waypoint[currentWP].transform.position, transform.position) < accuracyWP)
{
currentWP++;
if (currentWP >= waypoint.Length)
{
currentWP = 0;
}
}
direction = waypoint[currentWP].transform.position – transform.position;
this.transform.rotation = Quaternion.Slerp/**/(transform.rotation, Quaternion.LookRotation(direction), rotspeed * Time.deltaTime);
this.transform.Translate(0, 0, Time.deltaTime * speed);
}
Pentru ca NPC-ul să intre în a doua stare trebuie sa se îndeplinească doua condiții: poziția player-ului față de NPC să fie mai mică de 10 unități și tot playerul să fie pe raza unui unghi de 30 de grade (valoarea poate să varieze) cu originea în componenta head a NPC-ului.
După ce aceste două condiții se îndeplinesc inamicul preia poziția player-ului și începe să meargă spre acesta. Dacă ajunge la mai puțin de 1.55 unități distanță( valoarea poate sa varieze dar nu cu mult) se oprește și începe să atace player-ul.
Calcul unghi : float angle = Vector3.Angle(direction, head.up);
if (Vector3.Distance(player.position, this.transform.position) < 10 && (angle < 30 || state == "pursuing"))
{
state = "pursuing";
this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), rotspeed * Time.deltaTime);
if (direction.magnitude > 1.55)
{
this.transform.Translate(0, 0, Time.deltaTime * speed);
anim.SetBool("isWalking", true);
anim.SetBool("isattack", false);
}
else
{
anim.SetBool("isattack", true);
anim.SetBool("isWalking", false);
}
}
else
{
anim.SetBool("isWalking", true);
anim.SetBool("isattack", false);
state = "patrol";
}
Principiul prin care afișăm viața NPC-ului este asemănător cu cel folosit pentru player, singura diferență fiind că nu mai folosim un Slider ci o imagine.
Componenta UI Image
4.5 Sistem Zi/Noapte
Când încărcăm o nouă scenă aceasta ne generează automat și o componentă Directional Light reprezentând astfel un soare virtual. Ca orice altă componentă o putem manipula din fereastra Inspector sau dintr-un script.
Scriptul atașat se ocupă de rotația soarelui pe axa X pentru a obține efectul de răsărit și apus. Tot în script, cu ajutorul unor valori, controlăm intensitatea luminii generate de soare.
Pentru mai mult realism, prin script, am declarat o variabilă „time” prin care controlăm lungimea “nopții” și a “zilei”, pentru ca într-o versiune viitoare a jocului să putem implementa și un sistem de anotimpuri.
function Update () {
sun.transform.Rotate(Time.deltaTime/time,0,0);
hour +=Time.deltaTime/time;
if (hour>= 360) {
hour=0;
}
if(hour>=180) {
time= NightLenght;
sun.intensity -=Time.deltaTime;
}
if (hour<=180) {
time=dayLenght;
sun.intensity +=Time.deltaTime;
}
if(sun.intensity>=1){
sun.intensity=1;
}
if(sun.intensity<=0.2){
sun.intensity=0.2;
}
}
Scene adiționale
Meniu
Pentru a avea un meniu înainte de a intra în zona de gameplay am creat o nouă scenă care va fi urcată ulterior în build împreună cu scena principală.
Am adăugat un teren în scenă căruia i-am aplicat o textură de iarbă și pe care l-am modelat. Terenul nu contează atât de mult deoarece vom crea un simplu fundal pentru meniul jocului.
Am pus în scenă o cameră la care am atașat diferite filtre pentru a crea un efect de out-of-focus cu contrast puternic, o componentă directional light pentru o sursă difuză de lumină, și un sistem de particule.
Sistemul de particule este soluția oferită de Unity când avem nevoie de efecte ca: lichide în mișcare, fum, nori, flăcări etc. Particulele sunt imagini mici, simple sau mesh-uri afișate și mișcate în număr foarte mare de către sistemul de particule. Fiecare particulă reprezintă o parte dintr-o entitate amorfă iar toate aceste particule împreună dau efectul de o entitate unitară. De exemplu pentru a crea un nor de fum fiecărei particule i se atribuie o textură de fum (poate fi o imagine). Când toți acești “mini-nori” sunt puși împreună, efectul per total este de un nor plin de volum.
Fiecare particulă are o durată de viață predeterminată, 2-3 secunde( variabila poate sa fie schimbată ) în timpul căreia poate trece prin mai multe schimbări. Sistemul emite particule în poziții aleatorii într-un spațiu de formă sferică, conică, cubică etc. Particula este vizibilă pana când timpul de viață expiră.
Particulele pot fi afectate de gravitație, vânt, forțe. Fiecare are o velocitate care determină direcția și distanța pe care o parcurge în fiecare cadru. Culoarea, mărimea și rotația pot fi și ele schimbate în timpul vieții lor sau în proporție cu viteza lor de deplasare.
Meniul de start
În meniu mai avem un Canvas care conține sigla jocului și doua butoane, Play și respectiv Exit. Butonul Play încarcă scena principală a jocului iar butonul Exit închide aplicația.
După moarte
După moartea player-ului am vrut să ofer posibilitatea jucătorului să reîncarce scena sau să se întoarcă la meniul principal de unde poate să închidă aplicația.
În scena principală pe Canvas-ul deja existent folosit pentru a afișa HUD-ul jocului am adăugat o imagine cu fundalul negru, două butoane și un text.
Tranziția de la interfața jocului la meniul de după moartea player-ului este controlată de un script apelat sub aceeași condiție cu animația de moarte și de o variabila de tip bool. Pentru lucrul cu scene în Unity3D trebuie să referim clasa SceneManager din pachetul UnityEngine.
Scriptul manipulează imaginea de fundal după ce am declarat-o public: public Image backgroundImg; . În funcția Update se realizează tranziția ,sub condiția pusă de variabila bool, prin funcția backgroundImg.color. Pentru efectul de întunecare treptată am folosit funcția color.Lerp care face tranziția intre 2 culori în funcție de un timp dat.
Funcția ToggleDedMenu are ca parametru variabila health ( unde reținem viața player-ului). Când health = 0 funcția declanșează tranziția ecranului și încărcarea butoanelor.
Script deathMenu.cs
Am creat pentru fiecare buton în parte o funcție care încarcă scena principala și meniul folosind LoadScene.
Vom atașa imaginii scriptul prezentat mai sus componentei deathMenu și vom face referință la imagine prin metoda drag-and-drop în componenta scriptului.
Butoanele în Unity oferă utilizatorului posibilitatea de a crea un eveniment “On click”. Atașăm scriptul deathMenu în componentă după care selectăm funcția „restart” pentru butonul „Play” și funcția „sMenu” pentru butonul „Menu”.
Death Screen
Concluzii
În încheiere doresc să menționez că atunci când vrem sa dezvoltăm un joc de calitate trebuie să luă în considerare faptul că este un proiect complex, pe multe niveluri de developare cuprinzând dar fără a se limita la : programare, animare, design grafic, tehnologi web etc. și cel mai indicat este să avem cel puțin un specialist pe fiecare departament pentru a obține un produs de calitate superioară de pe urma căruia putem profita.
Aplicația este stabilă și prezintă cu succes elementele RPG-ului modern într-o manieră ușor de înțeles.
Pe viitor urmăresc să perfecționez tehnicile folosite și să îmbunătățesc aplicația din toate punctele de vedere. În materie de completare putem adăuga un scenariu, alte caractere umane, extinderea hărții etc.
Bibliografie
Lucrări de specialitate si cursuri
Herbert Schildt, C#, Ed.Teora, 2002
Curs Photoshop- Universitatea „Politehnica” Bucuresti
Bauer, Peter,Photoshop CC for Dumies,2013, Pag:63-105
Goldstone, Will, Unity Game Development Essentiales, Packt Publishing
Geig, Mike, Sams Teach Yourself Unity Game Development in 24 Hours, Sams, 2013
Surse internet
https://en.wikipedia.org/wiki/Adobe_Photoshop
https://docs.unity3d.com/Manual/UnityManual.html
https://designagame.eu/2013/12/unity-popular-videogame-development/
https://en.wikipedia.org/wiki/Unity_(game_engine)
https://en.wikipedia.org/wiki/Video_game_development
http://www.ign.com/articles/2011/10/25/a-history-of-console-rpgs
https://techterms.com/definition/javascript
https://docs.blender.org/manual/en/dev/interface/window_system/introduction.html
https://www.techopedia.com/definition/27052/role-playing-game-rpg
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: Referitor la conținutul lucrării, fac următoarele aprecieri: [307381] (ID: 307381)
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.
