scieee AI-readable full text Open interactive document viewer

Desenvolupament de videojocs 2D amb Unity

Vilardell Tapiol, Lluís

Abstract

Aquest projecte consisteix en el disseny d’un videojoc per computador, així com la seva implementació utilitzant el software la plataforma de desenvolupament Unity, realitzat amb el llenguatge de programació C#. El resultat és un prototip d’aquest videojoc disponible per a sistemes operatius Windows i Linux. Es tracta d’un videojoc per un jugador, del tipus plataformes i acció en vista lateral 2D, basat en mapes de bits anomenats sprites. En aquesta memòria s’explica amb detall les característiques que es desitgen en el joc final, així com la metodologia emprada per implementar algunes d’aquestes característiques en el prototip. En la realització del prototip, s’ha utilitzat principalment Unity per implementar tots els elements que el conformen, excepte en la creació de nivells. Per realitzar aquesta tasca s’ha utilitzat el software Tiled per crear mapes basats en tiles, que són mapes de bits d’una mateixa grandària que es combinen en forma de graella per crear el mapa de bits que representa el nivell complert. Posteriorment, aquests nivells s’han importat a Unity mitjançant la utilitat Tiled2Unity.

Full text

Treball de Fi de Grau Grau en Enginyeria en Tecnologies Industrials Desenvolupament de videojocs 2D amb Unity MEMÒRIA Autor: Adrià Sánchez Moreno Director/s: Lluis Solano Albajes Convocatòria: Gener 2016 Mes Any Grau en Enginyeria en Tecnologies Industrials Adrià Sánchez Moreno Escola Tècnica Superior d’Enginyeria Industrial de Barcelona Desenvolupament de videojocs 2D amb Unity Pág. 1 Resum Aquest projecte consisteix en el disseny d’un videojoc per computador, així com la seva implementació utilitzant el software la plataforma de desenvolupament Unity, realitzat amb el llenguatge de programació C#. El resultat és un prototip d’aquest videojoc disponible per a sistemes operatius Windows i Linux. Es tracta d’un videojoc per un jugador, del tipus plataformes i acció en vista lateral 2D, basat en mapes de bits anomenats sprites. En aquesta memòria s’explica amb detall les característiques que es desitgen en el joc final, així com la metodologia emprada per implementar algunes d’aquestes característiques en el prototip. En la realització del prototip, s’ha utilitzat principalment Unity per implementar tots els elements que el conformen, excepte en la creació de nivells. Per realitzar aquesta tasca s’ha utilitzat el software Tiled per crear mapes basats en tiles, que són mapes de bits d’una mateixa grandària que es combinen en forma de graella per crear el mapa de bits que representa el nivell complert. Posteriorment, aquests nivells s’han importat a Unity mitjançant la utilitat Tiled2Unity. Pág. 2 Memòria Sumari RESUM ______________________________________________________ 1 SUMARI _____________________________________________________ 2 1. GLOSSARI _______________________________________________ 5 2. PREFACI ________________________________________________ 7 2.1. Origen i motivació del projecte ........................................................................ 7 3. INTRODUCCIÓ ____________________________________________ 9 3.1. Objectius del projecte ...................................................................................... 9 3.2. Abast del projecte ............................................................................................ 9 4. DISSENY CONCEPTUAL DEL VIDEOJOC ____________________ 10 4.1. Descripció general ......................................................................................... 10 4.2. Mecàniques de joc ......................................................................................... 10 4.2.1. Condicions d’èxit i fallida ........................................................................................ 11 4.2.2. Millora progressiva del personatge ....................................................................... 11 4.2.3. Finals ....................................................................................................................... 12 4.3. Personatges jugables .................................................................................... 12 4.3.1. Moviments............................................................................................................... 12 4.3.2. Armes ...................................................................................................................... 13 4.3.3. Habilitats .................................................................................................................. 14 4.4. Personatges no jugables ............................................................................... 14 4.4.1. Aliats i personatges neutrals .................................................................................. 15 4.4.2. Enemics .................................................................................................................. 16 4.5. Objectes ........................................................................................................ 16 4.5.1. Objectes col·leccionables ...................................................................................... 17 4.5.2. Objectes consumibles ............................................................................................ 18 4.5.3. Objectes interactius ................................................................................................ 18 4.6. Interfície gràfica d’usuari ................................................................................ 18 4.6.1. Menú Principal ........................................................................................................ 19 4.6.2. Introducció a la trama ............................................................................................. 20 4.6.3. Mapa del món ......................................................................................................... 21 4.6.4. Interfície dins del joc ............................................................................................... 22 4.6.5. Pantalla fi de nivell .................................................................................................. 23 4.6.6. Menú de pausa ....................................................................................................... 23 Desenvolupament de videojocs 2D amb Unity Pág. 3 4.6.7. Menú d’opcions ...................................................................................................... 25 4.6.8. Crèdits ..................................................................................................................... 25 4.6.9. Extres ...................................................................................................................... 26 4.7. Nivells i trama ................................................................................................ 27 5. IMPLEMENTACIÓ GENERAL DEL DISSENY __________________ 30 5.1. Motor de joc i llenguatge de programació ...................................................... 30 5.2. Treballant amb Unity ...................................................................................... 31 5.2.1. Escena (Scene)...................................................................................................... 31 5.2.2. GameObjects ......................................................................................................... 31 5.2.3. Components més comuns .................................................................................... 33 5.2.4. Classe MonoBehaviour i funcions predefinides ................................................... 38 5.2.5. Input ........................................................................................................................ 39 5.2.6. Prefabs .................................................................................................................... 40 5.2.7. Etiquetes ................................................................................................................. 40 5.3. Recursos artístics .......................................................................................... 41 5.3.1. Personatges i objectes .......................................................................................... 43 5.3.2. Nivells ...................................................................................................................... 46 6. IMPLEMENTACIÓ DEL PERSONATGE PRINCIPAL _____________ 48 6.1. Màquina d’estats ............................................................................................ 48 6.2. Moviments...................................................................................................... 52 6.2.1. Córrer ...................................................................................................................... 52 6.2.2. Saltar ....................................................................................................................... 53 6.2.3. Rodar ...................................................................................................................... 54 6.3. Armes............................................................................................................. 55 6.3.1. Canó làser, mode foc ràpid ................................................................................... 55 6.3.2. Implementació general d’armes secundàries ...................................................... 58 6.3.3. Bomba .................................................................................................................... 59 6.3.4. Raig làser ................................................................................................................ 60 7. IMPLEMENTACIÓ D’ENEMICS, OBJECTES I NIVELLS __________ 62 7.1. Enemics ......................................................................................................... 62 7.1.1. Drac (Patrulla amb envestida) ............................................................................... 63 7.1.2. Torreta (Fix amb dispar) ........................................................................................ 64 7.2. Objectes ......................................................................................................... 66 7.2.1. Objectes col·leccionables ...................................................................................... 66 7.2.2. Objectes consumibles ........................................................................................... 67 7.2.3. Objectes interactius................................................................................................ 68 Pág. 4 Memòria 7.3. Nivells ............................................................................................................ 69 8. INTERFÍCIE D’USUARI, CONTROLS I SONS __________________ 72 8.1. Interfície d’usuari i menús .............................................................................. 72 8.2. Controls ......................................................................................................... 75 8.3. Sons .............................................................................................................. 76 9. CARACTERÍSTIQUES NO INCLOSES AL PROTOTIP ___________ 77 10. PLANIFICACIÓ I PRESSUPOST _____________________________ 78 10.1. Planificació ..................................................................................................... 78 10.2. Pressupost ..................................................................................................... 79 11. CONSIDERACIONS MEDIAMBIENTALS ______________________ 81 CONCLUSIONS ______________________________________________ 83 AGRAÏMENTS _______________________________________________ 85 BIBLIOGRAFIA ______________________________________________ 86 Referències bibliogràfiques ..................................................................................... 86 Bibliografia complementària .................................................................................... 86 Aquí pot anar el títol del vostre TFG/TFM Pág. 5 1. Glossari - Sprite: Un sprite és, als videojocs, un element gràfic que es pot desplaçar sobre la pantalla. En principi, un sprite és parcialment transparent, i pot ser animat (és a dir, és format de diversos mapes de bits que apareixen uns sobre els altres). El fons de la pantalla constitueix generalment l'escenari i els sprites són els personatges i objectes que se superposen al fons de la pantalla i que es desplacen. Un sprite també pot de vegades passar darrere un element del fons de la pantalla. - Tile: Els tiles són mapes de bits de forma quadrada, rectangular o hexagonal utilitzats per representar l’àrea de joc en alguns videojocs. El conjunt complert dels tiles disponibles per una àrea concreta s’anomena tileset. Els tiles es disposen de manera adjacent entre si en una graella i, usualment, alguns tiles es poden superposar als altres, per exemple quan un tile que representa el terreny es superposa a la imatge de fons. - Script: En informàtica, un script o guió és un programa, normalment simple, que generalment s’emmagatzema en un arxiu de text pla. Els scripts són gairebé sempre interpretats, però no tot programa interpretat és considerat un script. L’ús habitual dels scripts és realitzar tasques com combinar components, interactuar amb el sistema operatiu o amb l’usuari. - Mecàniques de joc: Les mecàniques de joc es defineixen com les regles o conjunt de regles que tenen com a objectiu aconseguir una sèrie de resultats coherents dins del propi joc. Els jocs complexes, com els jocs de rol, poden disposar d’una gran quantitat de regles interconnectades entre si. Aquí pot anar el títol del vostre TFG/TFM Pág. 7 2. Prefaci 2.1. Origen i motivació del projecte La principal motivació per aquest projecte és la meva gran afició pel món dels videojocs, així com la bona experiència que han suposat les assignatures relacionades amb la programació que he cursat a l’escola. Les assignatures obligatòries de primer i segon del Grau en Enginyeria en Tecnologies Industrials, Fonaments d’informàtica i Informàtica van despertar en mi un gran interès per la programació, i durant la carrera he anat cursant diferents assignatures optatives i projectes relacionats amb aquest camp. No és la meva primera experiència en el camp del desenvolupament de videojocs, doncs una de les assignatures optatives que he cursat és Jocs per Computador, on vam crear un petit joc basat en Flash, amb el llenguatge ActionScript. En ser una assignatura optativa, el nombre d’hores de dedicació és bastant limitat, i vaig pensar que aquest treball seria una gran oportunitat per aprofundir en el tema. Un altre motiu pel que he decidit realitzar aquest projecte és diversificar els meus coneixements en quant a llenguatges de programació, doncs en la majoria d’assignatures del grau hem utilitzat Python. Pág. 8 Memoria Desenvolupament de videojocs 2D amb Unity Pág. 15 quant al seu aspecte. Tot i això, sí es determina tipus de personatges no jugables que s’implementaran al joc i les seves funcions. Segons la interacció amb el jugador, existeixen dos tipus de personatges no jugables: - Aliats / neutrals: En aquesta classificació s’inclouen els personatges que, o bé ajuden al protagonista a aconseguir el seu objectiu o bé no interfereixen en la compleció d’aquest. Un exemple d’aquest tipus de personatges seria Toke, que proporciona un vestit robòtic al protagonista o el propietari de la botiga on el jugador pot comprar pocions curatives o munició. Generalment aquest tipus de personatges es troben fora de les seccions jugables. - Enemics: Aquest tipus de personatges s’oposen al protagonista i intenten que fracasi en la seva missió, i habitualment es troben a les parts on el jugador te control del personatge. L’enemic principal és Grimgrorn, que dóna ordres als altres enemics del joc. A la vegada, aquest tipus de personatges es poden classificar en dos categories, enemics comuns o enemics finals. Els enemics comuns, com el seu nom indica, apareixen de forma repetida al llarg dels nivells, mentre que els enemics finals juguen un rol a la trama del joc i apareixen únicament una vegada, generalment al final d’una fase determinada. 4.4.1. Aliats i personatges neutrals Els personatges classificats dins d’aquesta categoria són aquells que no mostren un comportament hostil envers el protagonista. En base a la seva funció en la trama, es pot diferenciar entre aliats i personatges neutrals. Els aliats són aquells personatges que intenten ajudar al personatge a aconseguir el seu objectiu, ja sigui per motius propis o per conveniència. La llista d’aliats és la següent: - Toke: És un altre estudiant en la mateixa situació que el protagonista. Quan el protagonista arriba al món dels somnis, Toke ja ha estat atrapat durant un llarg període de temps. Degut a que les seves capacitats físiques no són bones, Toke ha dedicat el seu temps dins del món dels somnis a crear un vestit robòtic per quan aparegui un estudiant amb les qualitats adequades. - Waldan: Waldan és l’estudiant que més temps ha estat atrapat dins del somni. Les seves capacitats físiques eren excepcionals, però degut a que ha persistit durant tant de temps al món dels somnis, ha envellit i no pot utilitzar el vestit robòtic de Toke de manera eficaç. Aquest personatge actua com a mestre, ensenyant al protagonista noves habilitats. Pág. 16 Memòria En quant als personatges neutrals, es tracta bàsicament de comerciants que tot i no sentir-se particularment identificats amb els objectius del jugador, no tenen motius per oposar-se al protagonista. Els personatges neutrals del joc són el propietari de la botiga i el propietari de la posada. 4.4.2. Enemics Com s’ha esmentat amb anterioritat, els enemics es divideixen en enemics comuns i enemics finals. Els enemics comuns presents al joc són, segons la seva funció: - Patrulla: El personatge camina contínuament, voltejant quan arriba a un punt determinat. Aquest comportament és utilitzat habitualment en combinació amb altres accions. - Patrulla amb dispar: Realitza la mateixa funció que un enemic tipus Patrulla, però quan el personatge es troba al seu rang de visió dispara en la direcció d’aquest. - Patrulla amb envestida: Novament, aquest enemic realitza patrulla fins que veu al personatge. Un cop ho fa, incrementa la seva velocitat i avança cap al personatge per causar-li danys per contacte. - Patrulla amb explosió: Aquest tipus d’enemic és molt similar a un de tipus Patrulla amb envestida, però en lloc de buscar el dany per contacte, un cop està suficientment proper al personatge, s’immola provocant dany en un radi determinat. Habitualment són enemics voladors. - Fix amb dispar: L’enemic no té capacitat de moviment i dispara projectils de forma continuada, obligant al jugador a esquivar-los. Pel que fa als enemics finals, cada nivell excepte el tutorial compta amb un enemic final, amb un comportament i aspecte visual per definir. L’únic enemic final definit és Grimgrorn, que serà l’últim enemic a superar abans de completar el joc. 4.5. Objectes Durant el transcurs del joc, s’utilitzen objectes que interactuen de diferents maneres amb el jugador. Aquests objectes es poden classificar segons la seva funció de la següent manera: - Objectes col·leccionables: Si el personatge col·lideix amb un objecte col·leccionable, aquest desapareix i s’afegeix al nombre d’objectes que el jugador posseeix. Un exemple Desenvolupament de videojocs 2D amb Unity Pág. 17 d’objecte col·leccionable serien les monedes. - Objectes consumibles: Els objectes d’aquest tipus desapareixen un cop utilitzats, i habitualment creen algun efecte sobre el jugador o el seu entorn. Els objectes consumibles poden ser emmagatzemats per el jugador per així gaudir del seu efecte en varies ocasions, com per exemple les pocions de vida. - Objectes interactius: El personatge pot interactuar amb aquests objectes si entra en contacte amb ells. La interacció que es duu a terme depèn de l’objecte en qüestió, per exemple si és una escala el jugador pot pujar o baixar per ella. 4.5.1. Objectes col·leccionables Com s’ha mencionat amb anterioritat els objectes col·leccionables són acumulats pel personatge principal, complint diferents funcions en cada cas. En general els objectes d’aquest tipus són presents per defecte als nivells tot i que en alguns casos poden ser obtinguts quan es derrota a un enemic. Els tipus d’objectes col·leccionables presents en el joc són: - Monedes: Les monedes permeten la compra de tot tipus d’objectes beneficiosos per al jugador, com per exemple pocions per recuperar salut o munició per les armes secundàries. - Munició per armes secundàries: Les armes secundàries són armes d’us limitat, per aquest motiu s’utilitza un sistema de munició. Quan es recull munició es restaura un nombre d’usos determinat, que varia depenent de l’arma. - Millores: Com el seu nom indica, les millores permeten augmentar les capacitats del protagonista. Normalment les millores es troben amagades per tal que el jugador hagi d’explorar de manera exhaustiva el nivell que està jugant, tot i que algunes millores es poden comprar amb monedes. Els tipus de millores que es poden obtenir són: o Millora de salut: augmenta la salut màxima del personatge. o Millora de munició: augmenta la munició màxima de les armes secundàries. Cada tipus d’arma secundària té la seva pròpia millora. o Millora de capacitat de pocions: permet tenir més pocions regeneradores de salut. o Millora de dany: augmenta el dany de les armes principals. Cada arma Pág. 18 Memòria principal compta amb la seva millora de dany. - Apunts: Els apunts són utilitzats únicament a mode de col·leccionisme. No tenen un ús concret més enllà de que són requerits per aconseguir el final definitiu del joc. 4.5.2. Objectes consumibles La principal característica d’aquests objectes és que són d’un sol ús tot i que es pot disposar de més d’un objecte de cada tipus, pel que no són objectes que apareguin únicament una vegada durant el transcurs del joc. Aquest tipus d’objectes normalment s’adquireixen a la botiga, tot i que també poden ser trobats en els nivells. Els objectes disponibles són: - Pocions de vida: És l’objecte consumible més comú, i en ser utilitzat recupera un 30% de la vida màxima del jugador. - Beguda energètica: Quan es consumeix, proporciona un augment del 25% en el dany que provoca el protagonista durant 30 segons. - Bateria: En ser consumit, regenera els escuts del vestit robòtic en la seva totalitat. 4.5.3. Objectes interactius Els objectes interactius són aquells que permeten al jugador realitzar accions quan entra amb contacte amb ells. A continuació es mostra la llista dels objectes interactius disponibles en el joc: - Escales: Escales de mà que permeten al personatge ascendir i descendir per elles. - Cartells: Cartells amb informació per al jugador, com per exemple els controls del joc, pistes del camí a seguir, etc. - Portes: Alguns edificis comptaran amb portes que habiliten la entrada a l’interior dels mateixos. Habitualment no requeriran cap condició especial per ser obertes, però en alguns casos és necessari l’ús de monedes. 4.6. Interfície gràfica d’usuari La interfície gràfica d’usuari (GUI) és un element de gran importància a l’hora de transmetre informació a l’usuari. Aquesta interfície permet al jugador interactuar amb els esdeveniments que poden tenir lloc dins del joc i actua com a pont entre els dispositius físics com el teclat o un comandament de joc i el món del propi joc. Segons la capacitat de l’usuari per controlar el Desenvolupament de videojocs 2D amb Unity Pág. 19 personatge, es divideixen les finestres en dues categories: interfícies dins del joc i interfícies fora del joc. La interfície fora del joc realitza la funció de proporcionar a l’usuari un entorn agradable i intuïtiu que el permeti navegar entre les diferents finestres del joc. És important que els menús siguin simples i el text que els acompanya descrigui de forma clara quina és la seva funció, d’aquesta manera l’usuari podrà transitar entre les escenes sense problemes. Per altra banda, la interfície dins del joc té com a objectiu principal mostrar informació útil per al jugador de manera clara i directa, sense necessitat d’interrompre la partida. En aquest cas també és molt important que la informació estigui ben distribuïda per tal que l’usuari hagi de desviar la seva atenció sobre el joc el mínim possible. Per començar a definir com serà la interfície gràfica d’usuari cal determinar quin serà el flux dels menús, obtenint així una representació clara de com el jugador es podrà moure a través de les diferents finestres del joc. Figura 4.1. Diagrama de flux dels menús El següent pas és definir quins elements estaran presents a cada una de les escenes, tal com es pot veure en els apartats posteriors. 4.6.1. Menú Principal El menú principal és el primer contacte del jugador amb el joc un cop aquest sigui executat, i està format de botons de text que permeten escollir que fer a continuació. Pág. 20 Memòria Figura 4.2. Menú principal Com es pot comprovar a la Figura 4.2, les funcions del menú són bastant clares: - Continuar: El joc comença al punt on l’usuari va guardar partida en la seva darrera sessió de joc. - Nova partida: S’esborra la partida actual i el joc comença des de l’inici. Per evitar que un possible error humà esborri la partida de forma inintencionada, cal afegir un menú de confirmació quan es selecciona aquesta opció que pregunti a l'usuari si realment vol esborrar la seva partida. - Opcions: Carrega la finestra d’opcions, on el jugador pot modificar alguns paràmetres per adaptar el joc a les seves preferències. - Extres: Aquest menú permet accedir a una secció amb afegits al mode principal del joc. Per exemple s’hi pot trobar una enciclopèdia d’enemics on es mostren totes les dades dels enemics vençuts o estadístiques de la partida actual. - Crèdits: Mostra els crèdits i agraïments del joc. - Sortir: Tanca el joc. Com en el cas del botó de Nova partida, es requerirà confirmació per sortir del joc per evitar possibles actes involuntaris. 4.6.2. Introducció a la trama Quan el jugador inicia una nova partida, es mostra la finestra d’introducció a la trama. En aquesta finestra es posa a l’usuari en situació i s’explica quin és el context de la història que es desenvolupa un cop iniciada la partida. Desenvolupament de videojocs 2D amb Unity Pág. 21 Figura 4.3. Introducció a la trama Com s’aprecia a la Figura 4.3, aquesta finestra mostra un text que apareix gradualment en pantalla a mesura que les línies es desplacen verticalment. També existeix la possibilitat d’ometre aquesta pantalla, per aquells usuaris que ja hagin jugat amb anterioritat i coneguin la trama. 4.6.3. Mapa del món Una vegada començada l’aventura, a través del botons del menú principal Nova partida o Continuar, s’accedeix a un mapa del món que permet seleccionar entre els diferents nivells disponibles, així com la ciutat principal on es troben la botiga i la posada. Figura 4.4. Mapa del món Els nivells seran presentats de forma diferent en funció de l’estat de compleció o les Pág. 22 Memòria característiques que presentin. La classificació realitzada és la següent: - Nivells especials: Són aquells que no contenen les mecàniques jugables característiques del joc i generalment no poden ser completats. L’únic nivell especial del joc és la ciutat, ja que s’utilitza per comprar objectes i recuperar salut. - Nivells completats: Són els nivells que el jugador ha superat. Es poden tornar a jugar en qualsevol moment, però l’enemic final de cada nivell només apareix el primer cop que es juga. En el diagrama, l’usuari ha completat els nivells 1, 2 i 3. - Nivells desbloquejats: Nivells als que l’usuari ha aconseguit accés però encara no ha superat. A mesura que s’avança en la trama es van desbloquejant els següents nivells. En el cas del diagrama mostrat, l’únic nivell desbloquejat és el nivell 4. - Nivells bloquejats: El jugador no pot accedir a aquests nivells perquè encara no satisfà els requeriments per poder jugar-los. Habitualment l’únic requisit és haver superat el nivell immediatament anterior, tot i que poden haver casos especials. El nombre de nivells mostrats a la Figura 4.4 no es correspon amb el nombre de nivells del joc final, que es tracta a l’apartat de Nivells, disponible a la pàgina 27. 4.6.4. Interfície dins del joc La distribució dels elements a la interfície dins del joc es mostren a la Figura 4.5. Figura 4.5. Interfície dins del joc Els elements que composen aquesta interfície gràfica són: - Indicador d’arma secundària: Situat a la part superior esquerra de la pantalla, indica Desenvolupament de videojocs 2D amb Unity Pág. 23 quina arma secundaria està activa en aquest moment i la munició disponible. - Barra de vida: Mostra el nivell de salut del personatge. - Barra d’energia: Mostra el nivell d’energia del personatge. - Rellotge: Permet determinar el temps transcorregut des de l’inici del nivell. - Mini mapa: Mostra quant s’ha avançat en el nivell i facilita la localització de sales que el jugador hagi pogut passar per alt. - Comptador de monedes: Es troba a la part inferior esquerra i informa sobre la quantitat de monedes de que disposa el protagonista. 4.6.5. Pantalla fi de nivell La pantalla de fi de nivell apareix cada vegada que el jugador completa un nivell, i mostra el temps emprat per superar el nivell i les monedes recollides. En cas que l’usuari superi el seu millor temps, s’indica amb un text que apareix al costat del temps. Figura 4.6. Pantalla de fi de nivell Addicionalment, a la part inferior dreta de la pantalla, es mostren els botons que permeten realitzar les accions de Continuar, que carrega el mapa del món, o Repetir, que permet a l’usuari tornar a jugar el nivell. 4.6.6. Menú de pausa Un altre menú que suposa una part important de la interfície fora del joc és el menú de Pág. 24 Memòria pausa, que com el seu nom indica permet a l’usuari detenir l’acció de joc. Tot i que per accedir a ell cal estar dins del joc, mentre l’usuari estigui en aquest menú tot el món de joc es deté i no es pot jugar estant en ell, per aquest motiu no és considerat com a interfície dins del joc. En realitat es tenen dos menús de pausa, un utilitzat durant les parts jugables i un altre per el mapa del món. Aquests dos menús de pausa són molt similars, essent la única diferència que el menú de pausa del mapa del món no té botó per retornar al mapa del món, ja que òbviament no és necessari. Figura 4.7. Menú de pausa Tal com es mostra a la Figura 4.7, el menú de pausa té les següents funcionalitats: - Continua: Finalitza la pausa i permet continuar l’acció de joc. - Torna al mapa del món: Abandona el nivell que s’està jugant i realitza la transició cap al mapa del món. El jugador perdrà tot el progrés no guardat. - Torna al menú principal: De manera similar al botó Torna al mapa del món, carrega de nou el menú principal, perdent tot el progrés no guardat. - Opcions: Mostra el menú d’opcions. - Surt a l’escriptori: Tanca completament el joc. Com en casos anteriors, es perd tot el progrés no guardat Desenvolupament de videojocs 2D amb Unity Pág. 31 Finalment es va prendre la decisió d’utilitzar Unity, principalment per la gran documentació i comunitat de que disposa, així com també la possibilitat d’utilitzar el llenguatge C#, bastant més senzill que C++ en base als coneixements adquirits durant el grau, que han estat amb llenguatge Python. 5.2. Treballant amb Unity Unity disposa de nombroses característiques que faciliten el desenvolupament de videojocs. En aquest apartat s’inclou una breu descripció dels recursos més utilitzats en el desenvolupament del prototip, per tal d’introduir tots els conceptes necessaris per entendre la implementació de cada un dels elements del joc. 5.2.1. Escena (Scene) L’escena conté els objectes del joc i pot ser utilitzada per a qualsevol cosa, des de per mostrar el menú principal fins a un nivell del joc. Es pot definir com el món espacial en el que es desenvolupa el joc. Per exemple, es pot construir cada nivell com una escena per separat, ja que és senzill canviar entre una escena i una altra mitjançant codi. En cada escena es situen tots els objectes necessaris per aquell nivell com el personatge, els enemics, els objectes, les trampes, etc. 5.2.2. GameObjects Els GameObjects són el tipus d’objecte més important en Unity. Tots els elements del joc són GameObjects (els personatges, els objectes, els escenaris, la interfície d’usuari, etc.), per aquest motiu cal comprendre correctament quina és la seva funció. Tot i que és veritat que tots els elements del joc són d’aquest tipus, un GameObject per si sol no realitza cap acció, si no que actua com a un contenidor de components, que són els que realitzaran les accions requerides. Per aquest motiu cada GameObject pot ser totalment diferent dels altres i poden realitzar una gran varietat d’accions dins del joc, ja que Unity incorpora un gran nombre de components preparats per a ser utilitzats sense dificultats. L’únic component comú en tots els objectes de tipus GameObjects és el component Transform, que determina la posició, la rotació i l’escala de l’objecte en els eixos X, Y i Z. Una altra característica dels GameObjects és que es poden definir relacions de pare / fill entre objectes, on els valors del component Transform del fill són relatius al pare. Pág. 32 Memòria A mode d’exemple, a continuació es mostra la diferència entre dos elements ben diferenciats entre sí, tot i ser ambdós GameObjects. Figura 5.1. GameObject del protagonista En el cas de la Figura 5.1, que mostra el GameObject que conforma el personatge principal, es poden observar els components que té adjunts: - Transform: Determina la posició, la rotació i l’escala de l’objecte en els eixos X, Y i Z. - Sprite Renderer: Mostra per pantalla la imatge associada al personatge en cada un dels fotogrames. - Player Controller: Script que controla els moviments i accions del personatge (caminar, saltar, disparar, etc.) - Player Stats: Script que emmagatzema les dades del personatge com la vida, les monedes, etc. - Rigidbody 2D: Permet que el GameObject sigui controlat segons el motor de físiques incorporat a Unity. Com el seu nom indica és un cas particular per 2D, reduint el moviment als plans X i Y i la rotació al pla Z. - Animator: Controla les animacions del personatge, que han de ser definides prèviament, determinant quin sprite s’ha de mostrar per pantalla a cada fotograma. - Circle / Box Collider 2D: Permet definir col·lisionadors que es poden referenciar posteriorment en scripts, facilitant la realització d’accions en entrar en contacte amb altres col·lisionadors. Desenvolupament de videojocs 2D amb Unity Pág. 33 Figura 5.2. GameObject del canvas En aquest segon exemple es parla del canvas, que gestiona tot allò que es mostra per sobre de la pantalla de joc, en aquest cas la interfície d’usuari. Com es mostra a la Figura 5.2, aquest GameObject té adjunts els següents components: - Rect Tansform: És un component similar a Transform, però en lloc de situar un punt en l’espai, determina el rectangle on es trobaran els elements de la interfície. - Canvas: Determina l’espai on es representen i renderitzen tots els elements de la interfície gràfica. Tots els GameObjects relacionats amb la interfície han de ser fills del GameObject que contingui aquest component. - Canvas Scaler: Com el seu nom indica, controla l’escala de tots els elements de la interfície. - Graphic Raycaster: s’utilitza per emetre raigs contra el canvas, per tal de detectar si algun element de la interfície ha col·lidit amb un dels GameObjects de la escena. S’utilitza per configurar el comportament de la interfície en cas que aquestes col·lisions es produeixin, per defecte els objectes del canvas es renderitzen a la capa més externa. - GUI Script: script que controla els elements variables en la interfície, com el rellotge, el comptador de monedes, etc. Com es pot comprovar, els GameObjects són la base del desenvolupament de videojocs amb Unity. 5.2.3. Components més comuns Existeixen molts components incorporats a Unity, però alguns d’ells han estat utilitzats al projecte amb molta més assiduïtat que d’altres. L’objectiu d’aquest apartat es descriure els Pág. 34 Memòria components més habituals ja que la majoria de GameObjects faran ús d’ells, d’aquesta manera serà més senzill analitzar les particularitats de cada cas. Per aquest motiu, els components amb funcionalitats molt específiques es descriuran a l’apartat que expliqui la implementació de cada GameObject en concret. 5.2.3.1. Transform Com s’ha mencionat amb anterioritat, aquest component és el més bàsic, doncs tots els GameObjects l’incorporen per defecte. Els paràmetres del component es mostren a la Figura 5.3. Figura 5.3. Paràmetres del component Transform 5.2.3.2. Sprite Renderer El Sprite Renderer s’encarrega de mostrar un sprite a l’escena actual, per tant tots els GameObjects que hagin d’aparèixer en pantalla i que parteixin d’una imatge inclouran aquest component. Figura 5.4. Paràmetres del component Sprite Renderer Els paràmetres que es poden modificar en aquest component són: Paràmetre Funció Sprite Imatge amb el sprite a mostrar per pantalla Color Color aplicat al sprite . Aquest color s’aplica multiplicat al color de base, per tant el color blanc no canvia el color original. Flip Voltejar el sprite original, tant en l’eix X com Y. Desenvolupament de videojocs 2D amb Unity Pág. 35 Material Material utilitzat per renderitzar el sprite. Sorting Layer Capa en que es troba aquest sprite. D’aquesta manera és possible assignar prioritats en l’ordre de renderitzat. Order in layer Ordre de renderitzat del sprite dins la seva capa. 5.2.3.3. Rigidbody 2D Aquest component fa que el GameObject al que està adjunt es comporti segons el motor de físiques de Unity. És un cas particular del component Rigidbody on el moviment està restringit al pla XY i la rotació al voltant de l’eix Z. Si s’aplica un Collider 2D al mateix GameObject, es possibilita que les col·lisions entre GameObjects es comportin segons el motor de físiques, aconseguint un resultat més realista. Figura 5.5. Paràmetres del component Rigidbody2D Els paràmetres que conté aquest component són: Paràmetre Funció Use Auto Mass Si està activat, calcula la massa en funció dels Colliders adjunts Mass Massa del sòlid rígid Linear Drag Coeficient d’arrossegament que afecta al moviment Angular Drag Coeficient d’arrossegament que afecta a la rotació Gravity Scale El grau d’afectació de la gravetat sobre el sòlid rígid Pág. 36 Memòria Is Kinematic Si està activat el sòlid rígid pot ser desplaçat per forces i col·lisions Interpolate De quina manera s’interpola entre les actualitzacions de la física Sleeping Mode Determina com l’objecte “dorm” per estalviar processos quan està inactiu Collision detection Mètode de detecció de col·lisions. En discret només es detecten si col·lideix quan s’actualitzen les físiques i en continu es detecten també entre actualitzacions Freeze Position Restringeix el moviment en X, en Y o en totes dues direccions Freeze Rotation Restringeix la rotació al voltant de Z 5.2.3.4. Collider 2D El component Collider 2D permet enregistrar les col·lisions entre objectes que tinguin adjunts aquest tipus de component. Existeixen quatre tipus de Collider 2D, Circle, Box, Polygon i Edge. Els més utilitzats són els de tipus Circle i Box, ja que en poder utilitzar-se més d’un col·lisionador a l’hora en el mateix GameObject és senzill cobrir la totalitat del sprite consumint menys recursos que amb un Polygon. A continuació es mostra una comparativa entre els diferents tipus de Collider 2D. Figura 5.6. Tipus de Collider 2D Els paràmetres de cada tipus són diferents per a poder definir la geometria desitjada, però existeixen tres paràmetres comuns a tots els tipus de Collider 2D. Paràmetre Funció Material Permet utilitzar un Physics Material al col·lisionador que controla propietats com la fricció i el rebot Desenvolupament de videojocs 2D amb Unity Pág. 37 Is Trigger Si està activat, el col·lisionador actua com a desencadenant d’alguna acció Used by Effector Determina si el col·lisionador és utilitzat pel component Effector adjunt al mateix GameObject 5.2.3.5. Animator El component Animator s’utilitza per assignar animacions a un GameObject. Aquest component requereix tenir associat un controlador d’animacions, que defineix les animacions a utilitzar i en quines circumstàncies s’han de realitzar les transicions entre elles. En apartats posteriors es detalla el funcionament dels controladors d’animacions. Figura 5.7. Paràmetres del component Animator Com es pot veure a la Figura 5.7, a la part inferior es mostra la informació sobre el controlador d’animacions associat al component. Els paràmetres del component Animator són els següents: Paràmetre Funció Controller El controlador d’animacions associat al GameObject Avatar L’Avatar del GameObject (només per humanoides 3D) Apply Root Motion Quan està activat, es controla el moviment del personatge / objecte a través de les animacions en comptes de controlar-ho mitjançant un script Update Mode Permet seleccionar de quina manera s’actualitza el controlador d’animacions Culling Mode Permet seleccionar de quina manera es tallen les animacions Pág. 38 Memòria 5.2.3.6. Script El component Script és un dels més importants, doncs permet adjuntar codi a un GameObject, que pot ser en llenguatge C# o JavaScript. Com s’ha mencionat amb anterioritat, al projecte s’ha utilitzat C#. Figura 5.8. Exemple de component Script Aquest component té únicament un paràmetre per defecte, que és el script a utilitzar. Els altres paràmetres són definits per l’usuari, doncs només cal declarar com a públiques les variables desitjades per a que apareguin com a paràmetre i es pugui modificar el seu valor des de la interfície de Unity. En l’exemple presentat a la Figura 5.8 es poden veure els diversos paràmetres de que es disposen en aquest cas. 5.2.4. Classe MonoBehaviour i funcions predefinides Quan es programa un script creat des de Unity, es disposa per defecte d’una classe anomenada MonoBehaviour, que conté una sèrie de funcions que resulten de gran utilitat per implementar qualsevol comportament desitjat en el joc. Sempre que es crea un script nou, Unity defineix una classe nova específica per el script, que hereta totes les característiques de la classe MonoBehaviour. Existeixen una gran varietat de funcions i mètodes inclosos dins MonoBehaviour però en aquest apartat s’explicaran les més utilitzades al projecte. Les funcions més específiques seran detallades quan s’expliqui alguna característica que en faci ús. - Start: La funció Start s’executa en el primer fotograma de la escena, abans que qualsevol de les altres funcions. Habitualment s’utilitza per inicialitzar variables. - Update: Update s’executa cada fotograma, i s’utilitza per a implementar qualsevol comportament. El temps d’execució entre un Update i el següent pot variar ja que Desenvolupament de videojocs 2D amb Unity Pág. 39 també ho fan els recursos utilitzats en cada fotograma, per aquest motiu no es sol utilitzar per fer càlculs relacionats amb el motor de físiques. - FixedUpdate: FixedUpdate és una funció similar a Update però a diferència d’aquesta, que s’executa a cada fotograma, FixedUpdate s’executa just abans que el motor de físiques actualitzi l’estat de tots els GameObjects que incorporin físiques. D’aquesta manera, l’interval entre un FixedUpdate i el següent és molt més regular, el que el fa convenient per programar accions relacionades amb les físiques. - OnCollisionEnter2D: Aquesta funció s’executa quan el col·lisionador d’un altre GameObject entra en contacte amb el col·lisionador del GameObject que conté el script. També existeixen les funcions OnCollisionStay2D i OnCollisionExit2D que s’executen mentre la col·lisió continua i al sortir d’aquesta, respectivament. Aquestes funcions són especialment útils per definir la interacció entre objectes i, com es pot observar pel seu nom, són un cas particular per col·lisionadors 2D. 5.2.5. Input En el cas de jocs per computador, Unity suporta com a dispositius d’entrada el teclat, el ratolí i joysticks / comandaments. A la interfície gràfica de Unity, mitjançant el InputManager, es poden configurar els diferents botons i eixos que s’utilitzaran en el joc. Tot botó pot ser tractat com un eix, però generalment si es vol el comportament d’un botó es defineix únicament la part positiva. Figura 5.9. InputManager de Unity La característica més important del InputManager és que permet configurar els controls per a qualsevol dispositiu d’entrada suportat i permet accedir-hi de manera senzilla quan s’està escrivint un script mitjançant la classe Input, que permet determinar quan un botó específic Pág. 40 Memòria es pressiona o deixa de ser pressionat. Figura 5.10. Exemple del valor de l’eix horitzontal, en aquest cas polsat amb una intensitat del 80% En el cas dels eixos, com l’horitzontal o el vertical, la classe Input conté una funció que permet determinar amb quina intensitat s’està pressionant l’eix, en un rang de -1 a 1. Aquesta informació resulta útil a l’hora de calcular la velocitat de moviment de personatges jugables. Quan s’està escrivint un script, s’accedeix als botons i eixos pel seu nom independentment de quina sigui la configuració de botons del dispositiu físic, el que permet que el codi sigui robust en front de canvis en la distribució botons. 5.2.6. Prefabs En el desenvolupament d’un videojoc, moltes vegades cal reutilitzar objectes o enemics durant el transcurs d’un nivell. Una solució seria realitzar un duplicat GameObject desitjat, però es crea el problema de que l’original i la còpia són editats de forma separada, cosa que generalment no resulta convenient. Per aquest motiu, Unity permet treballar amb el que s’anomenen prefabs, que consisteix en crear un GameObject que fa la funció de plantilla de totes les seves instàncies. D’aquesta manera, s’aconsegueix que totes les instàncies canviïn les seves propietats modificant únicament el GameObject que actua com a prefab. Addicionalment, es poden modificar individualment les instàncies de forma que algun paràmetre o component sigui diferent als del prefab, i també es permet aplicar els canvis realitzats a una instància sobre el prefab modificant totes les altres instàncies de manera automàtica. Per tant, la utilització de prefabs aporta una gran flexibilitat a l’hora de reutilitzar els recursos. 5.2.7. Etiquetes Unity incorpora un sistema d’etiquetes que permet classificar els GameObjects segons els criteris que el creador consideri. En el cas del projecte, les etiquetes han resultat especialment útils a l’hora d’implementar la interacció entre GameObjects, definint com es Desenvolupament de videojocs 2D amb Unity Pág. 47 dimensions desitjades. Es crea el nivell disposant els diferents tiles de tal manera que formin una imatge coherent. Tiled permet treballar amb capes per facilitar el disseny. Figura 5.20. Mapa del món, creat amb Tiled Un cop s’ha dissenyat el nivell, cal importar-lo utilitzant Tiled2Unity. Aquesta eina posa a disposició de l’usuari una sèrie de scripts que transformen cada una de les capes del mapa a Tiled en un prefab de Unity. Un cop es tenen els terrenys que formen el nivell a Unity, només cal definir els col·lisionadors que conformen el terra, que s’utilitzaran quan es calculin les físiques dins del motor de Unity. Figura 5.21. Terreny importat a Unity, amb col·lisionadors (línies verdes) Pág. 48 Memòria 6. Implementació del personatge principal En aquest apartat es detalla la implementació de les característiques descrites a la secció Personatges jugables, que es troba a la pàgina 12 d’aquesta memòria. Per realitzar totes les accions de que disposa el personatge, s’ha utilitzat la classe PlayerController, que es troba al script PlayerController.cs. 6.1. Màquina d’estats Per controlar les animacions del personatge, s’utilitza el sistema de màquines d’estat incorporat a Unity, anomenat Mechanim. La metodologia es basa en definir cada animació com a un estat, i imposar les condicions que s’han de donar per a que el controlador d’animacions realitzi la transició entre els diferents estats. A la Figura 6.1 es mostra l’estructura de la màquina d’estats aplicada al personatge principal. Figura 6.1. Màquina d'estats del controlador d’animacions del protagonista El llistat d’estats de que es disposa és el següent: - Idle: És l’estat per defecte. L’animació associada a aquest estat és simplement el personatge parat. - Shoot: Animació de dispar. S’utilitza únicament pel primer dispar, si el jugador continua pressionant el botó de dispar es realitza una transició a Keep Shooting via script. - Roll: Animació del personatge rodant. - Run: Animació del personatge corrent. Desenvolupament de videojocs 2D amb Unity Pág. 49 - Run Shooting: Animació del personatge corrent i disparant a la vegada. - Keep Shooting: Aquesta animació només es composa d’un fotograma, el personatge amb el braç estirat, el fotograma final de l’animació Shoot. Es realitza la transició a aquest estat si el jugador continua disparant després del primer dispar. - Aim Up: El personatge apunta amunt. - Run Aim Up: El personatge apunta amunt i corre al mateix temps. - Jump And Fall: Es reprodueix un fotograma determinat en funció de la velocitat vertical del jugador, produint tant l’animació de salt com la de caiguda lliure. Per realitzar la transició entre aquests estats, es defineixen els següents paràmetres al controlador d’animacions, que es modifiquen de la manera requerida als scripts que controlen el jugador: Variable Tipus Valor Speed Real Velocitat horitzontal del personatge vSpeed Real Velocitat vertical del personatge Grounded Booleà Vertader si el personatge està en contacte amb el terra, fals en cas contrari. Shooting Booleà Vertader si el botó de dispar està pressionat, fals en cas contrari. AimingUp Booleà Vertader si el jugador apunta cap amunt, fals en cas contrari Rolling Booleà Vertader si el jugador es troba en l’animació de rodar, fals en cas contrari Laser Booleà Vertader si l’arma secundària làser es troba en ús, fals en cas contrari Com s’ha explicat amb anterioritat, l’estat Entry es connecta a l’estat per defecte per tal de que al iniciar l’escena es reprodueixi l’animació per defecte. Les condicions per les transicions sempre són del tipus booleà, i es poden definir en funció de més d’un paràmetre, treballant entre si com a producte de booleans (operador AND). Hi ha transicions que es mostren amb més d’un punter, això és degut a que presenten més d’un grup de condicions, actuant entre ells com a suma booleana (operador booleà OR). Pág. 50 Memòria Figura 6.2. Màquina d'estats amb transicions numerades El llistat de transicions i les condicions que s’han de donar per que es produeixin es detalla a continuació, en base a la numeració mostrada a la Figura 6.2. El valor de la variable Speed per al qual es produeix la transició és arbitrari, s’ha definit mitjançant prova i error. Estats Transicions Condicions T1 Idle ⇌ Run Idle → Run Speed > 0.1 Run → Idle Speed < 0.1 T2 Idle ⇌ Roll Idle → Roll Rolling = Vertader Roll → Idle Rolling = Fals T3 Idle ⇌ Run Shooting Idle → Run Shooting Speed > 0.1 & Shooting = Vertader Run Shooting → Idle Speed < 0.1 & Shooting = Fals & Laser = Fals T4 Keep Shooting → Idle Keep Shooting → Idle Shooting = Fals & Laser = Fals T5 Idle ⇌ Aim Up Idle → Aim Up AimingUp = Vertader Aim Up → Idle AimingUp = Fals Desenvolupament de videojocs 2D amb Unity Pág. 51 T6 Idle ⇌ Shoot Idle → Shoot Shoot = Vertader Shoot → Idle Shoot = Fals T7 Run ⇌ Run Aim Up Run → Run Aim Up AimingUp = Vertader Run Aim Up → Run AimingUp = Fals T8 Run ⇌ Roll Run → Roll Rolling = Vertader Roll → Run Speed > 0.1 & Rolling = Fals T9 Run ⇌ Run Shooting Run → Run Shooting Shooting = Vertader Run Shooting → Run Speed > 0.1 & Shooting = Fals & Laser = Fals T10 Run Shooting ⇌ Keep Shoting Run Shooting → Keep Shooting Speed < 0.1 & Shooting = Vertader O Speed < 0.1 & Laser = Vertader Keep Shooting → Run Shooting Speed > 0.1 & Shooting = Vertader O Speed > 0.1 & Laser = Vertader T11 Keep Shoting ⇌ Aim Up Keep Shooting → Aim Up Aiming Up = Vertader & Laser = Fals Aim Up → Keep Shooting Aiming Up = Fals & Shooting = Fals T12 Aim Up ⇌ Run Aim Up Aim Up → Run Aim Up Speed > 0.1 Run Aim Up → Aim Up Speed < 0.1 Pág. 52 Memòria T13 Jump And Fall → Idle Jump And Fall → Idle Grounded = Vertader T14 Any State → Jump And Fall Any State → Jump And Fall Grounded = Fals 6.2. Moviments En aquesta secció es descriuen els mètodes emprats per aconseguir els moviments definits amb anterioritat. En general els moviments han sigut implementats utilitzant les funcionalitats del component Rigidbody2D. Les accions que s’han de dur a terme s’han inclòs al script PlayerController.cs. 6.2.1. Córrer Figura 6.3. Personatge corrent Córrer és el moviment principal del personatge, ja que és el que el permet moure’s per sobre de les plataformes. La idea per realitzar aquest moviment és utilitzar l’eix d’entrada horitzontal definit a Input, que retorna un nombre real entre -1.0 i 1.0 en funció de la intensitat amb que es pressiona l’eix, i la propietat velocity de la classe Rigidbody2D. Figura 6.4. Implementació del desplaçament Desenvolupament de videojocs 2D amb Unity Pág. 53 D’aquesta manera, es defineix la velocitat en X del sòlid rígid com el valor d’entrada de l’eix horitzontal multiplicat per la velocitat màxima del personatge. Un cop es té el valor de la velocitat, s’aplica també al controlador d’animacions per tal que es reprodueixi l’animació corresponent. Totes aquestes accions es realitzen a la funció FixedUpdate, que s’avalua a cada fotograma fixat pel motor de físiques. 6.2.2. Saltar Figura 6.5. Personatge saltant Saltar també és un moviment important, ja que possibilita al protagonista superar diferències de nivell o espais buits entre les plataformes. Per implementar aquest moviment, de nou es recorre al sòlid rígid associat al personatge, en aquest cas utilitzant la funció AddForce, que donat un vector de força, l’aplica sobre el sòlid rígid. També es té en compte el botó de salt definit a Input, per determinar en quin moment cal aplicar la força. Com a variable auxiliar s’ha definit un booleà que indica si el jugador esta en contacte amb el terra o no, per tal d’impossibilitar la realització de més d’un salt consecutiu sense tocar el terra. Figura 6.6. Implementació del salt Si es donen les condicions requerides, que són que a la mateixa vegada el personatge Pág. 54 Memòria estigui en contacte amb el terra i el botó de salt sigui pressionat, s’aplica una força amb component horitzontal nul·la que fa que el personatge es desplaci verticalment, aconseguint així l’efecte de salt. Les accions es realitzen a la funció Update, que s’avalua a cada fotograma. 6.2.3. Rodar Figura 6.7. Personatge rodant Aquest moviment fa que el personatge sigui immune durant el temps en que es reprodueix l’animació, permetent així que el jugador pugui esquivar els projectils enemics. La implementació d’aquest moviment es basa en utilitzar un booleà per determinar si el jugador és immune al dany, que per defecte és fals i es defineix com a vertader quan el jugador prem el botó de rodar, sempre que el personatge estigui en contacte amb el terra. També s’afegeix una petita força al sòlid rígid associat al personatge amb la funció AddForce per aconseguir un efecte de tombarella. Totes aquestes accions es troben dins de la funció Update, que s’executa cada fotograma. Figura 6.8. Implementació del moviment Rodar En l’últim fotograma de l’animació de rodar, s’executa una funció que torna a definir el booleà d’immunitat com a fals, permetent que el personatge pugui sofrir danys un altre cop. També defineix com a fals el booleà del personatge rodant al controlador d’animacions, per tal de Desenvolupament de videojocs 2D amb Unity Pág. 55 realitzar la transició cap a un altre estat. 6.3. Armes Per la implementació de les armes s’han utilitzat generalment prefabs de cada tipus de projectil creant una nova instància quan sigui necessari, la posició inicial de la qual és determina a partir d’un GameObject buit i fill del GameObject del personatge, que es situa al punt desitjat. També s’incorporen col·lisionadors per detectar el xoc entre el projectil i els altres elements de l’escena. Pel que fa als scripts que controlen les armes, cada projectil té adjunt un script que controla el seu comportament i el dany que causa, mentre que la creació de la instància es duu a terme al script PlayerController.cs. En les armes secundàries, que disposen d’un sistema de munició, els valors de munició disponible es guarda al script PlayerStats.cs. A continuació es detalla la implementació de cadascuna de les armes. 6.3.1. Canó làser, mode foc ràpid Figura 6.9. Personatge disparant en horitzontal i vertical El canó làser en mode foc ràpid és l’arma principal del protagonista, i és la més utilitzada durant el transcurs del joc. El procés d’implementació es pot dividir en dos parts, la creació de la instància del prefab amb el raig làser i el comportament del propi projectil. Pel que fa a la creació de la instància, es controla a través del personatge, al script PlayerController.cs. En primer lloc s’utilitza la classe Input per detectar si el botó de dispar ha estat premut i en cas afirmatiu es crea una instància de la bala a la mateixa vegada que es reprodueix l’animació corresponent. Un cop ha començat la seqüencia de dispar, les bales només es generen cada un cert temps definit de manera arbitrària, fins que el jugador deixa de polsar el botó. Per aconseguir aquest comportament, s’utilitza una variable a mode de comptador, que torna a 0 cada cop que es genera una bala. Degut a que es pot disparar verticalment, cal utilitzar un booleà, que és vertader quan el jugador està apuntant amunt, ja que la posició en la que cal crear la bala és diferent en cadascun dels casos. Pág. 56 Memòria Figura 6.10. Implementació del canó làser, part controlada pel personatge Per generar les bales, s’utilitza un GameObject buit que és fill del GameObject del personatge, i que té adjunt un script anomenat BalaSpawn.cs. Degut a aquesta relació pare / fill, el generador es manté sempre al mateix punt en relació al personatge. L’algorisme per generar bales és senzill, dins del script es defineix la funció Spawn que, donat un prefab de bala que conté informació sobre si serà disparada en horitzontal o vertical, comprova la direcció i crea una instància de la bala a la posició on es troba el generador, rotant-la 90º si la bala és vertical. L’únic que cal fer és executar aquesta funció en cas que es vulgui generar una bala al diagrama de la Figura 6.10. Figura 6.11. Funcionament del generador de bales Desenvolupament de videojocs 2D amb Unity Pág. 63 l’enemic mira cap a la dreta. Un cop coneguda l’orientació, cal saber en quin costat es troba el personatge. Si la posició del jugador en l’eix X és superior a la de l’enemic, es troba a la dreta d’aquest, en cas contrari es troba a l’esquerra. Amb aquestes dades es pot determinar si l’enemic veu al personatge. En els apartats següents es descriu com s’ha aconseguit el comportament dels diferents tipus d’enemics. Només incorporen una animació, per tant no es descriurà en detall la màquina d’estats com si s’ha fet amb el protagonista. 7.1.1. Drac (Patrulla amb envestida) Figura 7.2. Enemic drac El drac és un enèmic que realitza la funció de patrulla amb envestida. Com s’indica a l’apartat de disseny, la seva tasca consisteix en desplaçar-se de forma continua dins d’un espai definit, i un cop pot veure al protagonista, comença a perseguir-lo augmentant la seva velocitat. Per implementar aquestes característiques s’ha fet us de la classe RigidBody2D per dotar a l’enemic de moviment i s’ha determinat si el protagonista es vist pel drac en funció de les seves posicions i l’orientació del drac, que ve determinada per un booleà que és vertader quan el drac mira cap a la dreta. Figura 7.3. Comportament d'un enemic del tipus patrulla amb envestida Pág. 64 Memòria El comportament de l’enemic es basa en desplaçar-se entre dos punts, comprovant sempre si pot veure al protagonista tenint en compte el seu rang de visió. Quan es doni el cas de que el drac vegi al protagonista, comença la fase de persecució, que termina quan el personatge principal s’allunya una distància suficient com per estar fora del rang de visió del drac. Durant aquesta fase de persecució l’enemic augmenta la seva velocitat. 7.1.2. Torreta (Fix amb dispar) Figura 7.4. Enemic torreta L’altre enemic implementat és la torreta. Aquest enemic no es mou, i dispara projectils quan veu al jugador. Per la seva implementació s’ha seguit un procediment molt similar al de les armes del protagonista. Figura 7.5. Comportament dels enemics un cop veuen al protagonista Les condicions que s’han de donar per generar un projectil són molt similars a les del canó làser en mode foc ràpid del protagonista (pàgina 55), però així com en el cas del protagonista es requeria pressionar el botó de dispar, en el cas dels enemics es generen projectils quan aquests veuen al protagonista. Desenvolupament de videojocs 2D amb Unity Pág. 65 Figura 7.6. Generació de projectils enemics La generació de projectils també s’assimila a la implementació de les bales del protagonista, utilitzant un generador que crea una instància del projectil en la seva posició. En funció de si l’enemic dispara de forma vertical o horitzontal, s’aplica una força diferent sobre cada instància del projectil utilitzant la funció AddForce de la classe Rigidbody2D, a l’hora que es bloqueja el desplaçament en l’eix X o Y del projectil segons convingui. Figura 7.7. Comportament dels projectils enemics Pel que fa al comportament dels projectils generats, també és molt similar al dels projectils del canó làser en mode foc ràpid, però amb la particularitat que cal que els projectils causin dany al personatge principal. Com en el cas de les bales del protagonista, quan es detecta el contacte, es comprova si el GameObject que conte el col·lisionador té la etiqueta Player, que únicament està assignada al protagonista. En cas afirmatiu, es resta el dany del projectil a la Pág. 66 Memòria vida del protagonista, continguda al script PlayerStats.cs. Figura 7.8. Mini torreta Un cas particular de torreta és la mini-torreta, que es situa a la part superior de les plataformes i dispara contra el terra. En el cas d’aquest enemic, s’utilitza a mode de trampa, doncs dispara de forma contínua sense necessitat de veure al protagonista. 7.2. Objectes Tal com es va mostrar a la fase de disseny, els objectes es poden classificar en tres tipus: col·leccionables, usables i interactius. Tots els objectes de cada tipus es comporten de manera molt similar, pel que en els apartats següents es descriu la metodologia general d’implementació per cada tipus d’objecte, així com una llista dels objectes disponibles al prototip. 7.2.1. Objectes col·leccionables Els objectes col·leccionables són aquells que el jugador pot acumular, amb un propòsit diferent en cada cas. A continuació es mostra la llista dels objectes col·leccionables inclosos al prototip, així com la seva representació dins del joc. Objecte Funció Sprite Quantitat Monedes Incrementa el comptador de monedes segons el valor de la moneda. 1 5 15 Munició Bombes Incrementa la munició de bombes. 3 Desenvolupament de videojocs 2D amb Unity Pág. 67 Munició Làser Incrementa la munició de làser. 1 Poció de vida Incrementa la quantitat de pocions de vida que té el personatge. 1 Pel que fa a la implementació, s’utilitza la funció OnTriggerEnter2D de la classe Collider2D. Mitjançant aquesta funció es detecten totes les col·lisions amb l’objecte, i es comprova si el GameObject que ha entrat amb contacte amb l’objecte col·leccionable és el jugador mitjançant les etiquetes de Unity. En cas afirmatiu, s’incrementa la quantitat del comptador associat a l’objecte i es destrueix el GameObject, desapareixent així de l’escena. Figura 7.9. Implementació dels objectes col·leccionables 7.2.2. Objectes consumibles Els únics objectes consumibles inclosos al prototip són les pocions de vida. Per la seva implementació s’utilitza la classe Input per detectar si el botó d’objectes consumibles és polsat, i sempre que hi hagi pocions disponibles, es modifica el valor de la vida actual del personatge, augmentant-lo en un 30% de la vida total. Addicionalment, es disminueix la quantitat de pocions disponibles en 1. Tant la vida del personatge com la quantitat de pocions disponibles es guarden al script PlayerStats.cs, adjunt al GameObject del protagonista. Pág. 68 Memòria Figura 7.10. Implementació de les pocions de vida 7.2.3. Objectes interactius En quant a objectes interactius, l’únic objecte disponible és l’escala. La seva implementació es basa en les funcions OnTriggerEnter2D, OnTriggerStay2D i OnTriggerExit2D, totes elles pertanyents a la classe Collider2D, realitzant les accions oportunes sempre que l’objecte que col·lideixi amb les escales sigui el personatge principal. Com a variable auxiliar es defineixen un booleà que és vertader si el jugador està en contacte amb l’escala i que per defecte és fals. Es desitja que si el jugador no pressiona cap botó mentre es troba pujant l’escala, el personatge es quedi a la mateixa posició, per tant quan s’entra en contacte amb l’escala es fixa la gravetat del component Rigidbody2D del personatge a 0, i es restableix al seu valor original un cop s’acaba la col·lisió. Figura 7.11. Entrada en la col·lisió En primer lloc, mitjançant la funció OnTriggerEnter2D que s’executa just en el moment en que es detecta el contacte, es defineix el booleà de contacte com a vertader, que bloqueja Desenvolupament de videojocs 2D amb Unity Pág. 69 tots els moviments del personatge excepte córrer i saltar. També es canvia la gravetat del personatge, imposant un valor de 0. Figura 7.12. Accions mentre es manté el contacte Mentre el contacte es manté, a cada fotograma s’executa la funció OnTriggerStay2D, que fixa el valor de la velocitat del personatge en funció dels eixos verticals i horitzontals, permetent així el moviment vertical al llarg de l’escala i la possibilitat de sortir de la col·lisió amb l’escala. Figura 7.13. Accions realitzades en finalitzar la col·lisió Finalment, quan es surt de la col·lisió, s’executa la funció OnTriggerExit2D, que defineix el booleà de contacte com a fals i restableix la gravetat del personatge, permetent que es calculin les físiques amb normalitat. 7.3. Nivells Únicament s’ha implementat un nivell de forma complerta, que és el Laboratori. També s’ha creat el nivell del poble però les funcionalitats especificades a la fase de disseny no s’han implementat. Com s’ha mencionat anteriorment, el nivell s’ha creat al software Tiled i posteriorment, utilitzant la utilitat Tiled2Unity s’ha importat a Unity. En el disseny del nivell s’han incorporat cartells a mode de tutorial per mostrar al jugador Pág. 70 Memòria quines eines té a la seva disposició per superar diferents situacions dins del joc, com es pot veure a la Figura 7.14. Figura 7.14. Captura del nivell 0, Laboratori Per aquest nivell també s’han implementat dues sales secretes, que només poden ser descobertes si es llança una bomba contra la paret. Per implementar aquesta característica s’ha creat un GameObject de paret i s’ha superposat al terreny real del nivell, de forma que el jugador no el pugui veure. Addicionalment, s’ha modificat el comportament de la bomba per tal que a més de causar danys als enemics destrueixi els objectes d’aquest tipus, creant així l’efecte desitjat. A la Figura 7.15 es pot veure un exemple. Figura 7.15. Sala secreta Desenvolupament de videojocs 2D amb Unity Pág. 71 A continuació es detalla la llista d’enemics i objectes utilitzats al nivell. Nom Tipus Quantitat Drac Enemic 2 Torreta Enemic 3 Mini torreta Enemic 4 Moneda de coure Objecte 17 Moneda de plata Objecte 4 Moneda d’or Objecte 4 Munició de bomba Objecte 5 Munició de làser Objecte 6 Escales Objecte 6 Pág. 72 Memòria 8. Interfície d’usuari, controls i sons Un cop implementades tots els elements del joc, cal crear menús per a que el jugador pugui navegar entre les escenes que conformen el joc, una interfície d’usuari dins del joc que aporti la informació necessària durant el transcurs de la partida i també definir quins són els controls utilitzats en el videojoc. Addicionalment, s’afegeixen efectes sonors i música de fons per millorar l’experiència de joc. 8.1. Interfície d’usuari i menús La interfície d’usuari s’ha desenvolupat utilitzant les eines que incorpora l’editor de Unity, així com la classe UI. El funcionament és molt intuïtiu, doncs els components que Unity incorpora per aquesta tasca estan preparats per implementar qualsevol tipus de menú. En els menús del prototip s’ha treballat bàsicament amb els components Text, que com el seu nom indica permet mostrar text per pantalla i es fàcilment modificable des dels scripts, i també amb el component Button, que crea un botó al que únicament cal associar una funció que realitzi les accions requerides. A continuació es mostren els menús que s’inclouen al prototip, que generalment compleixen les especificacions del disseny (pàgina 18). Figura 8.1. Menú principal Desenvolupament de videojocs 2D amb Unity Pág. 79 Figura 10.1. Diagrama de Gantt amb les fases del projecte 10.2. Pressupost En l’apartat de pressupost es detallen els costos per la realització del projecte, que consisteixen en hores de treball dels enginyers participants i despeses en hardware o software. Es considera que la recerca d’informació per posar en marxa el projecte no està remunerada. Pel que fa a les hores, es calcula que de mitja han estat unes 20 hores de dedicació per setmana. Es considera que el sou del graduat en tecnologies industrials és de 25 € / hora per les fases de desenvolupament i redactat de la memòria i 18 € / hora en les fases d’aprenentatge i disseny. El software i recursos utilitzats són gratuïts, per tant no han suposat cap cost. Tampoc es considera els costos del hardware utilitzat, ja que no ha estat adquirit per la realització del projecte si no que ja es disposava d’ell. Concepte Treballador Dedicació (h) Cost (€/h) Cost fase (€) Aprenentatge C# Graduat Enginyeria Industrial 20 18 360 Aprenentatge Unity Graduat Enginyeria Industrial 50 18 900 Disseny conceptual Graduat Enginyeria Industrial 40 18 720 Desenvolupament Graduat Enginyeria Industrial 200 25 5000 Redactat memòria Graduat Enginyeria Industrial 60 25 1500 Total 370 8480 Figura 10.2. Taula de costos per la creació del prototip Pág. 80 Memòria La Figura 10.2 mostra les despeses del projecte, que té un cost total de 8480 €. Com a l’apartat de planificació, aquesta quantitat es correspon a la quantitat necessària per realitzar el prototip, per a calcular els costos per obtenir el joc final caldria detallar les fases del projecte sencer. També cal afegir que en cas de comercialitzar el joc, caldria obtenir una llicència de la versió professional de Unity, que té un cost de 75 $ / mes, aproximadament uns 70 € segons el canvi de moneda actual. Desenvolupament de videojocs 2D amb Unity Pág. 81 11. Consideracions mediambientals Degut a les característiques del projecte, que té com a objectiu el desenvolupament d’un videojoc, no es produeixen accions perjudicials contra el medi ambient. Si bé es cert que per desenvolupar el joc calen ordinadors, que consumeixen electricitat i s’escalfen, es considera que l’impacte ambiental que poden causar és negligible, ja que no existeix una diferència apreciable entre la energia utilitzada al projecte i el consum elèctric d’un habitatge mitjà, per exemple. Aquí pot anar el títol del vostre TFG/TFM Pág. 83 Conclusions S’han realitzat de manera exitosa els objectius plantejats a l’inici del projecte, que eren els de dissenyar un videojoc i desenvolupar un prototip que incorporés les seves característiques principals. La realització d’aquest projecte ha estat una gran experiència, doncs he adquirit molts coneixements sobre el desenvolupament de videojocs, així com el llenguatge C#, que no havia utilitzat amb anterioritat. Addicionalment, treballar amb videojocs 2D també m’ha aportat molt en quant al ús de mapes basats en tiles i personatges basats en sprites. Tractar la part de disseny conceptual també ha estat molt interessant, ja que tot i no semblar-ho quan es consumeix el producte, realitzar un bon disseny és essencial per a crear un bon videojoc. Pel que fa a l’eina utilitzada en la majoria d’aspectes del , Unity, crec que és una eina molt versàtil, que permet desenvolupar qualsevol tipus de joc, ja sigui en 2D i 3D, tal com es pot veure en el mercat, ja que en els últims anys el nombre de jocs comercials desenvolupats a Unity ha crescut de manera important. El tractament dels elements de joc com a objectes i la incorporació de una gran varietat de components permet que des dels usuaris més novells fins als més experts puguin trobar la forma d’implementar les seves idees sense grans dificultats. Un altre punt positiu sobre Unity, és la gran comunitat de que disposa, doncs quan he tingut dubtes sobre com implementar alguns aspectes concrets del joc, la majoria del temps he pogut solucionar-los gràcies als fòrums de la comunitat. En definitiva, la realització d’aquest projecte ha estat molt satisfactòria i, tot i que personalment m’hauria agradat crear un prototip molt més complert i més semblant a la idea que tenia en ment en iniciar el treball, crec que l’esforç s’ha vist recompensat per la gran quantitat de coneixements sobre el tema que he adquirit. Aquí pot anar el títol del vostre TFG/TFM Pág. 85 Agraïments En primer lloc m’agradaria agrair al director del treball, Lluis Solano, per l’ajuda i bona disposició mostrada al llarg del treball, així com la seva assistència pel que fa al redactat de la memòria. També m’agradaria agrair a tots els artistes que decideixen compartir les seves obres amb la comunitat de manera desinteressada, sense ells aquest projecte no hauria estat possible. Pág. 86 Memoria Bibliografia Referències bibliogràfiques [1] AEVI, Asociación Española de Videojuegos. A14, anuario de la industria del videojuego. Madrid: 2015, p. 62-72 Bibliografia complementària [1] LIBERTY, J., MACDONALD, B. Learning C# 3.0. Sebastopol, CA: O’Reilly Media. Novembre 2008 [2] SCOLASTICI, C., NOLTE, D. Mobile Game Design Essentials. Birmingham, UK: Packt Publishing. Novembre 2013 [3] BETHKE, E. Game development and production. Plano, TX: Wordware Publishing Inc. 2003. [4] CALABRESE, D. Unity 2D Game Development. Birmingham, UK: Packt Publishing. Març 2014. [5] UNITY. Unity – Learn. [http://unity3d.com/es/learn, Setembre 2015 – Gener 2016] [6] UNITY. Unity – Scripting Api. [http://docs.unity3d.com/ScriptReference/, Setembre 2015 – Gener 2016] [7] UNITY. Unity Community. [http://forum.unity3d.com/, Setembre 2015 – Gener 2016] [8] OPENGAMEART. OpenGameArt.org [http://opengameart.org/, Setembre 2015 – Gener 2016] [9] MACHINIMASOUND. Royalty Free Music for Games & Films. [https://machinimasound.com/, 12 de Gener de 2016]