Este documento est bajo licencia Creative Commons: INTRODUCCN: Bienvenidos al que va a ser el primero de muchos tutoriales sobre diseo y desarrollo de ameplay de video jueos! "n este he empezado con alo sencillo y que a muchos les ustar#an hacer$ %n shooter &D! 'ras mirar re(erencias) creo que la mas (amosa es la del jueo pan! *s# que primero empezaremos por el diseo del ameplay y despu+s empezaremos a crearlo! Diseando nuestro Sooter: !ntes de em"e#ar a acer el jue$o% siem"re tenemos &ue acer un documento "ara tener las cosas claras sobre lo &ue a' &ue acer( ESTO ES )O *RI+ERO ,UE -! DE -!CERSE !NTES DE E+*E.!R UN *RO/ECTO( -istoria: Para ser sinceros) desconozco la historia de Pan! %n jueo casi siempre tendr, un pequeo tras(ondo hist-rico! Pero siempre hay e.cepciones que con(irmen la rela y) si mal no recuerdo) Pan es uno de +stos! Objetivo: el objetivo del jueo es 0dis"arar1 las bolas hasta hacerlas desaparecer del escenario! /e remarc ado en nerita disparar porque) en muchas ocasiones) los objetivos de un jueo de(inen su +nero! *ersonajes: 0uestro personaje es un cazador de bolas! Dependiendo de muchos (actores) nuestro h+roe tambi+n puede determinar varios par,metros de nuestro jueo$ la ambientaci-n) elementos interactivos) enemios y) SO2RE TODO / !NTE TODO) la ju$abilidad( "l personaje que encarnar, el juador debe ser acorde con el mundo que hemos imainado para +l 1hay e.cepciones que con(irman la rela) as# que ojo2! Enemi$os: 3as bolas antes mencionadas) ser,n nuestro enemio en este jueo) saltar,n y rebotar,n entre si para hacerlas m,s impredecibles 1un aadido respecto al jueo oriinal2! si nos toca) perderemos una oportunidad! 3ame"la': 4ada jueo se juea de una manera 5nica) por muy parecido que sea a otro jueo 1o por muy remake que sea2! *qu# e.pondremos los elementos que tenan que ver con la juabilidad! "ntre ellos los 6tems) Po7er %ps) niveles) n8 de vidas) continuaciones) puntuaci-n y un laro etc+tera de elementos de jueo! Control: 94-mo y de que manera interactuar, el personaje con el entorno: 4uando hablamos de entorno) es el ;undo en su totalidad que hemos creado para que el personaje campe a sus anchas y lore sus objetivos! "n nuestro jueo) nuestro h+roe se mover, de izquierda a derecha y disparar) posiblemente tena que subir escaleras 14osa que no voy a hacer yo) pero s# vosotros si quer+is2! Escenarios4Niveles45ases ' dems nombres: 94uantos niveles tendr, que pasar nuestro personaje para terminar con su objetivo:) esto es cosa vostra! Pero deber#an ser su(icientes para satis(acer al juador< ni muy pocos) ni muchos! 4ada nivel) por rela de =R=) debe ser mas desa(iante que el anterior! Diseo !rt6stico: >er, un remake) y en el jueo de re(erencia me pas+ casi por el (orro el diseo art#stico 1mas bien porque es un proyecto de entrenamiento2! Pero vosotros 06 D" 4=?* lo ha,is! 3a ente come por los ojos) y si ve un jueo cuya presentaci-n visual no le llame la atenci-n) pasar, de +l! "n esta eneraci-n de la industria se valor, much#simo el aspecto visual 1y la historia2 que en anteriores! *s# que tened mucho cuidado con este aspecto! 7+anos a la obra 8*rimeros "asos9: 'ras terminar vuestro documento de diseo) es hora de abrir %nity @D y crear un nuevo proyecto) llamadlo como os de la real ana! *hora coemos la c,mara y) en su propiedad trans(orm) la ponemos a ABC)DBC) EBFGC! "n sus propiedades de c,mara) marcamos la de =rtoraphic! 0='*$ 3a c,mara ortor,(ica no detecta distancia pese a que estemos haciendo una escena @D) por consecuencia) todos los objetos tendr,n el mismo tamao sin importar la lejan#a! *provechad esto para poner capas de im,enes o planos en vuestros escenarios o para hacer men5s! 0='*$ para hacer e(ectos de Eoom en una c,mara =rtor,(ica) simplemente bajaremos el =rtoraphic size1por de(ecto est, a GCC2! *hora cread un 3iht >ource) para ello vais a 3ameObject;;Create;;Directional )i$t 1haced esto si el material que us,is le a(ecta la iluminaci-n2 y dej,is las propiedades tal cual est,n! 0='*$ hay @ tipos de luces en %nity @D) la directional 3iht emula la direcci-n de los rayos del sol! "l >pot3iht emular#a un (oco de luz y el Point 3iht emular#a iluminaci-n ambiental) como la provocada por el (ueo o una e.plosi-n! Creando un men< "rinci"al sim"le: %na vez hecho el paso de la p,ina anterior 1lo deber+is de hacer cada vez que ha,is un nuevo nivel2) empecemos con hacer el men5 principal! 0='*$ Do lo voy a hacer a mi manera) os recomiendo que vosotros lo ha,is a la vuestra teniendo en cuenta mi manera como base! Recursos necesarios: 6m,en del men5 principal Huente de letra que mas os de rabia G! 4reamos un material) en el selector de shaders seleccionamos *article;;!l"a2lend% ponemos nuestra te.tura de men5 principal y en las propiedades de color ponemos el color *lpha al m,.imo! &! "n el men5 de herramientas) vamos a 3ameObject;;Create Oter;;*lane% con esto crearemos un plano! "n la propiedad trans(orm del plano) pondremos como coordenadas =/.>;8?%?%?9 para ponerlo en nuestro punto de vista) lueo en la propiedad rotation pondremos =/.>;8@?%AB?%@?9 1siempre y cuando se os vea la imaen al rev+s cuando insert+is el material que creaste para la te.tura) de lo contrario) insertad las coordenadas de rotaci-n siuientes$ =/.>;8AB?%?%?92! "n el componente ;esh Renderer) tenemos una propiedad llamada materials) en esta seleccione el material del men5 principal! @! 6d a 3ameObject;;Create Oter;;3UITeCt para crear una zona de te.to en pantalla) copiad) pead y modi(icad sus valores y al (inal el resultado ser, alo as#$ I! Por 5ltimo$ /aremos un >cript que nos lleve al siuiente nivel cuando pulsemos espacio o el bot-n B del mando de AB=A @JC) haciendo que el G%6'e.t que pone pulsa "spacio o bot-n B para empezar parpadee! I!G! Primero) crearemos un script con variables y (unciones lobales en Kscript$ * este le llamaremos Globals) para ello) vamos a !ssets;;Create;;Davascri"t para crear un documento de javascript) lo nombraremos Globals y hacemos doble click en +l para editarlo! I!&! "n el documento escribiremos ">'=$ Globals!js static var littleBallse.ploded $ int B C< LLbolas pequeas que has e.plotado static var Ballsto7in $int B C< LLbolas pequeas necesarias para anar static var 3ives $int B @< LLvidas restantes static var 3evels $ int BC< LL0ivel en el que te encuentras static var /ook $ boolean B (alse< LLPo7er%p Gar(io static var double*rpoon $ boolean B (alse< LLPo7er %p doble arp-n static var Bulletlimit $int B C< LL3#mite de disparos static var >core B C< LLPuntuaci-n total 0='*$ 3as variables lobales ser,n nuestro ran aliado para operaciones y scripts que necesiten un valor que no cambie tras volver a carar una escena! I!@! *hora crearemos un >cript de la misma manera que en el paso I!G) pero esta vez le llamaremos >tartGame) y escribiremos en +l ">'=$ >tartGame!js var te.to$ G%6'e.t< LLel objeto te.to que parpadear, private var Hadete.ttime $ (loat B C< LLcontador de tiempo LL"sta (unci-n nos permitir, setear varias variables al valor por de(ecto que deseemos cuando empiece la escena (unction >tart12 M Globals!3ives B @< Globals!>core B C< Globals!Bulletlimit B C< N (unction %pdate 12 M LL"sta (unci-n se repetir, cada (rame i(16nput!GetButtonDo7n1OKumpO22 M *pplication!3oad3evel1Globals!3evels P G2< LL>i pulsamos el bot-n especi(icado como Kump1en mi caso ser, espacio o Boton B del mando de AB=A@JC2 el jueo carar, el pr-.imo nivel y seremos transportados a +ste! N i(16nput!GetQeyDo7n1Qey4ode!422 M *pplication!=pen%R31Ohttp$LLelcazadordeleyendas!blospot!comLO2< LL>i pulsamos el bot-n especi(icado 1aqu#) la tecla 4 del teclado2) se abrir, el e.plorador por de(ecto y nos llevar, a la p,ina 7eb especi(icada2 N i(16nput!GetButtonDo7n1O".itO2 RR 6nput!GetQeyDo7n1Qey4ode!"scape22 M *pplication!Suit12< LL>i pulsamos la tecla indicada saldremos del jueo N i(1Hadete.ttime T G2 M Hadete.ttime B Hadete.ttime P G U 'ime!delta'ime< LLmientras que nuestro contador tena un valor in(erior a G) su valor sera sumado por el tiempo que ha pasado despu+s del 5ltimo (rame N else M te.to!te.t B OO< Hadete.ttime B Hadete.ttime P G U 'ime!delta'ime< LLde lo contrario) no mostrar, te.to aluno i(1Hadete.ttime VB &2 M te.to!te.t B OPulsa espacio o el boton B para juarO< Hadete.ttime B C< LLy si el tiempo es superior a &) mostrar, el te.to otra vez y reiniciar, el contador N N N I!I! *hora seleccionaremos el plano que hicimos antes y le aadiremos nuestro script >tartGame yendo a Com"onet;;Scri"ts;;Start3ame y en la variable te.to de >tartGame) seleccionaremos el G%6'e.t que parpadear,! W! *hora lo 5nico que nos queda ser, aadir el nivel al ejecutable) para ello iremos a 5ile;;2uild Seetin$s% nos aparecer, una ventana con una lista de niveles 1vac#a en este caso2) simplemente pincharemos en el *dd 4urrent debajo de la lista para aadir la escena que contendr, nuestro men5 principal! 4=0>"K=>$ juad e investiad un poco sobre las G%6s) descubrir+is muchos trucos para darle una curiosa presentaci-n a vuestros jueos racias a ello! *re"arando el 3ame"la': *!SOS 3ENER!)ES: Estos "asos se an de acer inde"endientemente de los objetos &ue a$amos% son "asos &ue aremos en la ma'or6a de los casos ' estarn indicados cuando sea necesario: !9 Crear un material "ara el modelo ED e im"lementarlo en Fl: G( "n la barra de herramientas) vamos a !ssets;;Create;;+aterial para crear un material en la carpeta del proyecto! 0='*$ 6ntentad ser ordenados y oranizad los archivos que cre+is o import+is en di(erentes carpetas) cuanto m,s oranizado y clasi(icado ten,is la carpeta de proyecto) mejor! &! Pinchad en el material creado) met+is el nombre que quer,is asinarle y) en el inspector) seleccion,is el shader) propiedades y te.turaLs que ve,is convenientes! 29 Im"ortar TeCturas u otros elementos al "ro'ecto8manera G9: G! 6d a !ssets;;Im"ort NeH !sset y eleid los archivos que quer,is! C9 Im"ortar TeCturas u otros elementos al "ro'ecto8manera A9: G! *rrastrad los archivos que quieras importar desde el e.plorador de 7indo7s hasta la carpeta de proyecto! D9 Im"ortar TeCturas u otros elementos al "ro'ecto8manera E9: G! "jecuta el paquete !%nity que quer+is descomprimir teniendo el prorama activo mientras est,s en un proyecto! &! "nseuida en unity te mostrar, los archivos que se van a importar del paquete 1puedes seleccionar y deseleccionar los que quieras2) tras eso) dale a aceptar para empezar la importaci-n! E9 Crear un objeto *reIab: G! pinchad !ssets;;Create;;*reIab% en la carpeta de proyecto se crear, un pre(ab vacio) ponedle el nombre que sea conveniente a la situacion! &! *rrastrad el el objeto de la ventana de /ierarchy que quer,is hacia el pre(ab vac#o! @! 8o"cional9"s aconsejable que borr+is de la escena el objeto que hab+is creado como pre(ab 1siempre y cuando sea un objeto instanciable o que aparezca en cierto momento2! 59 !adir Scri"t: G! pinchad en Com"onents;;Scri"ts y busca el script que quieras aadir al pre(abLameobject G( El escenario: G!G! 2ase de escenario: "sta clase de jueos tienen una base prede(inida) tenemos la base) las paredes y el techo) que limitan tanto el movimiento del personaje como el de las bolas! G(A( 2acJ$round: "l pan oriinal usaba un backround dependiendo del pa#s1escenario2 en el que estabas! G(E( 2lo&ues: >on plata(ormas por donde rebotar,n las bolas) las hay de dos tipos) bloques irrompibles y rompibles! 3os rompibles aaden puntos a nuestro marcador y tienen la posibilidad de soltar items! A( )os Items: 'enemos varios items que pueden soltar las bolas al dividirse o desaparecer o los bloques rompibles$ A(G( Doble !r"Kn: "l doble arp-n permitir, hacer dos disparos seuidos al juador) a parte de que nos dar, GCCC puntos! 0='*$ la mayor#a de los bus de disparo que os dar, el jueo mientras lo prob,is1y seu#s este tutorial al pie de letra2 derivar,n sobre el doble arp-n! A(A( 3arIio: "ste arma se pear, a las paredes durante @ seundos) no podremos disparar otro hasta que desaparezca el disparo! A(E( Lida ECtra: *ade una oportunidad m,s o) si tienes @ vidas) aade GC!CCC puntos al marcador! E( )os Enemi$os: E(G( 2ola: 0uestro enemio) se rie por la (#sica y puede colisionar con las dem,s bolas) haci+ndolo medianamente imprevisible E(A( 2ola metlica: "sta bola) a di(erencia que la bola normal) no rebota) pero va lieramente m,s r,pida que la normal! *4'6X6D*D D" R"H%"RE=L60X">'6G*46Y0$ 6ntenta crear m,s tipos de enemios) eso te ayudar, a diversi(icar la juabilidad! M( Debries% "ro'ectiles ' EIectos de "art6culas: "stos son los denominados 6nstanced =bjects) objetos que aparecen 1y se caran en memoria2 cuando lo indicamos! 3os debries son los denominados restos de un objeto al morir o ser destruido! 3os proyectiles) no hace (alta e.plicarlos) la verdad!!! los e(ectos de part#culas son simplemente e(ectos especiales! M(G( 5racciKn de 2ola: 4uando una bola es impactada por un arp-n) +sta se divide en dos m,s pequeas) es conveniente hacer @ tipos de divisiones 13a bola m,s rande del Pan oriinal se divid#a @ veces antes de soltar las bolas m,s pequeas2) cuando el tamao de la bola es muy pequea) est, desaparecer,! M(A( !r"Kn: "l personaje dispara arpones y) dependiendo del item coido) la te.tura del arp-n cambiar,! 'ambi+n dependiendo del 6tem obtenido podemos disparar de una a dos arpones a la vez! >i un arp-n colisiona con una bola o el escenario) al desaparecer nos brindar, la oportunidad de disparar otra vez! M(E( *art6cula de eC"losiKn: 4uando el arp-n colisiona con la bola se produce una e.plosi-n! N( *ersonaje: 0o hay que olvidarse de nuestro personaje principal!!! O( 3UI: 3a inter(az r,(ica del usuario) yo no hice pre(ab de ella) pero quiz,s ser#a una buena idea hacerlo! O(G( Contador de *untos: poco hay que decir de +l) re(lejar, el valor de la variable lobal >core del script Globals!js O(A( +ensaje "rinci"al: Game =ver) >tae 4lear o Pause son mensajes principales que aparecer,n en determinado momento! O(E( +ensaje consejo: >e muestra junto con el mensaje principal) siempre nos indicar, la tecla qu+ hay que tocar para continuar! O(M( Contador de vidas: Poco hay que decir sobre +l!!! 4=0>"K=$ puede que la G%6 sea importante para que el juador vea su estado y estad#sticas! pero la G%6) cuanto m,s minimalista y clara sea)mejor! 0unca hay que saturar al juador con elementos G%6! Creando los *reIabs8I9: )os objetos I6sicos !ntes de nada% a# los "asos comentados en la secciKn 07+anos ! la Obra8*rimeros "asos9:1% "ero esta ve# creando una escena nueva 8' $uardando la anterior9( *ara ma'or comodidad% "ondremos la "antalla de la escena ' la de vista de jue$o en "aralelo "ara "oder visuali#ar los l6mites del escenario ' ajustar medidas( 0='*$ 4rearemos el escenario concorde a la resoluci-n por de(ault de nuestro jueo) que ser, GC&I.ZJ[! E) ESCEN!RIO: G! 4reamos I cubos en 3ameObject;;Create Oter;;Cube y en /ierarchy) les ponemos los nombres$ 'op) 3e(t) Riht y Base y movemos su trans(orm a =/.8?%?%?9! &! * 3e(t y Riht modi(icamos su >cale a =/.8G?%G%G9 y los posicionamos de tal manera de que en la vista de jueo se vea como en la imaen del resultado! @! * 'op y Base modi(icamos su >cale a =/.8GG(MN%?(N%G9 y lo posicionamos de tal manera de que en la vista de jueo se vea como en la im,en del resultado I! 4reamos un Plano en 3ameObject;;Create Oter;;*lane) movemos su trans(orm a =/.8?%?%G(N9 y lo rotamos a =/.8@?%AB?%@?9! \ste ser, nuestro Backround! W! *hora modi(icaremos su >cale de tal manera que se vea como la 6maen del resultado! J! /acer el *aso 3eneral 82%C o D9 Z! /acer el *aso 3eneral 8!9 [! *hora crearemos un nuevo Game=bject en 3ameObject;;Create Em"t') lo posicionaremos en trans(orm =/.8?%?%?9 y lo llamaremos >cenario! ]! "n /ierarchy) emparentamos todos los objetos que hemos creado hasta ahora seleccionando +stos y arrastr,ndolos hasta el Game=bject >cenario! GC! /acer el *aso 3eneral8E9 con el Game=bjet >cenario! RESU)T!DO: )OS 2)O,UES: 2lo&ue Normal: G! 4reamos G cubo en 3ameObject;;Create Oter;;Cube y en /ierarchy) le ponemos como nombre Brick) movemos su trans(orm a =/.8?%?%?9 y modi(icamos su >cale a =/.8G%?(A%G9( &! /acer el *aso 3eneral 8!9 @! /acer el *aso 3eneral 82%C o D9 I! /acer el *aso 3eneral8E9 2lo&ue Rom"ible: G( -acer los mismos "asos &ue con el blo&ue Normal 0='*$ 4omo ves en la imaen) el bloque rompible tiene & capas de te.tura) debes usar el shader Decal para el material! ;,s adelante crearemos el script para que la seunda capa se mueva! ITE+S: ! todos los e creado 0I6sicamente1 de la misma manera% as6 &ue con eC"licar la creaciKn de uno es suIiciente( G! 4reamos G cubo en 3ameObject;;Create Oter;;Cube y en /ierarchy) le ponemos como nombre el item que represente) movemos su trans(orm a =/.8?%?%?9% su >cale a =/.8?(AN%?(AN%?(AN9 y su rotation dependiendo si da problemas!!! &! >eleccionamos el objeto y *adimos un RiidBody en Com"onents;;*'sics;;Ri$id2od' y activamos la propiedad Hreeze Rotation! @! >eleccionamos el objeto y *adimos un 4on(iurable Koint en Com"onents;;*'sics;;ConIi$urable Doint y seleccionamos 3ockeden las propiedades Emotion) *nularA;otion e *nularD;otion! I! /acer el *aso 3eneral 8!9 W! /acer el *aso 3eneral 82%C o D9 J! /acer el *aso 3eneral8E% obli$atorio el "aso E9 )OS ENE+I3OS: 2ola: G! 4reamos una es(era en 3ameObject;;Create Oter;;S"ere y en /ierarchy) ponemos como nombre Ball) movemos su trans(orm a =/.8?%?%?9 y su >cale a =/.8G(N%G(N%G(N9! &! >eleccionamos el objeto y *adimos un RiidBody en Com"onents;;*'sics;;Ri$id2od'( @! >eleccionamos el objeto y *adimos un 4on(iurable Koint en Com"onents;;*'sics;;ConIi$urable Doint y seleccionamos 3ocked en las propiedades Emotion) *nularA;otion e *nularD;otion! I! /acer el *aso 3eneral 8!9 W! /acer el *aso 3eneral 82%C o D9 O( -acer el *aso 3eneral8E9 2ola metlica: G! 4reamos una es(era en 3ameObject;;Create Oter;;S"ere y en /ierarchy) ponemos como nombre /eavy Ball) movemos su trans(orm a =/.8?%?%?9 y su >cale a =/.8?(AN%?(AN%?(AN9! &! Repetir los pasos del & al J del anterior objeto DE2RIES% *RO/ECTI)ES / E5ECTOS DE *!RTPCU)!S: 5racciKn de 2ola: G! 4rear objeto vacio en 3ameObject;;Create Em"t'% le llamaremos Ball Hraction G y lo posicionamos en la position =/.8?%?%?9! &! aadimos dos pre(abs de bola a BallHractionG y le bajamos el >cale a la mitad e intentamos juntarlas desde la position =/.8?%?%?9) separadlos dos d+cimas =8?%A9 entre si para que no colisionen entre si cuando aparezcan! @! /acer *aso 3eneral 8E% obli$atorio "aso E9( I! repetir los pasos de G a @ con la mitad de >cale que el anterior! !r"Kn: G! 4reamos un Plano en 3ameObject;;Create Oter;;*lane) movemos su trans(orm a =/.8?%?%?9 y lo rotamos a =/.8@?%AB?%@?9 y quitamos el componente mesh collider de +l! \sta ser, la punta nuestro arp-n! &! *adimos un line renderer en Com"onents;;+iscellaneous;;)ine Renderer) en la propiedad positions) en size) aadimos & y los con(iuramos de esta manera$ Element ?: =/.8?%QG??%?9 R Element G: =/.8?%Q?(N%?9( D en parameters con(iuramos >tart ^idth y "nd ^idth a C!G! @! /acer *aso 3eneral 8!9( I! 4rear objeto vac#o en 3ameObject;;Create Em"t' y le llamaremos *rpoon! W! aadimos Riidbody y un Raycast 4ollider en Com"onents;;*'sics desactivamos la ravedad en el RiidBody y el 3enht del Raycast 4ollider a GC J! aadimos el objeto plane a *rpoon! Z! /acer Paso 3eneral 82%C o D9 [! /acer *aso 3eneral 8E% obli$atorio "aso E9 *art6culas: G! 4reamos un emisor de part#culas en 3ameObject;;Create Oter;;*article S'stem( &! "n el componente "llipsoid Particle emmiter) cambiamos min y ma. "mmision a GC) minLma. "nery a G) ;inL;a. >ize a C!W) y activamos =ne >hot! @! "n el componente Particle *nimator) cambiamos el 4olor animation _CFI` a los colores que querais) el dampin lo cambiais a C!G y activais el *utodestruct! I! /acer *aso 3eneral8E% obli$atorio el "aso E9( E) *ERSON!DE: G! 4reamos un Plano en 3ameObject;;Create Oter;;*lane) movemos su position a =/.8?%?%?9 y lo rotamos a =/.8@?%AB?%@?9 quitamos el componente mesh collider de +l! \sta ser, la representaci-n visual de nuestro personaje! &! 4reamos un objeto vac#o en 3ameObject;;Create Em"t'% lo llamamos 04haracter y lo posicionamos en =/.8?%?%?9( @! *adimos a este nuevo objeto un 4apsule 4ollider y un RiidBody) +stos componentes est,n en 4omponentsVVPhysics! I! *ctivamos (reeze rotation en RiidBody y 4apsule 4ollider lo modi(icamos de esta manera$ Radius B C!@) /eiht B &) 4enterBADE1FC!GW)FC!@W)C2 W! *adimos el objeto plane a 4haracter! J! /acer *aso 3eneral8!9 Z! /acer *aso 3eneral82%C o D9 [! /acer *aso 3eneral8E9 3UI: Con lo a"rendido en el a"artado 0Creando un men< "rinci"al sim"le1% la manera de acer la a"ariencia I6sica de la 3UI no cambia% as6 &ue% con lo &ue abeis a"rendido en a&uel a"artado% intentad &ue os &uede un resultado similar al de la im$en 8)a 3UI in 3ame tiene 3UI TeCtures% "ero su manejo es similar al 3UI TeCt9( Resultado: Des"uFs de terminarlo% a' dos maneras de reutili#arlo: la "rimera es Icil% "ero tediosa ' la otra com"leja% "ero r"ida( )a Iacil ' tediosa es acer lo mismo en cada nivel% ' la com"leja "ero r"ida es "oner toda la 3UI en un *reIab( Esta se$unda "odria ser com"leja mas bien "or el tema del Iuncionamiento de los scri"ts% "ero tam"oco es &ue sea tan com"licado( Creando los *reIabs 8II9: -ora de "ro$ramar( Este a"artado tiene como 6ndice el mismo a"artado &ue en 0Creando los *reIabs8I91% "or lo &ue% si al$<n objeto necesita un scri"t% Fste se eC"ondr de la misma Iorma ' orden &ue en el a"artado anterior( Recordad &ue "ara aadir nuestro scri"t al "reIab% debemos seleccionar el "reIab desde el directorio de arcivos% no desde -ierarc'% "or&ue "odr6ais "erder la coneCiKn con el "reIab( Recordad tambiFn &ue% si modiIicamos desde "reIab% modiIicaremos todos los objetos &ue ten$an enlace a ese "reIab( )a manera de incluir Scri"t en nuestro "reIab est es"eciIicada en el *aso 3eneral 859( Escenario: En este "reIab meteremos todos los scri"ts &ue ten$an &ue ver con las re$las del jue$oR condiciones "ara $anar% condiciones "ara "erder% etc( *ause 3ame: PauseGame!js var te.to$ G%6'e.t< LL"l Gui'e.t que mostrar, la palabra pausa cuando es pulsado el bot-n de pausa var paused$ boolean B (alse< 44Indica si el jue$o est "ausado o no8"odr6a ser una variable "rivada9 (unction %pdate 12 M i(16nput!GetButtonDo7n1OPauseO2aa paused BB (alse2M te.to!te.t B OPausaO< 'ime!time>cale B C< paused B true< LL>i se pulsa el bot-n de pausa y la variable paused es (alsa) la velocidad del jueo se pausar, y pause sera equivalente a verdadero N else i(16nput!GetButtonDo7n1OPauseO2aa paused BB true2M te.to!te.t B OO< 'ime!time>cale B G< paused B (alse< LL>i se pulsa el bot-n de pausa y la variable paused es verdadera) la velocidad del jueo se reanudar, y pause sera equivalente a (also N i(16nput!GetButtonDo7n1O".itO2 RR 6nput!GetQeyDo7n1Qey4ode!Backspace22 M Globals!3evels B C< *pplication!3oad3evel1Globals!3evels2< LL"n caso de que pulsemos el bot-n indicado) volveremos al men5 principal! N N Score: >core!js var te.to$G%6'e.t< LL"l te.to que mostrar, la puntuaci-n (unction %pdate 12 M te.to!te.t B Globals!>core!'o>trin12< LL*ctualiza e imprime el valor que tiene la variable lobal >core N SoH )ives: >ho73ives!js var livete.ture $ 'e.ture< LL3a te.tura que corresponde a las vidas restantes var lives $ G%6'e.ture_` B _null)null)null`< LLel n5mero de vidas var te.to $ G%6'e.t< LL"l te.to que indica (in de jueo var te.to& $ G%6'e.t< LL"l te.to que indica las instrucciones (unction %pdate 12 MLLDependiendo de cuantas vidas nos quede) se mostrar,n u ocultaran las te.turas1color!a B transparencia2 i(1Globals!3ives BB @2 M lives_&`!color!a B G&[< lives_G`!color!a B G&[< lives_C`!color!a B G&[< N i(1Globals!3ives BB &2 M lives_&`!color!a B C< lives_G`!color!a B G&[< lives_C`!color!a B G&[< N i(1Globals!3ives BB G2 M lives_&`!color!a B C< lives_G`!color!a B C< lives_C`!color!a B G&[< N i(1Globals!3ives BB C2 M LL4uando el numero de vidas llea a C) se mostrar, la pantalla de Game =ver y si pulsamos el bot-n asinado) nos trasladaremos al men5 principal! lives_&`!color!a B C< lives_G`!color!a B C< lives_C`!color!a B C< te.to!te.t B OGame =verO< te.to&!te.t B OPulsa espacio para volver al menu principalO< i(16nput!GetButtonDo7n1OKumpO22 M Globals!3evels B C< *pplication!3oad3evel1Globals!3evels2< N N N Sin: ^in!js var littleballsto7in $ int< LL3as bolas pequeas necesarias para anar var te.toG $ G%6'e.t< LL"l te.to que aparece cuando terminas el nivel var te.to& $ G%6'e.t< LLlas instrucciones para avanzar al siuiente nivel var level $ int< LL"l nivel en el que est,s (unction >tart12 M LLReiniciar las variables lobales de manera de que no se eneren bus Globals!littleBallse.ploded B C< Globals!Ballsto7in B littleballsto7in< Globals!3evels B level< Globals!/ook B (alse< Globals!double*rpoon B (alse< Globals!Bulletlimit B C< N (unction %pdate 12 M i(1Globals!littleBallse.ploded VB Globals!Ballsto7in2 M LL>i el numero de bolas que hemos e.plotado coincide con el numero de bolas e.plotadas necesarias para anar) se mostraran los te.to y avanzaremos de nivel cuando pulsemos el bot-n indicado! te.toG!te.t B O>tae 4learO< te.to&!te.t B OPulsa espacio o el boton B para continuarO< i(16nput!GetButtonDo7n1OKumpO22 M *pplication!3oad3evel1Globals!3evels P G2< i(1b*pplication!is3oadin3evel2 MLL"n caso de no haber m,s niveles) se volver, al men5 principal! Globals!3evels B C< *pplication!3oad3evel1Globals!3evels2<N N N N 2lo&ue Rom"ible: !nimate 5aJe ReIlection: *nimateHakeRe(lection!js var scroll>peed B C!W< LLXelocidad de movimiento del re(lejo (unction %pdate 12 MLLla seunda te.tura se mueve hacia arriba var o((set B 'ime!time U scroll>peed< renderer!material!>et'e.ture=((set 1OcDecal'e.O) Xector&1C)o((set22< N Destro' Object A: Destroy=bject&!js var item $ Game=bject_`< LLlos objetos que dropea al ser destruido (unction =n4ollision"nter 1colision $ 4ollision2 M LLsi el objeto arp-n colisiona con el objeto) destruye el objeto y aumenta en WCC la puntuaci-n total! >e enera un n5mero aleatorio) y si es iual al asinado en las condiciones) dropear, un objeto u otro! Pod+is modi(icarlo a medida que aad,is mas items! (or 1var contact $ 4ontactPoint in colision!contacts2 i(1contact!other4ollider!name BB O*rpoon14lone2O2 M var rot& B Suaternion!Hrom'oRotation1Xector@!up) Xector@!up2< var pos& B contact!point< Globals!>core PB WCC< Destroy1ame=bject2< var dropitem $ intB Random!Rane1C) &C2< i(1dropitem BB W RR dropitem BB GC2 M var 6temdropped $ Game=bject B 6nstantiate1item_C`)pos&)rot&2< N i(1dropitem BB G RR dropitem BB &2 M var 6temdroppedG $ Game=bject B 6nstantiate1item_G`)pos&)rot&2< N i(1dropitem BB ] RR dropitem BB G]2 M var 6temdropped& $ Game=bject B 6nstantiate1item_&`)pos&)rot&2< N N N Doble !r"Kn8Item9: ItemD!r"oon: 6temD*rpoon!js (unction =n4ollision"nter1collision $ 4ollision2 M LL>i el objeto colisiona con el personaje) +ste obtendr, WCC puntos y activara la variable lobal double*rpoon! (or 1var contact $ 4ontactPoint in collision!contacts2 i(1contact!other4ollider!name BB O4haracterO2 M Globals!>core PB WCC< Globals!double*rpoon B true< Globals!/ook B (alse< Destroy1ame=bject2< N N (unction %pdate12 M LL>i el objeto no es recoido en un cierto tiempo) +ste desaparecer, Destroy1ame=bject)@2< N 0='*$ "s posible que haya que hacer unos arrelillos al script) ya que si colisiona con otro objeto y el personaje colisiona con el item) puntua doble! 3o mismo pasa con los dem,s 6tems! 3arIio8Item9: Item-ooJ: 6tem/ook!js LLddem a 6temD*rpoon!js) pero activando el item de ar(io (unction =n4ollision"nter1collision $ 4ollision2 M (or 1var contact $ 4ontactPoint in collision!contacts2 i(1contact!other4ollider!name BB O4haracterO2 M Globals!/ook B true< Globals!double*rpoon B (alse< Globals!>core PB WCC< Destroy1ame=bject2< N N (unction %pdate12 MLL>i el objeto no es recoido en un cierto tiempo) +ste desaparecer, Destroy1ame=bject)@2< N Lida ECtra8Item9: ItemECtra)iIe: 6tem".tra3i(e!js LL>i el objeto colisiona con personaje) si su numero de vidas es @) solamente recibe WCCC puntos) de lo contrario) obtiene una vida! (unction =n4ollision"nter1collision $ 4ollision2 M (or 1var contact $ 4ontactPoint in collision!contacts2 i(1contact!other4ollider!name BB O4haracterO2 M i(1Globals!3ives V &2 Globals!>core PB WCCC< else Globals!3ives PB G< print1Globals!3ives P OquedanO2< Destroy1ame=bject2< N N (unction %pdate12 MLL>i el objeto no es recoido en un cierto tiempo) +ste desaparecer, Destroy1ame=bject)@2< N 2ola8Enemi$o9: 2all+oveStart: Ball;ove>tart!js var vel$(loat B &< LL3a velocidad de desplazamiento lateral de la bola var bump$(loat B GC< LL3a altura de bote de la bola var particle $ Game=bject< LL"l sistema de part#culas que se emitir, cuando el arp-n toque la bola var item $ Game=bject_`< LLlos items que dropear, la bola! var Divisionsection$ Game=bject< LL3a divisi-n que aparecer, cuando la bola es destruida var contactname $ >trin B OBallO< LL"l nombre de la bola en caso de contactar con alo) llamad siempre al pre(ab de bola por este nombre! var *rpoonname $>trin B O*rpoon14lone2O< LL"l nombre del proyectil! var le(torriht $ boolean B true< LL9Xa hacia la izquierda o hacia la derecha: private var dropitem $ int< (unction >tart12M LLdependiendo del valor de le(torriht) la bola empezara a desplazarse hacia la izquierda o hacia la derecha i(1le(torriht BB true2 M riidbody!velocity!. B vel< N else M riidbody!velocity!. B Fvel< N N (unction =n4ollision"nter1collision $ 4ollision2 M (or 1var contact $ 4ontactPoint in collision!contacts2 M LLsi contacta por los laterales) el objeto ir, por el lado contrario i(1contact!normal!. T FC!G2 M riidbody!velocity!. B vel< le(torriht B (alse< N i(1contact!normal!. V C!G2 M riidbody!velocity!. B Fvel< le(torriht B true< N LLsi contacta por debajo) la bola rebotar, i(1contact!normal!y V C!W2 M riidbody!velocity!y B bump< N i(1contact!other4ollider!name BB *rpoonname2 MLL"n caso de que el arp-n colisione con la bola) podremos disparar otra vez mas)a parte de enerar una variable aleatoria que) si su valor coincide con lo estipulado en las instrucciones i() la bola dropear, un objeto! Globals!Bulletlimit FB G< i(1Globals!Bulletlimit T C2 M Globals!Bulletlimit B C< N var rot& B Suaternion!Hrom'oRotation1Xector@!up) Xector@!up2< var pos& B contact!point< var >parks $ Game=bjectB 6nstantiate1particle) pos&) rot&2< dropitem B Random!Rane1C) &C2< i(1dropitem BB W2 M var 6temdropped $ Game=bject B 6nstantiate1item_C`)pos&)rot&2< N i(1dropitem BB G2 M var 6temdroppedG $ Game=bject B 6nstantiate1item_G`)pos&)rot&2< N LL"n caso de que la variable de division est+ vac#a) se sumar, al numero de bolas pequeas destruidas y se obsequiar, con una puntuaci-n de GJCC al juador i(1Divisionsection BB null2 MGlobals!littleBallse.ploded PB G< Globals!>core PB GJCC< Destroy1ame=bject2<N else MLLde lo contrario) la bola ser, reemplazada por la divisi-n correspondiente! var rot B Suaternion!Hrom'oRotation1Xector@!up) Xector@!up2< var pos B trans(orm!position< var Broken $ Game=bject B 6nstantiate1Divisionsection) pos)rot2< LLdependiendo del nombre de la division) el juador sumar, una puntuaci-n u otra i(1Divisionsection!name BB OBallHractionGO2 M Globals!>core PB &CC< N i(1Divisionsection!name BB OBallHraction&O2 M Globals!>core PB ICC< N i(1Divisionsection!name BB OBallHraction@O2 M Globals!>core PB [CC< N Destroy1ame=bject2< N N i(1contact!other4ollider!name BB O4haracterO2 MLLsi la bola contacta con el personaje) el juador perder, una vida y el nivel se reinicar, Globals!3ives FB G< Globals!Bulletlimit B C< *pplication!3oad3evel1Globals!3evels2< N N N (unction =n4ollision>tay1collision$ 4ollision2 MLL"sta (unci-n soluciona ciertos bus) ya que a veces la bola no botaba) lo que hace esta (unci-n es ver en cada (rame si el objeto colisiona con otro) y de ser as#) hara lo que est+ especi(icado en la (unci-n! (or 1var contact $ 4ontactPoint in collision!contacts2 M i(1contact!normal!. T FC!G2 M riidbody!velocity!. B vel< le(torriht B (alse< N i(1contact!normal!. V C!G2 M riidbody!velocity!. B Fvel< le(torriht B true< N i(1contact!normal!y V C!W2 M riidbody!velocity!y B bump< NNN (unction %pdate12 M i(1le(torriht BB true2 M riidbody!velocity!. B vel< N else M riidbody!velocity!. B Fvel< N N 2ola +etlica8Enemi$o9: -eav'2all+oveStart: /eavyBall;ove>tart!js LL6dem a Ball;ove>tart salvo que no hay Hracciones ni tampoco la bola salta var vel$(loat B &< var particle $ Game=bject< var item $ Game=bject_`< var contactname $ >trin B O>phereO< var *rpoonname $>trin B O*rpoon14lone2O< var le(torriht $ boolean B true< private var dropitem $ int< (unction >tart12M i(1le(torriht BB true2 M riidbody!velocity!. B vel< N else M riidbody!velocity!. B Fvel< N N (unction =n4ollision"nter1collision $ 4ollision2 M (or 1var contact $ 4ontactPoint in collision!contacts2 M LL Xisualize the contact point i(1contact!normal!. T FC!G2 M riidbody!velocity!. B vel< le(torriht B (alse< N i(1contact!normal!. V C!G2 M riidbody!velocity!. B Fvel< le(torriht B true< N i(1contact!other4ollider!name BB *rpoonname2 M Globals!Bulletlimit FB G< i(1Globals!Bulletlimit T C2 M Globals!Bulletlimit B C< N var rot& B Suaternion!Hrom'oRotation1Xector@!up) Xector@!up2< var pos& B contact!point< var >parks $ Game=bjectB 6nstantiate1particle) pos&) rot&2< dropitem B Random!Rane1C) &C2< i(1dropitem BB W2 M var 6temdropped $ Game=bject B 6nstantiate1item_C`)pos&)rot&2< N i(1dropitem BB G2 M var 6temdroppedG $ Game=bject B 6nstantiate1item_G`)pos&)rot&2< N i(1dropitem BB G]2 M var 6temdropped& $ Game=bject B 6nstantiate1item_&`)pos&)rot&2< N Globals!littleBallse.ploded PB G< Globals!>core PB GJCC< Destroy1ame=bject2< N i(1contact!other4ollider!name BB O4haracterO2 M Globals!3ives FB G< Globals!Bulletlimit B C< print1Ovida perdida$ O P Globals!3ives PO restantesO2< *pplication!3oad3evel1Globals!3evels2< N N N (unction =n4ollision>tay1collision$ 4ollision2 M(or 1var contact $ 4ontactPoint in collision!contacts2 M LL Xisualize the contact point i(1contact!normal!. T FC!G2 M riidbody!velocity!. B vel< le(torriht B (alse< N i(1contact!normal!. V C!G2 M riidbody!velocity!. B Fvel< le(torriht B true< N NN (unction %pdate12 M i(1le(torriht BB true2 M riidbody!velocity!. B vel< N else M riidbody!velocity!. B Fvel< N N !r"Kn8*ro'ectil9: Destro' Object: 0='*$ "ste script se aade al objeto padre1*rpoon2 Destroy=bject!js (unction =n4ollision"nter 1colision $ 4ollision2 M LL>i est, activado el po7er up de ar(io y colisiona con cualquier cosa que no sea una bola) +ste tardar, @ seundos en desaparecer o hasta colisionar con aluna bola! i(1Globals!/ook BB true2 M (or 1var contact $ 4ontactPoint in colision!contacts2 M i(1contact!other4ollider!name BB OBallO2 MDestroy1ame=bject2<N N riidbody!isQinematic B true< yield ^aitHor>econds1@2< Globals!Bulletlimit FBG< Destroy1ame=bject2< N else MLLDe lo contrario) el arp-n desaparecer, cuando colisione con cualquier cosa que no sea una bola (or 1var contact $ 4ontactPoint in colision!contacts2 i(1contact!other4ollider!name bB OBallO2 Globals!Bulletlimit FBG< i(1Globals!Bulletlimit T C2 M Globals!Bulletlimit B C< N Destroy1ame=bject2< N N Can$e TeCture: 0='*$ "ste script se aade al objeto hijo1*rpoonVVPlane2 4hane'e.ture!js var *rpoonte.ture$ 'e.ture< LL'e.tura que reemplazar, el ar(io (unction %pdate12 MLL>i el po7er up del ar(io est, activado) la te.tura cambiar, a la que est+ asinada i(1Globals!/ook BB true2 renderer!material!main'e.ture B *rpoonte.ture< N *ersonaje: +oveCaracter: 0='*$ se ha de poner en el objeto padre 4haracter ;ove4haracter!js var speed B J< LLXelocidad en la que se mover, el personaje var Ball $ Game=bject< LLel objeto bola private var moveDirection B Xector@!zero< (unction %pdate 12 M LL ;ove the controller riidbody!velocity!. B 6nput!Get*.is1O/orizontalO2 U speed<LLel personaje se mover, dependiendo del control de eje horizontal 1izquierdaLderecha2 i(1Globals!3ives BB C2 M Destroy1this!ame=bject2< LL>i el contador de vidas llea a C) el personaje desaparece! N N !r"oon: 0='*$ se ha de poner en el objeto padre 4haracter *rpoon!js var bulletPre(ab $ Riidbody< LL"l proyectil en si var basescenario$ Game=bject< LLla base del escenario var chara$ Game=bject< LLel personaje var bulletspeed $ int< LLvelocidad de proyectil private var Bullet $ Riidbody< LLvar shotclip $*udio4lip<) usalo cuando quieras reproducir un sonido al disparar!!! aunque necesitas un audio source para ello (unction %pdate 12 M i(1Globals!Bulletlimit BB C aa Globals!double*rpoon BB (alse2 M >hoot12< N else i(1Globals!Bulletlimit T & aa Globals!double*rpoon BB true2 M >hoot12< N N (unction >hoot12 MLLcuando pulses el bot-n de disparo) se enerar, una instanciaLcopia del pre(ab de proyectil y se mover, hacia arriba a la velocidad establecida! * parte) inorar, las colisiones de personaje y la base del escenario i(16nput!GetButtonDo7n1OHireGO22M Bullet B 6nstantiate1bulletPre(ab)trans(orm!positionF Xector@1C)C!W)C2)trans(orm!rotation2< Bullet!velocity B trans(orm!'rans(ormDirection1Xector@1C)bulletspeed)C22< Physics!6nore4ollision1Bullet!collider)trans(orm!root!collider)true2< Physics!6nore4ollision1Bullet!collider)basescenario!collider2< Physics!6nore4ollision1Bullet!collider)chara!collider2< LLaudio!Play=ne>hot1shotclip2< Globals!Bulletlimit PB G< N N Tile!nimation: 0='*$ se ha de poner en el objeto hijo 4haracterVVPlane) a parte) +sta no es la manera adecuada de usar este script 'ile*nimation!js LLvars (or the 7hole sheet var col4ount $ int B I< var ro74ount $ int B I< LLvars (or animation var ro70umber $ int B C< LLEero 6nde.ed var col0umber $ int B C< LLEero 6nde.ed var total4ells $ int B I< var (ps $ int B GC< var o((set $ Xector&< LL;aybe this should be a private var LL%pdate (unction %pdate 12 M i(16nput!Get*.is1O/orizontalO2 V C2 M >et>prite*nimation1col4ount)ro74ount)C)col0umber)total4ells)(ps2< N i(16nput!Get*.is1O/orizontalO2 T C2 M >et>prite*nimation1col4ount)ro74ount)&)col0umber)total4ells)(ps2< N i(16nput!Get*.is1O/orizontalO2 BB C2 M >et>prite*nimation1col4ount)ro74ount)G)col0umber)G)(ps2< N N LL>et>prite*nimation (unction >et>prite*nimation1col4ount $ int)ro74ount $ int)ro70umber $ int)col0umber $ int)total4ells $ int)(ps $ int2M LL 4alculate inde. var inde. $ int B 'ime!time U (ps< LL Repeat 7hen e.haustin all cells inde. B inde. e total4ells<
LL >ize o( every cell var size B Xector& 1G!C L col4ount) G!C L ro74ount2<
LL split into horizontal and vertical inde. var u6nde. B inde. e col4ount< var v6nde. B inde. L col4ount<
LL build o((set LL v coordinate is the bottom o( the imae in openl so 7e need to invert! o((set B Xector& 11u6nde.Pcol0umber2 U size!.) 1G!C F size!y2 F 1v6nde.Pro70umber2 U size!y2<
renderer!material!>et'e.ture=((set 1Oc;ain'e.O) o((set2< renderer!material!>et'e.ture>cale 1Oc;ain'e.O) size2< N Sobre como usar este scri"t% indicarF en donde e conse$uido la versiKn ori$inal: http$LL777!uni(ycommunity!comL7ikiLinde.!php:titleB*nimatinc'iledcte.turecFc".tended *aso Iinal: Debu$$in$ ' creaciKn de niveles Una ve# eco los "reIabs% es la ora de ver su Iuncionamiento( Este "aso lo arFis vosotros solitos "uesto &ue testear nuestra creaciKn en busca de Iallos ' corre$irlos es tarea de cada uno( Unit' ED tiene un "eda#o de manual bien com"letito ' una $i$antesca comunidad de cerca de G?(??? desarrolladores con los &ue com"artir eC"eriencias ' a'udarse entre s6( Sim"lemente buscad en la Heb oIicial o en los manuales &ue vienen en el "ro$rama ' vuestras dudas se resolvern mas "ronto de lo &ue cre6ais( Cuando veis &ue vuestro jue$o este mas o menos libre de errores8nin$<n "ro$rama es "erIecto% ' siem"re a' maneras de disimularlos9( *odFis lan#aros 'a a la creaciKn del nivel( Si abFis se$uido los "asos de esta $u6a% el escenario "rinci"al deber6a estar eco 'a( "or lo tanto% solo &ueda "osicionar en nuestro nivel las bolas ' las "lataIormas 8En el *an$ ori$inal a' escaleras tambiFn% "odFis intentar acerlas9( Intentad &ue la diIicultad de cada nivel sea $radual ' &ue cada = niveles a'a al$uno 0de relaC1% usease% nivel relativamente Iacilito "ara &ue el ju$ador se relaje "ara lue$o se$uir adelante( ! veces no es bueno eC"oner todo el rato al ju$ador con una diIicultad totalmente ascendente( / con estos consejos% me des"ido ' nos vemos en el "rKCimo tutorial de 3ame"la': !rcade 5*S 80on rails1 5irst *erson Sooter9(