Академический Документы
Профессиональный Документы
Культура Документы
En este caso vamos a tener (cuando lo programemos) un portero que estar en movimiento, por lo
que marcaremos la casilla de verificacin is Kinematic, de nuestro RigidBody 2D, ayudando as a
Unity a realizar mejor los clculos fsicos necesarios y consiguiendo que solo exista colisin con
otros objetos en desplazamiento, como la pelota, y que no se pueda chocar con el poste de la
portera que tiene un Collider esttico (Sin RigidBody). Si probamos a pulsar play y durante el
juego, lanzar la pelota contra nuestro muequito de madera veremos cmo sale rebotada, por lo
que con esto ya podemos avanzar al siguiente paso.
Queremos hacer que nuestro portero de prcticas se mueva constantemente para tratar de
dificultarnos un poco el meter el baln dentro de la portera. Para ello crearemos un nuevo Script
en C# al que vamos a llamar GoalKeeperControl, lo arrastraremos sobre nuestro mueco de
madera, y despus lo editaremos escribiendo el siguiente cdigo:
using UnityEngine;
using System.Collections;
public class GoalKeeperControl : MonoBehaviour
{
public float speed;
// velocidad de movimiento
public float limits;
// Limites del movimiento
private Transform thisTransform;
// Referencia al transform del
portero
private int direction;
// Direccion de movimiento
// tiempo de juego
// Numero entre 1 y 2
// Rango de tiempo aleatorio
// controla el movimiento
/*----------------------------------------------------------------------* - MoveWoodenKeeper() *
* Mueve el portero en una direccion despendiendo de la variable
direction
*
----------------------------------------------------------------------*/
void MoveWoodenKeeper()
{
switch (direction)
{
case 1: // moving right
if (thisTransform.position.x > limits)
{
ChangeDirection(); // si se mueve a la derecha debe ir a la izquierda
}
else
{
thisTransform.Translate(thisTransform.right * speed *
Time.deltaTime);
}
break;
case 2: // moving left
if (thisTransform.position.x < -limits)
{
ChangeDirection(); // si se mueve a la izquierda debe ir a la derecha
}
else
{
thisTransform.Translate(thisTransform.right * -speed *
Time.deltaTime);
}
break;
default:
break;
}
}
}
Como se puede leer en el cdigo tenemos dos variables pblicas de tipo float que posteriormente
ajustaremos desde el Inspector en Unity y que se llaman speed y limits. Estas se encargarn de
definir la velocidad a la que se mover nuestro mueco de prcticas y que limites de movimiento
tiene, que no van a ser ms que una distancia desde el centro donde se sita inicialmente hasta los
palos de la portera.
Despus, tenemos varias variables privadas. Por ejemplo thisTransform lo hemos usado
muchas otras veces y en esta ocasin tiene el mismo objetivo, servir de referencia al transform del
objeto que contiene este script (el portero) para poder usarla y acceder a dicho transform
consumiendo menos recursos por tener que buscarlo cada vez. Por otro lado, la variable entera
direction, se encargar de decidir si el mueco se mueve hacia la derecha o hacia la izquierda de
forma aleatoria. Nos encontraremos tambin timePassed, que almacenar el tiempo que llevamos
de juego en cada momento que el movimiento del portero cambia de direccin y changeTime,
encargada esta ltima de recoger un numero de segundos al azar para hacer el prximo cambio en
el sentido del movimiento y que as no cambie de forma constante y repetitiva.
En Update() vamos a mover nuestro mueco mediante MoveWoodenKeeper() si el tiempo desde
que el nivel se inici (Time.timeSinceLevelLoad es menor que la suma de timePassed +
changeTime. Es decir, si no ha pasado bastante tiempo desde que el portero hizo un cambio de
direccin sumado al tiempo en el que tiene que cambiar de nuevo. En caso contrario, cambiaremos
de direccin con ChangeDirection(), iniciando de nuevo el proceso.
La funcin ChangeDirection() se va a encargar de inicializar timePassed igualndolo al tiempo
desde que el nivel se inici (Time.timeSinceLevelLoad) cada vez que se ejecute esta funcin.
Adems, recoger un valor aleatorio entre 1 y 2 (uno derecha y dos izquierda) y lo almacenar en
direction. Para hacer esto, usamos Random.Range(), en este caso entre 1 y 3 por que al ser
enteros busca la aleatoriedad entre el nmero mnimo y el mximo-1 (es decir no incluye el 3, solo
elige entre 1 y 2). Con esta misma operacin obtenemos tambin un nmero entre 0.3 y 0.7 (a los
que aadimos una f para indicar que son float, es decir, decimales) para decidir el tiempo en
segundos que tardar en volver a cambiar la direccin del movimiento (volviendo a llamarse a esta
funcin). Por ltimo llamamos a MoveWoodeKeeper() para que el mueco ejecute el movimiento
en la nueva direccin elegida.
MoveWoodenKeeper() es una funcin encargada de mover el portero dependiendo hacia donde le
indique la variable direction, que como ya dijimos cambiar cada changeTime segundos. Usamos
pues, un condicional de tipo switch para hacer que se mueva a la derecha si direction vale 1 o a la
izquierda si vale 2. Sin embargo, tambin tenemos que tener en cuenta si la posicin x del portero
de madera ha alcanzado su lmite por la derecha (limits) o por la izquierda (-limits) recurriendo a
condicionales if que comprueben si la posicin del transform es mayor que limits o menor que
-limits. Por otro lado el movimiento en s, lo conseguiremos con thisTransform.Translate(), una
funcin que vara la posicin de un objeto cuando le indiquemos mediante sus parmetros. En este
caso para ir a la derecha usamos thisTransform.right * speed * Time.deltaTime, indicando as
que se mueva a la derecha a velocidad speed y teniendo en cuenta Time.deltaTime para que la
velocidad de movimiento no dependa de la del dispositivo en el que se dibuje. (Esto ya se explic
un poco en anteriores captulos).
Por cierto, en el inspector de Unity he configurado speed a 1.5 y limits a 0.5
Si observamos que el portero se dibuja por detrs de la portera podemos corregir su eje Z del
transform.position desde el inspector. Yo finalmente lo he tenido que poner con un valor de -0.6.
Como vemos, el movimiento del mueco no supone un reto para el jugador, que puede practicar el
tiro a portera libremente, pero s que molesta y le obliga a estar atento y hacer clculos, por lo que
creo que es el entrenamiento perfecto de cara al lanzamiento real en el modo de juego normal.
Podemos pasar entonces a lo siguiente: Reinicio del nivel.
Resulta un poco molesto tener que parar y reiniciar nuestro juego despus de cada tiro, as que
vamos a crear una solucin temporal para que podamos tirar penaltis infinitos hasta que decidamos
detener la partida. Para conseguir esto, recurriremos a
Application.LoadLevel(NombreDeEscena) para cargar la misma escena en la que estamos
actualmente. Para esto tendremos que pensar en un evento para lanzar la accin de reiniciar el
nivel, as que pudiendo elegir factores como el fin del movimiento de la pelota, pulsar una tecla u
otros muchos, nos vamos a decidir por el factor tiempo, es decir, esperaremos un tiempo desde la
pulsacin de la tecla de disparo, o si lo prefers, desde el lanzamiento a portera, dejaremos que el
usuario vea un rato como rebota la pelota o se pierde por el fondo, y restauraremos la escena
actual con el ya citado Application.LoadLevel(). Descrita la explicacin, veamos el cdigo que
introduciremos en el Script PlayerControl.
Primero necesitamos incluir dos variables privadas y una pblica. En este caso timeAfterShoot
ser pblica para poder decidir desde el Inspector de Unity el tiempo que queremos que pase para
reiniciar el nivel despus de tirar a puerta (yo he elegido 3 segundos). Las privadas sern
timeSinceShoot, para guardar el tiempo que pasa desde que se tira a puerta, y un booleano
llamado shooted, que nos avisar de que ya se ha efectuado el lanzamiento. Adems
timeSinceShoot ser inicializado a 0 y shooted a false en la funcin Start(), ya que al inicio de
juego estamos seguros de que no se ha hecho ningn disparo a puerta y necesitamos un punto de
partida.
private float timeSinceShoot; // Tiempo desde que se tira a puerta
private bool shooted;
public float timeAfterShoot; // Timepo necesario para reiniciar
// Use this for initialization
void Start ()
{
timeSinceShoot = 0;
shooted = false;
...
}
Para evitar que el nivel se reinicie constantemente usaremos en Update() el booleano shooted,
que comprobar el tiempo desde que se tir a portera nicamente despus de que se haya
efectuado el tiro y lo har mediante la funcin CheckLevelRestart()
if(shooted) // El jugador tira a puerta, contemos el tiempo hasta
reiniciar
CheckLevelRestart();
Pero antes, para saber cundo se tira a puerta e iniciar el tiempo desde all hasta el reinicio del
nivel, nos vamos a la funcin Shoot() y aadimos las siguientes lneas al final:
timeSinceShoot = Time.timeSinceLevelLoad;
shooted = true;
Indicamos con timeSinceShoot, que tome como referencia el tiempo desde que empez el nivel
para ir contando segundos desde all y con shooted = true, que acabamos de efectuar un tiro a
portera.
Finalmente la funcin CheckLevelRestart() comprobar si el tiempo pasado desde el inicio del
nivel es mayor que el tiempo pasado desde el inicio del nivel al tiro a puerta (timeSinceShoot) ms
timeSinceShoot, que es el tiempo que debe pasar hasta el reinicio del nivel despus del ya
mencionado disparo a puerta. (Cargamos el nivel con Application.LoadLevel(GameScene);)
/*----------------------------------------------------------------------* - CheckLevelRestart() *
* Funcion que comprueba si ha pasado tiempo para reiniciar el nivel
* --------------------------------------------------------------------*/
void CheckLevelRestart()
{
if(Time.timeSinceLevelLoad > timeSinceShoot + timeAfterShoot)
{
Application.LoadLevel("GameScene");
}
}
Si ejecutramos ahora el juego cargara el nivel porque es el nico que tenemos, pero para hacer
bien las cosas necesitamos un poco de trabajo fuera de cdigo con Unity. Iremos a file/Build
Settings y donde pone Scenes in Build, tendremos que cargar nuestra escena actual
GameScene arrastrndola desde la ventana Project.
Como vemos, el juego sigue un poco despus del tiro y no hay una pausa, por lo que el portero
sigue movindose y saca el baln de la portera. Solucionaremos esto creando un nuevo script muy
sencillo llamado GameManager que no vamos a asociar a ningn objeto. En este script
aadiremos una variable de tipo Static para manejar estados del juego que permanecer en la
memoria durante toda la ejecucin y conservar su valor. Y es este el mejor mtodo para hacer
esto? No, pero es el ms sencillo y rpido para nuestro pequeo proyecto, aunque los expertos
programadores pueden recurrir a otro modo de hacer las cosas. Veamos el contenido de
GameManager.
using UnityEngine;
using System.Collections;
public class GameManager : MonoBehaviour
{
public enum States { inGame, Waiting};
// En juego, En espera
public static States gameState; // Estado del juego
}
Hemos utilizado el tipo enum de C# para aclarar los estados de juego. As decidimos que haya dos
estados: en juego y esperando (inGame y Waiting), usando estos para bloquear los controles y
el movimiento del portero cuando estemos en espera y para permitir continuar la partida cuando
estemos en juego.
Cundo vamos a poner el juego en espera? Pues en mi caso he decidido hacerlo cuando la
pelota est en una posicin Y determinada. Con esto, cuando haya lanzado el jugador a puerta y el
baln este subiendo hacia meta, se bloquear en cierto momento el juego impidiendo que el
mueco de madera se siga moviendo y que el usuario contine teniendo el control del personaje.
Para hacer esto vamos a necesitar otro Script que llamaremos BallScript y que enlazaremos con
la pelota (ya veremos que en un futuro prximo nos va a venir muy bien). En este script
escribiremos el siguiente cdigo.
using UnityEngine;
using System.Collections;
public class BallScript : MonoBehaviour
{
Transform thisTransform;
// Use this for initialization
void Start ()
{
thisTransform = transform;
}
// Update is called once per frame
void Update ()
{
if(thisTransform.position.y > 0.2f)
{
GameManager.gameState = GameManager.States.Waiting;
}
}
Por supuesto, para contrarrestar la activacin del juego en espera, vamos a poner el estado de en
juego nada ms comience el juego, para ello dentro del script PlayerControl, dentro y al final de la
funcin Start(), aadiremos la siguiente lnea:
GameManager.gameState = GameManager.States.inGame;
Con esto cada vez que se reinicie el nivel y se invoque a esta funcin, el estado de juego se
colocara como inGame.
Como ltimo paso para bloquear el juego cuando el estado sea Waiting tendremos que colocar
condicionales en PlayerControl y GoalKeeperControl antes de ejecutar las acciones encargadas
del movimiento y el control. As, solo se ejecutar esa parte del cdigo cuando el estado de juego
sea inGame, parndose durante el resto de la ejecucin. (Pongo un ejemplo pero esto se pondra
tanto en Update y FixedUpdate de PlayerControl, como en Update de GoalKeeperControl,
dejando BallScript sin cdigo de este tipo por que queremos ver a la bola rebotar)
if(GameManager.gameState == GameManager.States.inGame)
{
horAxis = Input.GetAxis...
}
Lo siguiente para acabar el captulo de hoy va a ser comprobar si hemos marcado gol. Pero para
conseguir esto tendremos que aadir un Collider (en este caso a un objeto vaco porque queremos
que sea invisible) que ms que Collider tal como hemos visto hasta ahora, har de Trigger o
interruptor, para chivarnos cuando el baln ha entrado en una zona concreta de juego. Este tipo de
objetos no visibles se usan en juegos para activar puertas, interruptores lanzar eventos de
animacin y mil cosas ms.
Creamos por tanto un objeto vacio y le aadimos un Box Collider 2D de una medida x = 1, y =
0.17. Con estas dimensiones podemos centrar nuestro Trigger dentro de la portera, cuando ya se
ha cruzado la lnea blanca de gol y sin acercarnos mucho a los postes, para evitar un falso tanto si
los clculos fsicos de Unity son poco precisos y sealan gol cuando la pelota ha rebotado en uno
de los postes. Por cierto, llamaremos a este objeto GoalZone y es importante marcar la casilla
isTrigger del Collider, para hacer que Unity deje atravesarlo con la pelota y lo utilice como
Trigger.
Una vez lo tenemos listo, en BallScript tendremos que introducir el cdigo que detecte que la
pelota est entrando en esta zona de gol e indicar de alguna forma (temporal por ahora) al jugador
que ha marcado, pero para poder lograrlo tambin tenemos que aprender algunos conocimientos
nuevos sobre nuestro motor de juegos favorito, las etiquetas.
Las Etiquetas nos permiten marcar varios objetos bajo un nombre comn y realizar acciones con
ellos, como comprobar colisiones. Gracias a las etiquetas podemos elegir que un personaje realice
una accin o emita un sonido cuando choca con un tipo concreto de objeto y otras acciones
distintas si choca con otro objeto distinto. (Por ejemplo que la lava nos quite energa y por la hierba
podamos caminar libremente).
Para aadir una etiqueta seleccionaremos nuestro objeto GoalZone y desplegaremos en el
Inspector, al lado de Tag, hasta seleccionar Add Tag Despus, en la casilla Element 0,
introduciremos el nombre de nuestra etiqueta (en este caso tambin GoalZone) y pulsaremos
Enter. Ahora podemos ir de nuevo al inspector, seleccionando el objeto GoalZone y elegir la
etiqueta que acabamos de aadir volviendo a desplegar al lado de Tag y escogiendo esa nueva
etiqueta que habr aparecido.
Como ya tenemos una etiqueta para saber cuando el baln entre en una zona de gol, y as nos
avise, vamos a editar el script BallScript y a aadir el siguiente cdigo (una funcin aparte al final
pero dentro de la clase.
void OnTriggerEnter2D(Collider2D col)
{
if(col.tag == "GoalZone")
{
Debug.Log ("Goal!!");
}
}
Bsicamente OnTriggerEnter2D() es una funcin predefinida de Unity que responde cuando un
objeto entra en la zona del Trigger que hicimos hace un momento. Recibe como parmetro un
Collider2D que hemos llamado col y con el podemos comprobar si el objeto que ha colisionado
cuando la bola entra en la zona tiene la etiqueta GoalZone. En caso de que la bola est dentro
de GoalZone significar que el jugador ha marcado, por lo que usamos Debug.Log para escribir
en la consola de Unity el texto correspondiente (Que se pone entre comillas).
Con esto, veremos como cuando el baln entre en la portera aparecer en la consola de Unity el
mensaje Goal!! indicando que el jugador ha anotado.
En el futuro ya tendremos tiempo de hacer esto de forma mucho ms bonita, pero de momento lo
vamos a dejar as. :)
Publicado por rathsodic en 9:00 2 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Desarrollo, Programacin, Unity
incluiremos unos condicionales con llamadas a una funcin que impide que la flecha contine
rotando.
// Limite de rotacion hacia la izquierda
// la flecha se para al entrar entre un rango de angulos dentro de la
circunferencia
if(thisTransform.eulerAngles.z >= 40 && thisTransform.eulerAngles.z < 50)
{
BlockRotation(-1);
}
// Limite de rotacion hacia la derecha
if(thisTransform.eulerAngles.z > 310 && thisTransform.eulerAngles.z <=
320)
{
BlockRotation(1);
}
Como vemos tenemos que si el ngulo de rotacin en el eje Z del Pivot Point en este caso, esta
entre 40 y 50 grados, vamos a llamar a la funcin que limita dicha rotacin pasndole un -1 para
indicar que estamos girando a la izquierda y si por el contrario el ya citado ngulo esta entre 310 y
320 grados llamaremos a la funcin indicando un 1 positivo para decirle que la rotacin est
siendo a la derecha. De esta forma tendremos la funcin BlockRotation como sigue:
/*----------------------------------------------------------------------* - BlockRotation() *
* Impide a la flecha de apuntar superar el limite de rotacion a la derecha
* ----------------------------------------------------------------------*/
void BlockRotation(int rotationDir)
{
if(rotationDir == -1)
thisTransform.eulerAngles = new Vector3(0,0,40);
else
thisTransform.eulerAngles = new Vector3(0,0,320);
}
Recibe un entero que indica la direccin en la que est rotando la flecha para apuntar (-1 a la
izquierda o 1 a la derecha). Dependiendo de hacia donde sea el giro, va a bloquear en un punto,
no dejando pasar de 40 grados a la izquierda o 320 a la derecha. ngulos que han sido
elegidos para permitir tirar al palo o fuera de portera si hacemos un mal clculo, pero para impedir
que la flecha se coloque sobre el grfico del jugador.
Qu hace la sintaxis eulerAngles? Como podemos ver es una funcin dentro de la clase
Transform encargada de manejar la rotacin a travs de las componentes x,y,z de este en grados.
Si queremos cambiar sus valores tendremos que pasarle un vector3 (de tres componentes) como
vemos en la funcin BlockRotation.
Llega el momento por fin de manejar el tiro a puerta, para lo que vamos a necesitar aadir un par
de componentes a nuestro baln. El primero ser un Box Collider 2D al que aplicaremos un
Physic Material para que pueda chocar con otros objetos en la escena y rebotar. El segundo ser
un Rigidbody 2D que nos permitir aplicar fuerzas para lanzar la pelota a puerta.
Para aadir tanto el Box Collider 2D como el RigidBody 2D, seleccionaremos nuestro objeto Ball
(el baln) e iremos al men Component/Physics2D/Box Collider 2D primero y luego a
El Box Collider 2D rodea el grfico con un cuadrado que ayuda a detectar las colisiones a Unity y
es el ms sencillo de configurar de los dos nuevos componentes. Para empezar tenemos que
saber que el tamao de nuestro baln es demasiado pequeo y dara problemas de clculo al
motor, por lo que vamos a usar un Size o tamao de 0.05 en X y 0.05 en Y que es el mnimo
recomendado para evitar problemas y con l que no vamos a notar diferencia. Adems hay que
destacar que, aunque para un baln puede ser normalmente ms apto un Circle Collider 2D (Con
forma de crculo) como estamos manejando pixel art, el Box Collider 2D cumplir muy bien su
funcin y consume algunos recursos menos al tratar las colisiones.
Con lo hecho hasta ahora aun no hemos terminado con nuestro Box Collider 2D, y es que
queremos que la pelota tenga un poco de rebote y no simplemente colisione y frene en seco. Para
conseguir esto vamos a crear un Physic 2D Material haciendo clic con el botn derecho en la
ventana Project y seleccionando Create/Physics 2D material, al cual vamos a llamar Bounce
Material y a guardarlo en una carpeta llamada Physics Materials para tenerlo todo ordenado.
El material que acabamos de crear va a tener una Friccin (Friction) de 1 y un Bounciness (o
rebote) de 0.1. Con esto hacemos que haya un cierto rebote pero que la friccin pare relativamente
pronto la pelota y as no salga disparada fuera de la pantalla o haga alguna cosa rara. Vamos que
queremos imitar un poco de realismo pero tampoco un comportamiento fsico perfecto.
Como ya tenemos nuestro Bounce Material lo vamos a arrastrar a la ranura Material del Box
Collider 2D de nuestro baln, con lo que este comportamiento se aplicar a la reaccin que
tendr nuestro objeto ante una colisin. (El baln rebotar contra la portera y el portero!)
Cmo configuramos ahora el Rigidbody 2D de nuestro objeto Ball? Para empezar usaremos una
masa (Mass) muy pequea, para que el golpe no sea capaz de desplazar a nuestro portero y
meterlo dentro de la portera. Aplicaremos un Linear Drag de 1.2 para ayudar al frenado de la
pelota y un Angular Drag de 0, porque no queremos que haya rotacin en nuestro grfico durante
su movimiento (bsicamente por que es pixel art y la rotacin no le va a sentar bien grficamente
hablando). Marcaremos la casilla Fixed Angle para remarcar el que no queremos que haya
rotacin y elegiremos en Interpolate el valor Extrapolate, en Sleeping Mode Start Awake y en
Collision Detection el tipo Continuous, que aunque tiene mayor coste de recursos para realizar
clculos nos va a dar mejor resultado (y nuestro juego es pequeito y podemos permitrnoslo).
Qu significa cada cosa? Interpolate es el metodo de clculo para la interpolacin, es decir, algo
as como una previsin de donde estar nuestra pelota en el siguiente fotograma(Extrapolate)
para que al motor no se le escape que vaya a haber contacto con otro GameObject. Por otro lado
Collision Detection indica el mtodo usado para calcular la colisin (Discrete o Continuous) que
indica el tiempo que Unity va a estar "atento" para calcular choques con otros objetos
(Explicaciones un poco "por encima". Para ms info o ms precisa, documentacin de Unity).
Y hemos terminado de configurar nuestro baln! Sin embargo para que funcione tendremos que
aadir la posibilidad de ejecutar un disparo desde el script PlayerControl. Es, por tanto, momento
para volver a editarlo. (Ya estabais impacientes por picar ms cdigo, eh?)
Tras abrir el Script lo primero que haremos ser aadir una referencia pblica al transform del
baln (Ball), con esto seremos capaces de acceder a dicho transform desde el Script
PlayerControl. Aadimos por tanto, la siguiente lnea debajo de la variable rotationSpeed que es
la nica pblica que tenamos hasta ahora:
public Transform ballTransform;
Al hacer esto, volver a Unity y seleccionar nuestro Pivot Point (Que es el que contiene el script
PlayerControl y el encargado de rotar nuestra flecha para apuntar) vemos que se ha aadido una
nueva casilla que espera un Transform. Arrastraremos hasta all el Game Object Ball (El baln de
futbol) indicando as al motor que es a de ese objeto del que necesitamos acceder a su
componente transform.
Podemos por fin aadir el siguiente cdigo dentro de una funcin especial llamada FixedUpdate()
void FixedUpdate()
{
// Si pulsamos la tecla espacio
if(Input.GetKeyDown(KeyCode.Space))
{
Shoot();
}
}
Aqu de forma similar a como ya hicimos anteriormente llamaremos a una funcin Shoot() que
crearemos despus, cuando se reciba el evento de pulsar la tecla Espacio. Esta vez estamos
usando Input.GetKeyDown, que detecta una pulsacin de tecla (presionar hacia abajo) pero no
que la tecla se quede pulsada (Que sera GeKey) o se suelte (GetKeyUp). Respecto al KeyCode,
este toma las teclas a partir de un nombre clave que en este caso es Space para el espacio. Pero
vamos a ver tambin como sera la funcin Shoot()
/*----------------------------------------------------------------------* - Shoot() *
* Funcion encargada de las acciones para tirar a porteria
* ----------------------------------------------------------------------*/
void Shoot()
{
// aadimos fuerza al balon
ballTransform.rigidbody2D.AddForce( thisTransform.up * Time.deltaTime * 800 );
}
Esta funcin aadir al rigidbody 2D del transform de nuestro baln (mediante AddForce) una
fuerza hacia "arriba" haciendo que salga disparado hacia portera en la direccin indicada por la
flecha. Para saber qu direccin debe seguir, tomamos la del Pivot Point (thisTransform) y lo
multiplicamos por una fuerza de 800 que es aceptable y por Time.deltaTime, para ayudar a que su
desplazamiento sea similar aunque vare el rendimiento del dispositivo. Tenemos por fin una
explicacin de por qu llamamos a la funcin Shoot anteriormente desde FixedUpdate y no desde
Update. El motivo es que Unity tiene FixedUpdate como recomendacin para llamadas a procesos
que involucren fsicas, como es el caso de aadir fuerza al RigidBody2D en la funcin Shoot(). Su
utilidad es la misma que Update pero se ejecuta a intervalos constantes y no depende del tiempo
que se tarde en cargar el fotograma como pasaba con Update. Esto lo hace ms apto para
clculos que tengan que ser ms precisos. (Como siempre en la documentacin de Unity
encontrareis una mejor y ms acertada explicacin de la mano de sus creadores).
Si ejecutamos ahora el juego y probamos a pulsar la tecla espacio nos encontraremos tres
problemas. El primero es que el baln sale disparado y se pierde por el fondo de la pantalla
atravesando todos los objetos. El segundo es que si pulsamos repetidamente la tecla espacio
aadimos ms fuerza y mandamos la pelota muy lejos (Es posible que no os deis cuenta de esto
porque la pelota ya se habr salido de la pantalla). Por ltimo, est el tercer problema que es que
la pelota no vuelve a su sitio para que podamos volver a tirar a puerta, por lo que hay que parar el
juego y volver a ejecutarlo si queremos tirar otra vez. Vamos a trabajar por solucionarlos todos,
pero como no nos dar tiempo a algunos en este post, empezaremos por el ms simple. Que la
pelota choque con la portera.
Para aadir una colisin con la portera vamos a aadir un componente Collider a la misma, pero
como esta vez no nos vale una caja, porque la pelota tiene que meterse dentro y eso lo impedira,
usaremos un Poligon Collider 2D. Este en un principio puede parecer la misma caja que el Box
Collider, pero si en la ventana Scene vamos a esta caja que rodea el grfico de nuestra portera y
pulsamos Mayusculas mientras hacemos clic y luego arrastramos sobre una linea, aadiremos
un punto que podremos colocar. As, daremos forma a los palos de nuestra meta para permitir
colisin con ellos (Para borrar usamos control y hacemos clic en alguno de los puntos). Una vez
lista la forma si ejecutamos el juego, podemos ver como la pelota se detiene al tocar alguno de los
palos.
Y aqu nos vamos a quedar por ahora. A ver si en prximos post podemos hacer que nuestro
muequito de madera se haga alguna paradita y podamos volver a intentar meter gol despus de
tirar sin tener que detener el juego. Hasta la prxima.
Una vez con todo cargado en nuestra escena lo configuraremos y colocaremos cada cosa en su
sitio, primero arrastrando de la ventana Project a Hierarchy para poner los objetos en la
escena y despus ajustando su posicin movindolos con el ratn en la ventana Scene o
introduciendo nmeros en los transform de cada objeto a travs del Inspector.
Como gua puedo decir que tengo la cmara configurada en ortogrfico con un tamao de 0.8 y los
objetos en las siguientes posiciones: campo (0, 0, 0), baln (0,-0.47,-0.1), jugador (0, -0.49, -0.2),
portera (0,0.49, -0.03), flecha (0, 0.1, -0.5). Debemos saber que cuando manejamos el eje Z en
el modo 2D de Unity podemos conseguir que unos objetos estn por delante de otros. Por
eso estamos usando valores negativos, para colocar objetos delante del campo que est en Z=0.
Tambin hay que mencionar que vamos a reducir un poco el tamao de la flecha
introduciendo en sus casillas Scale correspondientes a X e Y el valor 0.95 sin preocuparnos
de la Z, ya que al ser un objeto en dos dimensiones, por lo que no tiene profundidad y no nos
importa. (El nico motivo por el que hago esto es para que aprendis a re-escalar desde el
transform, pero si tenemos los objetos desde el principio a su tamao original ser mejor.
Ahora empezamos a ver cosas nuevas despus del repaso. Adems traigo buenas noticias.
Empezaremos a programar un script en C# para que nuestro personajillo de uniforme azul pueda
disparar a puerta.
Para empezar hay un objeto que necesitamos colocar de un modo especial, la flecha. Crearemos
un objeto vacio mediante Create/Empty Object y lo arrastraremos sobre el jugador. Despus
arrastraremos la flecha sobre el objeto vacio (al que debemos dar un nombre, por ejemplo en mi
caso lo he llamado Pivot Point). De este modo el objeto Pivot Point es hijo del jugador y la flecha es
hija de Pivot Point, crendose as una relacin de herencia que hace que si movemos al jugador
sus hijos se muevan con l.
Crearemos por fin un Script en C# al que yo he llamado PlayerControl. (Es importante saber que
se distingue entre maysculas y minsculas y que el nombre de archivo del Script debe coincidir
con el nombre de la clase principal, aunque Unity ya se encarga de nombrarlo todo). Lo
arrastraremos sobre el objeto Pivot Point de la escena y dentro de l vamos a introducir el
siguiente cdigo (observad que hay una parte que escribe Unity al crear cualquier Script).
using UnityEngine;
using System.Collections;
public class PlayerControl : MonoBehaviour
{
// Public variables
public float rotationSpeed;
// velocidad de rotacion para apuntar (90 esta bien)
// Private variables
private Transform thisTransform; // Referencia al transform
private float horAxis; // Eje horizontal
// Use this for initialization
void Start ()
{
// Inicializamos las referencias a los transform
thisTransform = transform;
}
// Update is called once per frame
void Update ()
{
horAxis = Input.GetAxis("Horizontal");
RotateArrow();
}
/*----------------------------------------------------* - RotateArrow() *
* Rota la flecha para apuntar desde un punto de pivote
* (En dicho punto esta este Script)
* ---------------------------------------------------*/
void RotateArrow()
{
Llegamos ahora a la funcin Start(). Una funcin que Unity tiene predefinida y que usa
normalmente para inicializar variables. Esta se va a ejecutar una sola vez al iniciarse la escena.
As dentro de ella guardamos la referencia del transform del objeto en thisTransform como ya
habamos dicho anteriormente, escribiendo la sencilla orden thisTransform = transform.
En la funcin siguiente, es decir Update(), vemos que tenemos otra que est predefinida y que
Unity ejecuta cada fotograma. Es decir, es como un bucle principal de juego que se repetir
La historia de las consolas es larga y esto nos va a llevar bastante tiempo, as que tener
paciencia (y tener paciencia conmigo porque es mi primer tutorial en detalle y estoy aprendiendo).
nimo y a seguir aprendiendo. Hasta el prximo
Publicado por rathsodic en 10:41 0 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Desarrollo, Programacin, Unity
Se abre una ventana donde debemos elegir una carpeta para nuestro nuevo proyecto y luego en el
desplegable marcar la opcin 2D, ya que nuestro juego va a ser 2D y nos vamos a beneficiar del
nuevo sistema de Unity para este tipo de proyectos.
La zona donde aparecen checkboxes para importar packages no nos interesa ya que no usaremos
ninguno de los packages que trae Unity y vamos a hacer todo nosotros
Si quisiramos abrir un proyecto en vez de crear uno nuevo nos iramos, en la misma ventana
llamada Project Wizard, a la pestaa de Open Project, donde elegiramos uno de los proyectos
anteriormente abiertos o pulsaramos sobre el botn Open Other, para buscar entre nuestras
carpetas un proyecto que no aparezca en la lista por no haber sido cargado en otra ocasin.
Configuraremos ahora el tamao de pantalla eligiendo, en el men que hay justo debajo de la
pestaa Game, el icono del + que nos permite aadir una resolucin personalizada. Pondremos
aqu 190x160 que es el tamao que buscamos (Aunque se ver muy pequeo y tendremos que
verlo ampliado o a pantalla completa para nuestras partidas). En Label escribimos lo que
queramos para identificar nuestra resolucin personalizada (por ejemplo yo he puesto Atari2600) y
pulsamos OK para elegirla como resolucin del proyecto actual.
Llega el momento de insertar los recursos necesarios para nuestro juego. Desde nuestro
navegador del sistema operativo arrastramos los archivos a la ventana Project de Unity. Aqu,
para tenerlos ordenados crearemos carpetas. Por ejemplo una para las animaciones, otra para los
Scripts en C#, otra para los Sprites, otra para las escenas, etc. Para hacer esto pulsamos con el
botn derecho del ratn en la ventana de Project y elegimos Create/Folder.
Como vemos este tambin ser el mtodo habitual de crear nuevos recursos en Unity, ya que en
este desplegable encontramos la posibilidad de crear Scripts en los diferentes lenguajes,
Shaders, Prefabs (Que veremos en su momento lo que son), Materiales y un largo etc.
Una vez insertados todos los Sprites que vamos a usar tenemos que configurarlos. Para empezar,
debemos saber que Unity normalmente detecta automticamente el tipo de de recurso que hemos
introducido en el entorno, pero no es infalible, as que deberamos revisarlo. En este caso
elegiremos el tipo Sprite(2D\uGUI) en Texture Type. Despus, como son Sprites simples y no
mapas de Sprites (Que manejaremos en otra ocasin), elegiremos Simple en vez de Multiple;
nos fijaremos en que el Filter Mode sea Point, para que no nos suavice los bordes de nuestro
amado arte creado en Pixel Art y usaremos el tipo Compressed (porque no necesitamos muchos
colores).
Hay una parte que hay que explicar ms para este caso y es Max Size. En esta parte elegimos el
tamao mximo de la textura, como por ejemplo 1024. Unity se maneja mucho mejor con texturas
cuadradas, pero para este caso estamos usando Sprites y lo vamos a pasar un poco por alto, pero
adems, nuestros grficos son muy pequeos. Cuando Unity los guarde no necesitamos que
genere una textura de 1024x1024 de un Sprite que mide 20x20, por lo que elegiremos un tamao
mximo que se adapte a nuestro tamao, que en este caso sera el mnimo de 32x32. Con esto,
nuestro querido motor generar texturas de ese tamao como mximo para nuestro arte y
estaremos ahorrando recursos. Al terminar pulsamos Apply para aplicar los cambios al grfico
elegido. Debemos saber que no tenemos que ir uno por uno, si no que podemos seleccionar todos
los que queramos en la ventana Project y aplicar los cambios juntos. Pero eso s, hay que tener
en cuenta que el tamao de textura puede necesitar variacin, porque habr Sprites entre los que
hemos creado que sern mayores de 32 de ancho o de alto, por lo que tendremos que elegir un
Max Size ms adecuado como 64, 128 o el que sea ligeramente ms grande, es decir, por poner
un ejemplo: Si el campo de juego mide 190x160, el tamao de textura de 128x128 se le queda
pequeo, por lo que elegiremos 256 que es el siguiente.
Una vez configurado todo nuestro arte lo colocamos en la escena. Para hacer esto o arrastramos el
Sprite a la ventana Scene donde podremos moverlo con el ratn, o lo arrastramos a la ventana
Hierarchy, donde aparecer escrito su nombre. Cualquiera de las dos formas es vlida y generar
tanto el nombre en Hierarchy, como el objeto en Scene.
Ahora tenemos que aprender alguna cosilla ms, el uso del Inspector. En esta ventana aparecen
las propiedades del objeto seleccionado, tanto si lo est en la ventana Hierarchy como si lo est
en el Project Window. Cada objeto tendr determinados componentes y podremos aadirle ms
para que tenga nuevas funcionalidades usando el botn Add Component o desde el men
Component de la parte superior de la interfaz. En el caso del campo, vemos que como es un
Sprite2D, tiene el Sprite Renderer, que se encargar de dibujar el grfico en pantalla (Ya
explicaremos ms de este componente si es necesario). El otro que podemos ver es el
componente Transform, que tienen todos los objetos en Unity, incluidos los objetos vacos, y es
que este se encarga de definir su posicin en el espacio, su rotacin y su escala a partir de su X,
su Y, y su Z. Podemos as variar numricamente esta componente del objeto seleccionando e
introduciendo nmeros en estas casillas y sabiendo que, la escala normal de un objeto es (1,1,1)
su rotacin en reposo es (0,0,0) y, teniendo el punto de pivote en el centro, la posicin central en
la pantalla se define con (0,0,0).
Y nos vamos a ir despidiendo por ahora con lo poquito que hemos aprendido, prometiendo mucho
ms (como se puede ver en las imgenes yo llevo el proyecto mucho ms avanzado, jajaja - ejem,
no vale rerse -), pero antes veamos una cosa importante, la cmara. Si seleccionamos la cmara
en el Hierarchy pulsando sobre Main Camera que ya aparece automticamente en la escena,
vemos que tiene algunos componentes ya aadidos. El componente Camera es importante
porque en l definimos como va a mostrarse la escena. Como he dicho en muchas ocasiones para
juegos 2D nos interesa una cmara Ortogrfica, por lo que elegimos Orthographic en
Projection y definimos un tamao que nos enfoque todo nuestro campo de futbol. En mi caso ha
funcionado un Size o tamao de 0.8. Respecto a los Clipping Planes indica los planos de recorte
o distancias a los que la cmara dejar de pintar los objetos cercanos (Near) o lejanos (Far).
Como veis son demasiadas cosas las que hay que tratar para entender cmo funciona todo y el
espacio aqu es limitado, por lo que si hay dudas lo mejor ser investigar un poco por la red o
preguntarme (Si tenis suerte conocer la respuesta, porque tampoco es que sea un experto).
Ahora, eso s, antes de irme debera deciros como guardar una escena, algo diferente al proyecto,
que contiene los recursos que incluisteis en la carpeta de proyecto a travs de la ventana Project
y por lo tanto ya est guardado. Las escenas son como los niveles de juego, es decir, donde vamos
a colocar los objetos. Para guardarlas elegimos en el men superior File/Save Scene y a
continuacin navegaremos a la carpeta deseada dentro de nuestro proyecto (generalmente
Scenes) escribiremos el nombre deseado (En mi caso GameScene) y guardamos. Al abrir de
nuevo el proyecto en un futuro, si queremos recuperar esa escena solo tendremos que usar Open
Scene para cargarla o hacer doble click en su nombre en la ventana Project.
Si estis pensando que soy una mala persona por no colgar el proyecto en algn sitio para
descargarlo y tener todos los recursos necesarios, debis saber que lo hago por vuestro bien y
porque quiero que practiquis y curioseis todo lo posible, adems de que ya expliqu en el post
anterior, los Sprites que necesitaremos y como crearlos. As que a trabajar sin excusas!
Publicado por rathsodic en 9:00 0 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Desarrollo, Unity
El tamao del campo ser de 190x160, que es la resolucin elegida para imitar la de la
mquina que estamos homenajeando, por lo que el resto de objetos tampoco puede tener un gran
tamao. Por ejemplo necesitaremos un lanzador de penaltis y un portero que, en el modo
prctica ser un mueco de madera, as que nos ponemos a hacer un poco de pixel art.
Con un tamao de 20x20 empezamos haciendo bocetos de lo que sera la silueta, luego los
arreglamos hasta darle una forma aceptable y por ltimo coloreamos teniendo cuidado con no
usar demasiados colores, especialmente en horizontal, donde ya tenemos 2 colores por lnea del
fondo y, por lo tanto, solo podramos poner otros 2 para el personaje. Aun as se puede jugar un
poco y dejar unos grficos muy chulos. Crearemos tambin un portero y, para que haya algo de
movimiento, los animaremos con un solo fotograma, la pierna levantada despus del tiro
para el jugador y la mano estirada para tratar de detener el baln para el portero.
Podramos haber hecho que el portero se lanzara para parar el baln y acabara en el suelo, pero
entonces su posicin de tumbado nos habra dado problemas con los colores, dado que tiene
bastantes en vertical y habran cambiado a su posicin horizontal, rompiendo as nuestro lmite de
4 con facilidad.
Dibujaremos tambin una portera de un color gris, para que destaque ligeramente sobre las
lneas de juego del campo, una pelota de un solo color y una flecha que utilizaremos para
apuntar a donde va a tirar nuestro lanzador. No hay que olvidar tambin algunos textos para
hacer indicaciones al usuario y una camiseta que muestre, en una pantalla de inicio, de qu color
ser la camiseta del futbolista que este controle.
La idea de juego es sencilla para que podamos acabarlo pronto. Consistir en una tanda de cinco
penaltis donde, por turnos, haremos una vez el papel de lanzador y otra el de portero. Ganamos si
tras los cinco tiros metemos ms lanzamientos que el rival. Si hay un empate se sigue en tandas
de un lanzamiento donde, si uno mete y el otro falla, se acaba el juego con victoria del primero.
Vamos, lo que son las normas de siempre.
Para hacer el juego un poco ms largo en durabilidad (pero poco) aadiremos un modo
entrenamiento donde lanzar frente a un mueco de madera y sin lmite de tiros. (Por lo que habr
que dibujar el muequito, pero ser fcil a partir de la silueta del propio portero)
Cmo vamos a hacerlo? Pues como ya coment usaremos Unity, as que espero que la gente ya
conozca un poco de este motor, ya que tampoco me voy a poder parar mucho con l. Aun as
vamos a ver una breve introduccin al entorno para ayudarnos a entrar en materia para prximos
captulos.
Como vemos en la imagen el entorno tiene varias zonas. Aunque hay que decir que es
complemente configurable, por lo que las ventanas se pueden colocar de manera muy distinta a
como yo las tengo. Aun as, es fcil abrir y cerrar ventanas nuevas desde el men Window de la
parte superior.
1. La pestaa Game nos muestra la vista de lo que sera nuestro juego. Al pulsar el botn play se
pondr en marcha y podremos verlo en esta pequea ventana o, en caso de configurarlo para ello,
en la pantalla completa.
2. La pestaa Scene es donde colocamos los objetos de nuestro juego, los movemos, los
cambiamos de pantalla Sera como el editor de la escena. Adems en la configuracin de Unity
que yo tengo vemos que en esta zona tambin hay dos pestaas: Animator y Animation. Estas se
usan para animaciones y las veremos ms adelante.
3. La pestaa Hierarchy muestra los objetos que hay en la escena actual. Nos ayuda a
seleccionar ms fcilmente por el nombre sin tener que buscar en escenas muy complicadas,
adems de que el hecho de arrastrar un elemento a esta pestaa, hace que aparezca en la escena
de juego tambin.
4. La pestaa Project muestra los grficos, sonidos, texturas o lo que sea que hayamos cargado o
creado para usar en nuestro juego. Aqu aparecen todos los objetos, estn o no en la escena
actual. Para cargar un archivo externo basta con arrastrarlo desde nuestro navegador de carpetas
del sistema operativo hasta esta pestaa. Sin embargo, una vez cargado todo aqu, podremos
tambin crear carpetas y organizarnos. Conviene no modificar esta estructura creada desde el
propio sistema operativo por si perdemos algn enlace que Unity haya creado.
5. Inspector. Depende de la herramienta, componente u objeto seleccionado el inspector cambiar
mostrndonos sus propiedades. Aqu podremos ajustar muchos detalles y variables, aadir
componentes nuevos, etc.
6. Estos 4 botones se usan para mover el visor, mover un objeto, rotarlo, o cambiar su
tamao respectivamente.
7. Jugar, Pausar y avanzar fotograma a fotograma en nuestro juego.
8. La zona donde podremos configurar las capas y la forma de la interfaz de Unity, es decir,
como estarn distribuidas las ventanas. Las etiquetas se usan para agrupar ciertos objetos. Es algo
que tambin veremos ms adelante.
prximamente ms.
Publicado por rathsodic en 9:30 0 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Grafismo, Pixel Art, Unity
objetos planos, y el nuevo objeto sprite, que viene a ser un Quad donde colocar nuestros grficos
bidimensionales pero se comporta de otra forma. (Ms o menos esto es el 2D de Unity).
Para despedir el post toca comentar algunas cosillas sobre esta publicacin. En primer lugar, est
en ingls, como de costumbre para este tipo de volmenes; en segundo lugar es de principios de
2014, por lo que ya hay por ah otros nuevos, concretamente estoy pendiente de uno que est por
salir, si no ha salido ya, titulado algo parecido a Mastering Unity 2D Development y que se estaba
comentando hace unos das por los foros de desarrolladores Indies. Si finalmente sale y puedo
conseguirlo (porque tardar en llegar a mi pas), lo comentar aqu, como siempre. :)
objetos en pantalla al 100% de su tamao sin importar la distancia hacia donde se encuentren) o
una cmara en perspectiva, consiguiendo que sprites planos se desplacen sobre fondos 3D,
pudiendo as crear proyectos tan interesantes como lo fue en su da Paper Mario.
Gracias a esta nueva forma de desarrollar juegos 2D, aunque tengamos que tener otra mentalidad,
distinta a la del movimiento bidimensional de antes, podremos aprovechar para generar mens de
juego ms dinmicos de forma sencilla, dividir nuestros personajes en piezas para animarlos por
rotacin, o dar cierta sensacin de profundidad en capas de objetos planos, muy til para los
decorados. (En la imagen podis ver el juego Teslagrad como un bonito ejemplo de todo esto)
Unity antes de incorporar sus funciones 2D permita el desarrollo de este tipo de juegos con
algunos trucos de programacin y diseo que han quedado simplificados. Y es que con unos
cuantos Quads (un polgono formado por 2 tringulos), la ya mencionada cmara ortogonal y el
desplazamiento de la textura aplicada al Quad para convertirlo en sprite y, gracias a este,
animarlo,ya tenamos todo lo necesario para recuperar los viejos tiempos de los juegos retro.
Aunque eso s, todos agradecemos la simplificacin que ha supuesto este tipo de desarrollo en las
ltimas versiones del popular motor.
centrarme en la programacin, que era lo que ms problemas iba a darme debido a que no poda
hacer las cosas de la misma manera que en Flash, debido a que iba a usar Unity y C#, que
funcionan de manera diferente a Flash y ActionScript.
El objetivo
El objetivo de este proyecto era dar el paso de publicar en Google Play Store un proyecto creado
ntegramente por mi y as aprender el funcionamiento del sistema de monetizacin mediante
publicidad, adems de currarme un juego del que poder aprender con el tiempo viendo los errores
y aciertos. La opcin de un juego de cartas y memoria me pareci lo mejor para dar este primer
paso, pensando que podra llegar con l hasta 1000 descargas al menos, entre Octubre de 2013 y
Enero de 2014.
Produccin
La realizacin de la planificacin y documentos como el de diseo de juego fueron bastante fciles
debido a que los tena resueltos con el juego original en Flash que realic en su da. Hubo que
adaptar el formato, la forma de jugar (sustituir el ratn por los toques con el dedo en la pantalla) y
el sistema de mens.
Programacin
Algunas de las soluciones usadas en el cdigo ActionScript podan adaptarse a C#, pero otras
tenas que resolverlas de otra forma. Unity (aunque ahora tiene opciones 2D), al contrario que
Flash trabajaba en 3D y muchas cosas haba que hacerlas mediante polgonos. Adems,
evidentemente el cdigo tena que reescribirse en el nuevo lenguaje (de ActionScript a C#) y
adaptar las pantallas, formato de cartas y fondo, GUI e tems al formato mvil y tablet.
Grficos
Aunque hice algunos cambios en los fondos y nuevos mens, la parte grfica estaba casi resuelta.
Tras sustituir el formato de pantalla de un ordenador en horizontal por el vertical y ms alargado de
un dispositivo mvil, decid cambiar la forma de las cartas de rectangular a cuadrado, mostrando
adems solo la cara de las chicas (en el juego original aparecen enteras) debido al pequeo
tamao en el que se veran, dando adems, ms sentido a tener una galera de imgenes donde
desbloquear la imagen completa.
Novedades
Cuando tena el juego listo decid que era demasiado corto. Terminarlo era sencillo, as que trat de
ajustar los records de los niveles para que superarlos no fuera cuestin de una partida. Adems,
aad un nivel extra con las que seran las gemelas de las chicas que mas me gustaban de los
otros niveles y, lo que en mi opinin alarga ms la vida del juego, unos trofeos que desbloquear a
base de esfuerzo y unas cuantas partidas.
Musica y sonido
Recurriendo a temas muy simples que ya tena compuestos y creando alguno nuevo de corta
duracin y preparado para ejecutarse en bucle, tuve resuelta mi pequea banda sonora de 3 temas
(men, pantalla de galera y seleccin de nivel).
Para el sonido grab una carta rozando con la mesa usando un micrfono y us un sintetizador de
sonidos para crear el de activacin de un botn de men, la aparicin de un candado, la de un
reloj, etc. (Eso s, tuve que retocar un poco los sonidos, un ecualizador por aqu, un compresor por
all)
Testeo
Siempre intent ir testeando el juego segn lo desarrollaba, incluso en dispositivos externos (una
tablet y un mvil). Desgraciadamente no se podan probar todos los formatos de pantalla,
resoluciones, velocidades No tengo dinero para comprar todos los dispositivos Android del
mercado! Con el tiempo he visto que a veces la pantalla se corta por los lados o la publicidad da
problemas. (Para el prximo juego espero resolver este problemilla). Por otro lado, no han
aparecido Bugs serios, aunque hubo alguno que en su momento me dio bastantes quebraderos de
cabeza y me cost resolver, como uno relacionado con el momento de pausar el juego cuando las
cartas estaban recuperando su posicin tras fallar la coincidencia de parejas.
Hubo, eso s, un pequeo fallo en el ttulo del juego que se ha quedado en muchas de las capturas
que se pueden ver en este Blog. Durante mucho tiempo no me d cuenta de que haba escrito
Memory G-Cars y me haba comido una "d"... Lo arregl a tiempo.
Resultados
Respecto a los objetivos (que ya esperaba no iba a cumplir, debido a que no soy nada bueno
publicitndome), las descargas obtenidas han sido solo un bajo porcentaje de las que deseaba
conseguir (ahora est entre 100 y 500) y parece que la publicidad no est generando beneficios,
as que tendr que seguir intentndolo para poder pagar el alquiler creando videojuegos. Eso s,
sin duda he aprendido mucho y me he sentido orgulloso de iniciar un nuevo proyecto y llegar a
terminarlo por completo.
Idiomas
Desde el principio tuve claro que no quera tener muchos idiomas para el juego para evitar
complicaciones con la traduccin, as que lo ms sencillo para m fue recurrir al ingls (ya que
todos quieren que lo hablemos pues aprovechmonos de ello)
Unity y Android
Despus del curso de Unity que hice poda defenderme en la programacin de un juego pequeito
como este, pero no haba visto absolutamente nada de Android y no me imaginaba las
complicaciones que iba a darme. Cuando empec, apenas haba documentacin sobre el tema, ya
que era muy reciente la aparicin de licencia gratuita de Unity para este sistema. Tuve as que
buscarme la vida muchas veces y aparmelas pensando cmo hacer las cosas a mi manera
(aunque he de decir que en los foros ya se empezaban a resolver muchas dudas)
Opiniones del pblico
Al pblico en general le sorprendi el pequeo toque adictivo que daban los tems a las mecnicas
clsicas, lo cual me hizo sentir muy orgulloso. Por otro lado parece que a pesar de mis esfuerzos
se qued en un ttulo que proporcionaba pocas horas de diversin. Adems, muchos me pidieron
una tabla de records online para hacer competir a los usuarios (que no tena ni idea de cmo
programar)
Marketing
No soy muy amigo de pasarme por foros, comentar, exponerme en redes sociales y en definitiva
recorrer la red para dar a conocer mis proyectos (hasta comentarlos aqu en el Blog me cuesta),
pero aun as hice un ligero esfuerzo que, evidentemente, no fue suficiente. Tampoco soy bueno
situando mis productos en el buscador de Google Play.
Puedo aprender mucho de esta parte para el futuro, pero s que me costar llegar a dominar esto
porque odio ser pesado con la gente y siempre he pensado de forma idealista que ya llegaran a
mis juegos aquellos usuarios interesados en ellos. (Adems, ahora que hago juegos sobre todo
para aprender cuesta presumir de ellos por su sencillez)
Mis habilidades como jugador
He jugado tantas veces que he descubierto buenas formas de conseguir records. La suerte es un
factor que influye ms de lo que me gustara, ya que es clave obtener relojes y que las cartas
aparezcan bien situadas al principio. Cuando fallamos las cartas tardan un segundo en recuperar
su posicin de boca abajo y no podemos hacer nada, pero si encontramos una pareja no tenemos
que esperar para tocar otra carta. As, podemos intentar ser rpidos.
Coloco aqu mis records, destacando que en el nivel 3 me encontr con una situacin en la que las
parejas estaban situadas juntas y seguidas. Fue todo tocar la pantalla a toda velocidad!
Nivel 1: 00:02
Nivel 2: 00:16
Nivel 3: 00:06
Nivel Extra: 00:38
Agradecimientos
Debo agradecer aqu a todos los que me ayudaron a probar alguna versin del juego (mis primo,
mi novia y otros familiares), a los que me aguantaron aqu delante del ordenador, viviendo como en
otro mundo mientras trabajaba en el proyecto (de nuevo mi novia y mis padres cuando trabajaba
en su casa) y a todas aquellas personas que descargaron, probaron, puntuaron, comentaron o
jugaron Memory GCards. Aunque sean poquitos a mi me hace mucha ilusin. Este es solo un
pasito ms en el camino.
Con este primer experimento realizar una evaluacin del funcionamiento de la plataforma Android
y de cmo llegar al pblico para poder hacer ms y ms juegos en el futuro, que es lo que me
encanta hacer. Y es que lo mejor de haber terminado un proyecto es empezar a planear el
siguiente.
Vamos ahora con una descripcin del juego:
Voltea dos cartas y si las chicas coinciden, encontraras una pareja. Trata de encontrarlas todas en
el menor tiempo que puedas para superar los records y acceder a las imgenes de la galera o
conseguir los retos que te harn completar el 100% del juego.
Aydate de los relojes que encontrars y te darn tiempo extra y ten cuidado con los candados que
bloquearn tus cartas temporalmente si fallas ms de 5 veces.
A los que descargueis el juego para echar unas partidas, les agradezco el apoyo y espero
que disfruteis de un rato de entretenimiento.
Memory GCards puede descargarse del Google Play Store desde el siguiente enlace:
https://play.google.com/store/apps/details?id=com.Perplex.GCards
Publicado por rathsodic en 19:50 4 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Android, Proyectos, Unity
Para un proyecto de videojuegos, hay que tener en cuenta que no se necesita una IA
excesivamente compleja ya que, por un lado, el jugador debe seguir teniendo opciones de ganar y,
por otro en ocasiones, demasiada complejidad, a pesar de lo que podamos pensar, hace que una
IA parezca estpida o con funcionamiento defectuoso.
Un ejemplo interesante al que estuve re-jugando cuando empec esta parte del curso de
Gametopia es el fantstico Pikmin. En este juego resulta divertidsimo ver como los simpticos
personajillos llamados Pikmins, siguen constantemente al protagonista (o los protagonistas, porque
en la segunda entrega hay 2 y en la tercera 3) y a veces tropiezan y se pierden por separarse del
grupo o acaban siendo devorados por la fauna hostil del planeta donde viven.
En fin, que por mi parte, solo algunos ejercicios ms y habr terminado, y he de reconocer que he
aprendido bastante de Unity, pero me queda muchiiiiiiisimo. Quizs cuando tenga hechos unos 50
juegos empezar a tener ms manejo :P
Prototipos en Unity
Hace unos das que termin la primera parte del curso de Unity en Gametopia y estuve ampliando
conocimientos en busca de la sabidura absoluta. A pesar de todo aun me queda mucho para saber
lo suficiente de este motor para juegos (no llevo ni tres meses en serio con l), pero tena que
hacer un proyecto para que me dieran acceso a la parte de Inteligencia Artificial y, tras terminarla,
obtener mi certificado para aadir a la coleccin que yo llamo Papeles que dicen que se algo
sobre videojuegos. El caso es que soy un tipo indeciso, y cada da se me ocurra un proyecto
distinto. Quera hacer algo simple y que me divirtiera a modo de prototipo, as que pas por un
matamarcianos, un pong, un tower defense El resultado de tantas dudas y tanto cambiar la idea
de que iba a entregar ha conseguido que se me echara el tiempo encima y he acabado haciendo
un juego muy sencillo de tirar penaltis. Ya seguiremos aprendiendo y haremos cosas mejores con
tiempo.
El desarrollo de este tipo de prototipos sirven a los programadores como aprendizaje. No hay que
mirar que quede bonito y te centras en la resolucin de problemas de tipos o gneros concretos de
juegos y, con el resultado final, puedes probar que el gameplay sea divertido y el proyecto
enganche. Se observa tambin que cosas pueden cambiarse o aadirse, y que coste de desarrollo
Evitar el Hardcoding
El Hard-code es un trmino en el mundo de la programacin que se refiere a una mala costumbre
de poner los datos directamente en el cdigo de nuestro programa o juego.
Ahora que estoy empezando con Unity he visto que resulta muy til usar variables pblicas, a las
que se puede acceder desde el propio inspector del motor, para modificar datos y hacer pruebas de
juegos con distintos valores establecidos. De esta forma, por fin me estoy dando cuenta que hay
que huir del ya comentado Hard-code para facilitarse las cosas a medio-largo plazo.
Me explico
Imaginemos que estamos haciendo un juego de estrategia y pensamos que podra tener 12 casillas
de alto por 16 de largo. El hardcoding sera escribir ese 12 y ese 16, as como suenan,
directamente en alguna parte del cdigo cuando necesitemos especificar el tamao de nuestro
escenario. Si ms adelante decidimos que era ms ptimo tener casillas ms grandes y que haya
solo 8 x12 tendremos que bucear entre todo lo escrito y cambiar esos nmeros estn donde
estn. Por eso es una mala prctica!
En su lugar lo ideal suele ser irse a la zona de declaracin de variables de nuestro cdigo y escribir
una constante (o una variable pblica en el caso de Unity, para poder modificarla desde fuera) y
usarla despus en lugar de los datos en bruto. En el ejemplo anterior podramos, por ejemplo, tener
anchoTablero = 16 y largoTablero = 12, con lo que si hubiese que cambiarlo tenemos las variables
localizadas al principio del cdigo y resulta mucho ms fcil actualizar.
A nivel de diseo podemos probar, por ejemplo, en un juego de coches con una velocidad
determinada y cambiarla si vemos que parece exagerada y hace la conduccin imposible o si nos
ha quedado un vehculo demasiado lento. Para lograrlo Qu tal una variable pblica llamada
velocidad, a la que podemos acceder sin meternos en nuestro archivo fuente y con la que podemos
jugar para hacer testeos? (En este caso vuelvo a hablar del motor Unity, pero tambin se pueden
tener variables fcilmente localizables en todo el cdigo que escribamos sin importar el lenguaje)
Gracias a esta forma de trabajo tendremos mayor facilidad para hacer test y ajustar todas las
variables importantes de nuestro juego hasta situarlas en su punto ptimo, como pueden ser la
gravedad de un juego de plataformas, el nmero de balas o magias en juegos de accin, etc.
Acabo de finalizar la primera parte del curso de Unity que estoy cursando en Gametopia y ahora
me toca ponerme a hacer un pequeo proyecto de videojuego con lo aprendido para acceder a la
segunda parte, la que tiene que ver con Inteligencia Artificial. Pero alguno se preguntar Eres ya
experto en Unity? y la respuesta es fcil de contestar. Todos los cursos, y no solo los relacionados
con videojuegos, e incluso los programas de formacin profesional o carreras universitarias, son
introductorios y necesitan que luego trabajemos para profundizar en nuestros conocimientos, junto
con un montn de horas de practicar y practicar para ganar experiencia. Por ello me he puesto a
buscar ms informacin sobre este motor de Juegos en Internet y he encontrado algunas pginas
interesantes para que mi aprendizaje se acerque ms a lo profesional.
Para empezar tenemos la Web de Unity con tutoriales y un manual de referencia que nos sacar
de ms de un apuro. Aqu, podremos aprender todo sobre las fsicas, importacin de modelos,
escritura de scrips en los 3 lenguajes que permite Unity e incluso ejemplos de juegos hechos. Un
sitio interesante pero, eso s, en ingls.
Para profundizar ms en la parte de cdigo tenemos un Blog (http://unityscripts.blogspot.com.es/)
muy interesante de alguien que se ha currado explicaciones de cada una de las clases que tiene
este motor con ejemplos en espaol. Lo hace todo con JavaScript, pero es bastante sencillo
convertirlo a otro lenguaje (que me parece ms interesante) como C#. Si por un casual tenis
problemas con esto ltimo hay una solucin muy buena. En esta pgina est disponible un
convertidor del cdigo JavaScript a C#.
Quedaos bien con la ltima pgina recomendada, por que tambin en la que os comento ahora se
programa con JavaScript. Aqu, tenis una Web repleta de videotutoriales sobre Unity, con
exmenes incluidos para evaluar los conocimientos aprendidos y varios ejemplos de videojuegos
hechos (por ejemplo un Mario 2D y otro 3D) e incluso de modelos a importar junto con el cmo
hacerlo. Esta ltima Web, cuyo contenido est tambin en ingls, me ha gustado mucho y en solo
un par de das me he visto prcticamente todos los videos y ya estoy haciendo los proyectos que
vienen como ejemplo (tengo unas ganas de llegar al Mario en 3D)
As, buscando material, practicando y creando juegos, seguir intentando convertir a Unity en mi
motor favorito y con el que ms cosas voy a crear, pero eso s, no quiero dejar de lado la
programacin desde cero, por que uno se acomoda y olvida las cosas ms bsicas.
Contar el resultado del curso de Gametopia cuando lo termine del todo, pero como ya adelant,
me est gustando bastante, aunque como ya digo, despus queda un largo camino de aprender y
fijar en nuestra memoria lo aprendido.
He ledo unos cuantos libros sobre Unity pero nunca llegu a ponerme con l en profundidad,
trabajando da a da y tratando de fijar conocimientos en mi memoria (mala memoria, eso s)
Siempre me echaba un poco para atrs el que hubiera una versin de pago y me limitaran cosas,
adems del hecho de que me gustan los juegos 2D y rara vez se me ocurren ideas interesantes
para juegos en 3D que sean realizables en un periodo de tiempo razonable. Por todo eso nunca
llegu a ponerme en serio con este motor y mir otras opciones como Flash para desarrollar mis
juegos (Aunque la verdad es que con tantos motores, lenguajes y software uno ya no saba con
que ponerse a crear).
El caso es que he sacado algo de tiempo libre por fin (no mucho) y he decidido apuntarme al curso
de Unity que hace Gametopia en versin Online desde hace algn tiempo. Tengo buenos
recuerdos de cmo trabajan por que ya es mi tercer curso all (Guiones y Betatester fueron los
primeros) y, por otro lado, a veces el gastarse algo de pasta en algo te obliga un poco a no dejarlo
aparcado. As que despus de haber hecho los 3 primeros temas del curso (empec ayer) me he
propuesto ponerme en serio y usar Unity como motor preferido, junto con C# como lenguaje para
programar scripts en l (antes usaba javascript).
De momento solo he mirado un poco el entorno y conseguido que un coche se mueva adelante y
atrs, recordando que quiz lo que se me hace ms pesado de los juegos 3D es tener que hacer
todos los elementos que lo componen, que llevan un trabajo doble por que tambin hay que pintar
las texturas (o triple o cudruple si nos metemos en Next-Gen).
Con el tiempo, quiero desarrollar algn jueguecillo y ver las opciones de exportacin a distintas
plataformas, profundizar ms en el lenguaje C# (si ahora voy a hacer de programador habr que
mirar lenguajes en profundidad) y sobretodo ser constante en el uso del motor para no olvidar lo
aprendido. Es lo que recomendara a cualquiera que quiera trabajar en un motor determinado,
aunque no hay que cerrar otras opciones por completo por si algn da hay que adaptarse.
Para aquellos que queris saber ms de Gametopia y sus cursos sobre videojuegos, su pgina es:
http://www.gametopia.es/
(Por supuesto tambin me he apuntado al mdulo de Inteligencia Artificial, que no quiero que mis
enemigos se queden ah parados esperando que los maten y ya est :P)
improvisados, tambin son tiles y se puede aprender de ellos. Parecen ser una prometedora
forma de introducirse en el motor y aprender a hacer nuestros primeros juegos en el futuro, as que
habr que seguirlos.
Tambin, este sitio Web, puede nacer un punto de encuentro para desarrolladores, donde
encontrar colaboradores, socios y consejos. Aunque recordemos que, para eso, en Espaa ya
tenemos stratos-ad.com, la cual es dificil de superar en este aspecto.
Este es el mejor libro sobre Unity de los que he podido ver hasta ahora, pero tambin el que
requiere un nivel ms avanzado, tanto, que yo seguramente tendr que volver a repasarme
muchas cosas del mismo cuando tenga algunos conocimientos ms. Es largo de leer por que tiene
mucho cdigo fuente, pero como todos los otros volumenes de este estilo podemos descargarnos
toda la parte grfica con la que seguir los ejemplos, asi que no tendremos que trabajar nada de esa
parte, salvo todo el tema de exportacin desde nuestro software 3D favorito o aplicacin de
texturas (hay un capitulo en el que podrmos programar un Shader, pero se ve muy de pasada).
Los ejemplos: Hay varios ejemplos de juegos que van desde un sencillo juego de plataformas 2D
hasta un par de demos en 3 persona, siendo uno de ellos con cmara al hombro, como por
ejemplo, lo fue Resident Evil 4.
Extras: El libro cuenta con unas cuantas pginas finales donde se nos recuerda las funciones de
Unity ms importantes y tiles que vemos durante el desarrollo de los ejemplos y nos indica como y
donde obtener ms documentacin sobre ellas. Esto es tremendamente til ya que, adems de
que hay determinadas instrucciones que practicamente usaremos siempre (como Update()),
tambin hay algunas que nos ayudaran a resolver problemas que se podran hacer de otro modo
muchisimo ms dificil y menos ptimo.
Los contras: Se nos pone constantemente los dientes largos sobre lo que podramos hacer si
pagaramos por la versin Pro de Unity. Que si estas luces son mas chulas pero no estn en la
versin gratuita, que si esta herramienta nos ayuda a optimizar mejor el rendimiento de nuestro
juego pero solo est activada en Unity Pro Claro que no es culpa del autor del libro, es que hay
que pagar por usar el motor a un nivel ms profesional.
En resumen es un tomo que requiere cierto nivel en programacin y en movernos por el entorno de
Unity para sacarle el mximo partido, aunque esta muy bien explicado paso por paso y cualquier
persona podra, siguiendo las instrucciones, desarrollar los ejemplos que se proponen (eso si, sin
comprender demasiado lo que est haciendo). As que si quereis llegar un paso ms all y
aprender sobre colisiones de objetos 3D, IA, mens de juego e su interfaz, eventos, grabar y cargar
partidas y un largo etc. que tiene que ver con el mundo del desarrollo de videojuegos, merece
totalmente la pena la inversin.
Por mi parte voy a seguir profundizando ms en este entretenido y completo motor de juegos
volviendo un poco atrs, a lo ms bsico, y ya repasar lo que no recuerde de lo ms avanzado
cuando me ponga con algn proyecto concreto en el que necesite ayuda.
Publicado por rathsodic en 16:30 7 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Desarrollo, Libros, Unity
Y ya voy por la pgina 100 del segundo, del que ya contar algo y ensear imgenes de los
juegos que se hacen en sus tutoriales. Pero como ya he dicho (que si, en el ttulo), acabo de
terminar: Unity 3.x Game Development by Example. En el que se van haciendo varios juegos muy
sencillos (sin mucho nivel grfico ni un gran gameplay) donde se nos ensean las bases de
Javascrip para Unity, el entorno, animacin, sonido, etc. Todo se comenta de forma muy
introductoria, pero sienta las bases para que, por nuestra cuenta, podamos seguir investigando y
aprendiendo a usar el Motor.
En este volumen el 3D esta en cierto modo ignorado. Para empezar por que los juegos que se
hacen no tienen realmente un movimiento tridimensional, si no que se nos ensea a controlar con
el ratn practicamente solo en el eje xy y, en segundo lugar, por que no se nos ensea a importar
modelos desde software 3D ni tampoco a usar dichos modelos. En el nico proyecto que tiene un
desplazamiento 3D real, se hace todo por animacin, de manera que el personaje anda en 1
persona pero en forma de video, sin que nosotros lo controlemos.
(Por cierto, que se nos proporcionan todos los grficos para hacer los ejemplos en el libro)
En fin, el caso es que despus de esta introduccin al motor Unity (no descarto escribir tutoriales
cuando lo domine medianamente), y gracias a la emocin que me produce ver conferencias sobre
la industria de los videojuegos (me refiero a IDAME), he seguido aprendiendo y haciendo
ejemplos como un loco, y ya tengo varios libros ms vistos para profundizar todo lo posible antes
de plantearme un proyecto de juego en 3D propio.
Quiero acabar juegos!! A ver si encuentro ratitos libres con los estudios
Publicado por rathsodic en 23:24 0 comentarios
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con FacebookCompartir en Pinterest
Etiquetas: Desarrollo, Libros, Unity
Para volver a tener contacto con el anteriormente abandonado por mi, motor Unity, he decidido
hacerme con un buen arsenal de cursos, tutoriales y libros, adems de unos cuantos archivos de
entornos y personajes en 3D anteriormente modelados, por si llegaba el momento de usarlos. As,
mi primera opcin ha sido el volumen titulado Unity 3.x Game Development by Example que tiene
bastante buena pinta segn lo que he podido hojear.
Para empezar, como en la mayora de textos sobre Unity, se entra en materia con el entorno: Para
que sirve cada zona de la pantalla, como crear un proyecto, guardarlo, etc. Despues, tenemos un
capitulo donde se nos intenta aconsejar que entremos en razn y no empecemos creando para
nuestro primer juego, una superproduccin de las que aparecen en las consolas de ltima
generacin y nos conformemos con algo ms pequeo que podamos terminar. De esta forma, tras
todo esto, el autor empieza a entrar en materia con algunos ejemplos sencillos en los que se tratan
tanto la parte de escribir cdigo como la grfica, pero eso si, no hace mucho uso de objetos 3D y
se dedica en prcticamente todo el libro a juegos sencillos. Poco importar objetos desde software
de modelado para mi gusto. Es por esto ltimo que he empezado a buscar ms material que me
ayude en esto, por que aunque no debe tener mucho misterio importar objetos, esta claro que
conseguir que se muevan por la pantalla para crear un juego 3D es otro cantar.
Primitivas (objetos 3D que vienen creados por defecto), luces y efectos son tratados a lo largo de
todas las pginas, as que para usuarios novatos, el aprendizaje de las bases del motor est
asegurado. Y como yo soy un poco novato
En fin, como tengo necesidad de ms informacin (mucha ms). Cuando la tenga la comentar, y
si hago avances en el manejo se iran viendo por aqu.
El caso es que he estado probando cosillas con ambos motores y, aunque aun me queda mucho
por aprender, me ha gustado la potencia del motor Unreal y la sencillez de Unity (que para mi
gana puntos por que tiene versin para hacer juegos de Wii y se ha usado en algn proyecto para
WiiWare).
Que no se me olvide destacar que hay una Web de Unity en espaol que adems acaba de
empezar a publicar una revista gratuita para ver o descargar en Pdf. La Web se llama UnitySpain y
la revista llamada UDev est en esa misma pgina.