Está en la página 1de 36

Tutorial de Gameplay: Shooter 2D

Por jonay Rosales Gonzalez Don Barks Gheist


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(

También podría gustarte