Está en la página 1de 27

Cmo hacer un juego en 60 minutos

Taller Unity3D

I Jornadas sobre Videojuegos Mster de Videojuegos GUEIM Universidad Complutense de Madrid Diciembre 2010 Fernando Matarrubia taller.unity@gmail.com

Contenido
1. 2. 3. 4. Concepto .............................................................................................................................................. 3 Creacin de un proyecto nuevo ........................................................................................................... 4 Creacin de escenas ........................................................................................................................... 5 Escenario ............................................................................................................................................. 6 4.1. 4.2. 5. 6. Plataformas y objetivo ................................................................................................................. 6 Iluminacin .................................................................................................................................. 8

Jugador ................................................................................................................................................ 9 Elementos de juego: Prefabs ............................................................................................................. 11 6.1. 6.2. Objeto de juego: Proyectil ......................................................................................................... 11 Objeto de juego: Enemigo ......................................................................................................... 12

7. 8.

Etiquetado de objetos ........................................................................................................................ 13 Scripting ............................................................................................................................................. 14 8.1. 8.2. 8.3. 8.4. 8.5. 8.6. 8.7. Muerte por cada ....................................................................................................................... 14 Disparando ................................................................................................................................ 15 Spawn de enemigos .................................................................................................................. 16 Liberar memoria ........................................................................................................................ 17 Un toque mata ........................................................................................................................ 18 Llegando a la meta .................................................................................................................... 19 Bonus Track! ............................................................................................................................ 21 Mirando al horizonte .................................................................................................................. 22 El suelo que pisas ..................................................................................................................... 22 Enemigos con carisma .............................................................................................................. 24 Toque final................................................................................................................................. 24 Bonus track! ............................................................................................................................. 25 Msica Maestro! ........................................................................................................................... 25 Build Multiplataforma ..................................................................................................................... 26 Bibliografa, Referencias y Materiales ........................................................................................... 27

9.

Cielo, materiales y texturas ................................................................................................................ 22 9.1. 9.2. 9.3. 9.4. 9.5.

10. 11. 12.

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


2

1. Concepto
Qu juego vamos a hacer? Cules van a ser nuestros personajes? Y nuestro argumento? Y la jugabilidad? Y las mecnicas? Debido a la filosofa del taller; aprender lo mximo posible de Unity en un tiempo muy limitado, no nos podemos extender demasiado en esta parte esencial en la creacin de todo videojuego. Lo que vamos a hacer va a ser un FPS/Plataformas muy bsico, en el que nuestro objetivo ser llegar a una determinada parte del mapa sorteando diversas esferas que caen sobre nosotros. La esencia del concepto se define con el siguiente dibujo:

Ilustracin 1. Concepto de juego

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


3

2. Creacin de un proyecto nuevo


El primer paso es crear un nuevo proyecto de Unity: Ruta: File New Project

Ilustracin 2. Crear nuevo proyecto

En el cuadro de dilogo que aparece, elegimos las siguientes tres opciones:

Ilustracin 3. Importacin de recursos

Esto importar algunos recursos (assets) estndar proporcionados por el equipo de Unity, que nos sern muy tiles a la hora de ahorrarnos trabajo realizando nuestro juego. En los equipos del laboratorio, nicamente el directorio C:\hlocal tiene permisos de escritura. Por ello, aquellos que no tengan equipo propio estn obligados a crear su proyecto en dicha ruta. Es importante descomprimir dentro de la ruta C:\hlocal\[proyecto]\Assets el archivo Material.zip suministrado antes del taller. Se crearn las carpetas Sounds e Images. Una vez hecho esto, estamos listos para comenzar.

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


4

3. Creacin de escenas
Unity funciona mediante escenas. Una escena es un nivel de nuestro juego. Todos sus elementos son privados, y no se pueden usar fuera de ella. En un juego cualquiera hecho en Unity, podramos tener una escena para el men principal, otra para un tutorial, otra para cada nivel, y una ltima para el vdeo final de juego. Cuando se carga una escena, se llevan a memoria todos sus elementos. Al ser descargada, se desaloja de memoria todo aquello que la escena estaba utilizando. Existen mecanismos para hacer desalojos selectivos, de manera que las escenas puedan comunicarse entre ellas. En nuestro caso slo necesitaremos una escena. Para crearla, bastar con guardar la escena actual (vaca): Ruta: File Save Scene Nombre: game.unity

Ilustracin 4. Escena creada en nuestro proyecto

Ahora debemos aadir la escena a los Build Settings del proyecto para poder ser referenciada desde cdigo (es decir, para que el proyecto sepa que la escena existe): Ruta: File Build Settings Add Current (debido a que queremos aadir la escena actual)

Ilustracin 5. Escena aadida en Build Settings

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


5

4. Escenario
4.1. Plataformas y objetivo
Es hora de construir el ncleo de nuestro juego. Tal y como se puede ver en la ilustracin del concepto, el escenario contar con 4 bloques flotantes que harn de suelo y uno situado sobre el ms alejado del jugador, que ser el que se tendr que alcanzar para finalizar el juego. Cada uno de los bloques ser un GameObject con sus propios componentes Mesh Filter, Box Collider y Mesh Renderer, que se configurn por defecto. Numeraremos los bloques como se ve en la siguiente captura:

Ilustracin 6. Numeracin de bloques del escenario

Para crearlos, utilizaremos cubos re-escalados. Para aadir un cubo a la escena bastar con desplegar la opcin GameObject Create Other Cube de la barra de herramientas:

Ilustracin 7. Creacin de un cubo

Podis ir alternando las perspectivas haciendo click en las diferentes flechas del siguiente icono. Aparte, podis mover el punto de vista con Click Central y rotarlo con Alt + Click Izquierdo:

Ilustracin 8. Eje de coordenadas y perspectiva

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


6

A cada bloque lo llamaremos BloqueX, donde X ser el nmero que le corresponda. El bloque nmero 5 se llamar Objetivo. A continuacin se muestran la matriz de transformacin que tendr que tener cada bloque para conseguir el escenario de la Ilustracin 7. Nombre Matriz de Transformacin

Bloque1

Bloque2

Bloque3

Bloque4

Objetivo

Tabla 1. Matrices de transformacin

Para poder mover y rotar nuestro escenario como un solo bloque, bastar con crear un GameObject vaco mediante: GameObject CreateEmpty al cual llamaremos Escenario y arrastrar dentro de l todos nuestros objetos. Antes de hacerlo, tenemos que estar seguros de que nuestro objeto vaco se encuentra en la posicin (0, 0, 0) y no tiene aplicada ninguna rotacin, ya que sus hijos lo tomarn como origen de coordenadas. Para que un bloque sea hijo de nuestro objeto Escenario, dentro de la

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


7

jerarqua de nuestra escena (Hierarchy) hacemos click en un bloque cualquiera y sin soltar lo arrastramos encima del nombre de nuestro GameObject vaco. En la siguiente captura se puede ver el momento inmediatamente anterior de hacer a Bloque1 hijo de Escenario.

Ilustracin 9. Jerarqua del escenario

Ahora podremos mover el objeto Escenario, y veremos cmo se mueven todos los bloques. Si queremos duplicar nuestra estructura, bastar con pulsar Botn Derecho Duplicate. Se crear otro objeto Escenario, cuyos hijos sern los mismos que los del objeto original.

4.2.

Iluminacin

Para iluminar la escena crearemos una luz direccional. Este tipo de luces iluminan en una direccin dada de forma uniforme. De esta forma, no importa en qu posicin la pongamos. Ruta: GameObject Create Other Directional Light La renombramos como Foco

Ilustracin 10. Atributos de la luz direccional

Si el usuario quiere, podr incorporar el foco de luz al GameObject Escenario para tener ms organizada su escena.

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


8

5. Jugador
Llega el momento del movimiento! Una vez tenemos nuestro escenario creado nos hace falta un jugador a quin controlar. Este personaje jugable ser tambin un GameObject pre-configurado por el equipo de Unity. Sus componentes configuran la funcionalidad completa de un PJ en primera persona. Para aadirlo a nuestra escena bastar con que arrastremos a nuestra ventana de Editor desde nuestro Monitor de Recursos, aqul situado en la ruta: Standard Assets Character Controllers First Person Controller

Ilustracin 11. Ruta de nuestro recurso Jugador

All donde lo hayamos arrastrado aparecer una cpsula (nosotros mismos). Aparte, en la jerarqua de nuestra escena, se mostrar el GameObject con el nombre First Person Controller en azul, lo renombramos a Player.

Ilustracin 12. Nuestro hroe

Su matriz de transformacin deber ser la siguiente:

Ilustracin 13. Posicin inicial de nuestro hroe

Vemos que dentro tiene otros GameObjects:

Ilustracin 14. GameObjects de nuestro hroe

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


9

Cada uno de ellos con sus componentes: Player Graphics Main Camera

Tabla 2. Componentes de nuestro hroe

Por fin lleg el momento de pulsar el Play!

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


10

6. Elementos de juego: Prefabs


Como hemos dicho antes, cada escena tiene sus propios objetos. Estos objetos son privados a ella, y no pueden ser utilizados en otra escena. Pero entonces Qu pasa si yo me creo un enemigo y quiero usarlo en dos escenas diferentes? Tengo que hacerlo dos veces? Evidentemente no, para ello, Unity cuenta con los Prefab. Un prefab es un objeto prefabricado persistente en disco, y que se guarda en nuestra jerarqua de proyecto. Puede ser instanciado tantas veces como queramos. Sus instancias, a no ser que se rompa la conexin con el prefab, tendrn todos y cada uno de los componentes de su objeto padre, y cambiarn conforme lo haga ste. Podemos saber si un objeto es un prefab porque su nombre dentro de la jerarqua de escena est coloreado en Azul.

Ilustracin 15. Nuestro First Person Controller est enlazado con su prefab

Si realizamos algn cambio, sabremos que se est perdiendo la conexin con el objeto raz debido a que aparece el siguiente dilogo:

Ilustracin 16. Perdiendo conexin con Prefab

6.1.

Objeto de juego: Proyectil

A continuacin vamos a crear un prefab que ser la municin que podremos disparar posteriormente. Para ello, seguimos los siguientes pasos: Creamos un cubo: GameObject Create Other Cube

Ilustracin 17. Matriz de transformacin de nuestro prefab municin

Le aadimos un componente Rigidbody (comportamiento fsico realista). Con el cubo seleccionado: Component Physics Rigidbody

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


11

En nuestra jerarqua de proyecto: Botn Derecto Create Prefab Lo renombramos como Bullet (Opcional) En nuestra jerarqua de proyecto creamos una carpeta Prefabs: Botn derecho Create Folder. En ella guardaremos nuestro prefab, y los que hagamos posteriormente. Arrastramos el cubo desde nuestra jerarqua de escena, hasta el nuevo prefab que acabamos de crear. Su icono cambiara de ser un cubo gris (vaco), a ser un cubo azul
Ilustracin 18. Creacin de un prefab

En este punto podemos borrar el cubo de nuestra escena. (Si lo situis un poco por delante del jugador y dais al , veris como el cubo cae, siendo afectado por la gravedad).

6.2.

Objeto de juego: Enemigo

De igual forma que con el prefab anterior, ahora crearemos uno que ser nuestro enemigo mortal (^_^). Para ello seguimos los siguientes pasos: Creamos una esfera: GameObject Create Other Sphere

Ilustracin 19. Matriz de transformacin de nuestro prefab enemigo

Le aadimos un componente Rigidbody (comportamiento fsico realista). Con la esfera seleccionada: Component Physics Rigidbody En el componente Sphere Collider, configuramos el Material como Bouncy (bota!) (si no aparecen los materiales, es que no se han importado al crear el proyecto. Ver Apartado 2: Creacin de un Proyecto Nuevo)

Ilustracin 20. Bouncy Material para nuestro enemigo

En nuestra jerarqua de proyecto: Botn Derecto Create Prefab Lo renombramos como Enemy (Opcional) Si tenamos la carpeta Prefab, lo arrastramos dentro Arrastramos la esfera desde nuestra jerarqua de escena, hasta el nuevo prefab que acabamos de crear. De nuevo cambiar su icono. En este punto podemos borrar la esfera de nuestra escena. (Si la situis un poco por delante del jugador y dais al , veris como el cae y rebota en el suelo)

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


12

7. Etiquetado de objetos
Ahora que ya tenemos los objetos principales de nuestro juego creados, tenemos que organizarlos. Si queremos acceder a un GameObject desde cdigo, podemos buscarlo mediante su nombre, o mediante su etiqueta. Nosotros utilizaremos etiquetas, ya que es ms cmodo debido al nmero de enemigos que tendremos. Unity cuenta con un sistema de etiquetado que el usuario puede configurar a su antojo. A continuacin vamos a establecer y a asignar los nombres de las etiquetas que usaremos en nuestro humilde AAA. En primer lugar, accedemos al Tag Manager desde Edit Project Settings - Tags. Para ver las etiquetas de nuestro proyecto necesitamos desplegar el campo Tags. Tendremos que aadir las etiquetas de la siguiente ilustracin:

Ilustracin 21. Etiquetas de nuestro juego

Una vez estn aadidas, tenemos que asignarlas a nuestros objetos. Etiqueta bullet: Prefab Bullet Etiqueta enemy: Prefab Enemy Etiqueta player: GameObject de escena Player Etiqueta target: GameObject de escena Objetivo

Para asignarla, tendremos que tener el objeto seleccionado, y bastar con elegirla en la lista desplegable que se encuentra justo encima de la matriz de la transformacin del mismo:

Ilustracin 22. Tag player

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


13

8. Scripting
En este apartado vamos a insuflar vida a nuestro juego. Unity funciona con Mono, una implementacin OpenSource del Framework .NET. Por ello, podemos escribir nuestro cdigo en Javascript, C# o Boo. En el taller vamos a utilizar Javascript debido a que es algo ms inmediato que los otros dos.

8.1.

Muerte por cada

Lo primero que vamos a hacer ser que nuestro jugador muera al caer al vaco. Para ello tendremos que crear un script que implemente esa funcionalidad, y aadrselo como componente a nuestro objeto jugador. (Por organizacin) En nuestra jerarqua de proyecto: Botn derecho Create Folder La renombramos como Scripts En nuestra nueva carpeta: Botn derecho Create JavaScript Lo renombramos como Die Escribimos el siguiente cdigo:
function Update () { if (transform.position.y <=-30){ Dead(); } } function Dead(){ Application.LoadLevel("game"); }
Cdigo 1. Muerte del jugador

Arrastramos el script sobre el GameObject Player de nuestra escena:

Ilustracin 23. Componente de tipo Script: Die

El cdigo simplemente reinicia el nivel cuando la posicin vertical del jugador es igual o inferior a -30, es decir, cuando el jugador ha cado al vaco. El mtodo Update() se ejecuta una vez por frame, en l incluimos la funcionalidad. Con transform.position.y, nos referimos a la posicin en el eje vertical de nuestro objeto. Al ser el script un componente de nuestro jugador, la propia semntica de Unity permite referirse a sus otros componentes con palabras clave. En la funcin Dead(), la cual hemos creado nosotros mismos (no es reservada por Unity), simplemente cargamos el nivel llamado game. Para que sto pueda hacerse en tiempo de ejecucin es necesario haber aadido el nivel en las Build Settings del proyecto (ver Apartado 3: Creacin de escenas). El resultado es un reinicio inmediato del nivel, lo cual elimina cualquier progresin que pudiramos haber hecho.

Probad la cada!

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


14

8.2.

Disparando

Por fin algo interesante! Vamos a hacer que nuestro hroe dispare cubos extra-resistentes-antienemigos. Para ello, tendremos que aadir un script a nuestro jugador que implemente dicha funcionalidad. Dicho script ser un componente ms de nuestro GameObject Player: En nuestra carpeta Scripts: Botn derecho Create JavaScript Lo renombramos como Shoot Escribimos el siguiente cdigo:

public var bullet : Rigidbody; public var speed = 5; function Update () { if (Input.GetButtonDown("Fire1")){ var instantiatedProjectile : Rigidbody = Instantiate(bullet, transform.position, transform.rotation); instantiatedProjectile.velocity = transform.TransformDirection(Vector3(0,0,speed)); Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider); } }

Cdigo 2. Disparo

Arrastramos el script sobre el GameObject MainCamera dentro de nuestro Player.

Este cdigo instancia el objeto bullet en la posicin y rotacin del GameObject del cual forma parte, y le imprime una velocidad inicial con valor speed en la direccin Z (hacia delante) local. bullet y speed son variables pblicas, lo cual significa que son visibles desde la jerarqua de componentes del objeto, y por tanto se les puede dar un valor sin tocar cdigo:

Ilustracin 24. Variables pblicas del script Shoot

Con Input.GetButtonDown leemos de la entrada cundo se ha pulsado el botn mapeado con el nombre Fire1. Para ver el mapeo de teclas que utiliza Unity debemos ir a Edit Project Settings Input y desplegar el elemento Axes. En este caso, detectamos cundo el usuario pulsa el botn izquierdo del ratn o la tecla Ctrl. Cuando el jugador lo pulsa, se instancia con Instantiate el objeto pblico bullet que le hayamos pasado desde fuera, y se configura su atributo velocity con el valor speed, nicamente en el eje Z. Physics.IgnoreCollision ignora las posibles colisiones existentes entre el nuevo objeto instanciado y nosotros mismos, de manera que no pueda suceder por ejemplo que disparemos algo y se quede dentro de nosotros por colisionar con la pared interior de nuestro controlador de colisin. Queda un ltimo paso! Configurar las variables pblicas de nuestro script, para ello:

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


15

Arrastramos nuestro prefab bullet en el campo bullet del script Ponemos un valor 15 a speed (podis poner lo que queris e ir probando)

Ilustracin 25. Variables pblicas configuradas

A disparar!

8.3.

Spawn de enemigos

ste es quiz el punto ms importante de nuestro juego. Cundo, cmo y dnde generamos a nuestros enemigos? Dentro de nuestro escenario, crearemos un GameObject vaco al cual aadiremos un script. Dicho script tomar la posicin del GameObject y con algunos sencillos clculos instanciar los enemigos con una frecuencia establecida por el usuario, en posicin (tanto horizontal como vertical) variable, y con una velocidad inicial (slo vertical) que tambin ser diferente en cada uno de ellos. Para ello: Creamos un GameObject vaco: GameObject Create Empty Lo renombramos a SpawnEnemies

Ilustracin 26. Matriz de transformacin de SpawnEnemies

En nuestra carpeta Scripts: Botn derecho Create JavaScript Lo renombramos como Enemies Escribimos el siguiente cdigo:

public var enemy : Rigidbody; private var tick : float = 0; public var speed : float = 5; public var paso : float = 1; function Update () { tick+= Time.deltaTime; speed = Random.Range(0.0f, 5.0f); offsetZ = Random.Range(-4.0f, 4.0f); offsetY = Random.Range(-3.0f, 3.0f); if (tick>=paso){ tick = 0; var position : Vector3 = new Vector3(transform.position.x,

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


16

transform.position.y+offsetY, transform.position.z+offsetZ); var instantiatedProjectile : Rigidbody = Instantiate(enemy, position, transform.rotation); instantiatedProjectile.velocity = transform.TransformDirection(Vector3(0,-speed,0)); } }

Cdigo 3. Spawn de enemigos

Configuramos las variables pblicas como se ve en la siguiente captura:

Ilustracin 27. Variables pblicas del spawn de enemigos

Podemos ver que este cdigo es bastante similar al de la instanciacin de las balas disparadas por nuestro personaje (ver Apartado 8.2: Disparando). La principal diferencia es la posicin en la cual se crean nuestros enemigos. Para dar un comportamiento emergente a nuestro juego, hacemos que dicha posicin vare dentro de unos lmites respecto a la posicin de nuestro GameObject SpawnEnemies. En nuestro caso (-3, 3) para la posicin vertical, y (-4,4) para la posicin vertical. Aparte de esto, controlamos la frecuencia de instanciacin de los enemigos con la variable tick. Dicha variable, que inicialmente es cero, va almacenando el sumatorio del tiempo de ejecucin del frame N-1 (Time.deltaTime). De esta forma, podemos llevar la cuenta del tiempo transcurrido en un determinado momento del juego, independientemente de la mquina que tengamos (ms o menos potente). Controlando el lmite superior al que puede llegar tick mediante la variable pblica paso, el usuario puede configurar desde fuera cuntos segundos tienen que transcurrir entre la aparicin de los diferentes enemigos. En la Ilustracin 26 se muestra un valor ajustado de la variable paso.

Avalancha!

8.4.

Liberar memoria

Es importante no cargar la escena de demasiadas instancias de un objeto. Para ello, podemos configurar stos para se destruyan automticamente despus de X segundos. Para ello, tendremos que crear un nuevo script y aadirlo como componente al prefab de nuestros objetos (bullet y enemy): En nuestra carpeta Scripts: Botn derecho Create JavaScript Lo renombramos como SelfDestroy Escribimos el siguiente cdigo:

public var waitTime : float = 10; function Start () { Destroy(gameObject, waitTime); }


Cdigo 4. Autodestruccin

Arrastramos el script sobre los prefabs bullet y enemy.

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


17

Para waitTime configuramos los siguientes valores:

bullet enemy
Tabla 3. Valores en segundos para la autodestruccin de objetos

Este script es sencillo. Simplemente se llama a Destroy sobre nosotros mismos, con un retardo de waitSeconds segundos. Una vez transcurrido ese tiempo, el objeto se destruye. Es importante observar que esta vez no incluimos nuestra funcionalidad en el mtodo Update, sino que lo hacemos en el mtodo Start() perteneciente al API de Unity, y cuyo contenido se ejecuta al ser instanciado el GameObject que tiene el componente script aadido.

8.5.

Un toque mata

En esta seccin vamos a complicar la lgica del juego. Lo que queremos conseguir es que el jugador muera cada vez que sea golpeado por un enemigo. Aparte, para facilitarte un poco la tarea, tambin realizaremos un pequeo script que destruya una esfera al entrar en contacto con uno de nuestros mortferos proyectiles. Primero, aadimos la amenaza enemiga: En nuestra carpeta Scripts: Botn derecho Create JavaScript Lo renombramos como Kill Escribimos el siguiente cdigo:

function OnCollisionEnter(collision: Collision) { if (collision.gameObject.tag=="player"){ collision.transform.SendMessage("Dead"); } }


Cdigo 5. Autodestruccin

Arrastramos el script sobre el prefab enemy.

La funcin OnCollisionEnter es ejecutada por el GameObject correspondiente siempre que su controlador de colisin entra en contacto con otro. Como parmetro enva el controlador de colisin contra el que se ha chocado. En este caso seleccionamos aquella colisin que sea con el jugador, es decir, contra un gameObject cuyo tag sea player (ver Apartado 7: Etiquetado de Objetos), y enviamos un mensaje al mismo, con el nombre de la funcin a ejecutar (ver Apartado 8.1: Muerte por cada). De esta forma, cada vez que una esfera-asesina entre en contacto con nuestro hroe, ste llamar a su funcin Dead() y se reiniciar el nivel. Ahora es momento de hacer que nuestros cubos sirvan para algo: En nuestra carpeta Scripts: Botn derecho Create JavaScript Lo renombramos como Attack

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


18

Escribimos el siguiente cdigo:

public var destroyOnCollision : boolean = true; function OnCollisionEnter(collision : Collision) { if (destroyOnCollision) Destroy (gameObject); if (collision.gameObject.tag == "enemy"){ Destroy(collision.gameObject); } }
Cdigo 6. Autodestruccin

Arrastramos el script sobre el prefab bullet.

Este cdigo funciona de manera similar al anterior. Para todas las colisiones de nuestros bullet, se busca aquellas que ocurran contra gameObjects cuyo tag sea enemy (ver Apartado 7: Etiquetado de Objetos), en cuyo caso el objeto destino es destruido. Con una variable pblica destroyOnCollision podemos establecer si queremos que nuestro bullet se destruya al entrar en contacto con algn objeto (no slo enemigos) o no.

8.6.

Llegando a la meta

Ya era hora de ponerle fin al juego! En este apartado controlaremos cundo el jugador toca el GameObject Objetivo, y finalizaremos nuestro breve periplo. Para ello en primer lugar crearemos una imagen que ser mostrada sobre la pantalla cuando ocurra la colisin entre nuestro jugador y el Objetivo: Debemos crear una GUITexture: GameObject Create Other GUITexture Lo renombramos como Finish

Ilustracin 28. Configuracin de nuestro GUITexture

Los atributos arriba descritos son aplicables a la imagen finish.png (suministrada junto a este tutorial). Es importante que el componente GUITexture est desactivado de inicio (marcado en verde) para que no sea visible e interfiera con la jugabilidad.

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


19

Ahora tendremos que crear el script con el cual mostraremos la imagen una vez hayamos llegado al final del nivel. Tambin permitiremos reiniciarlo pulsado una determinada tecla: En nuestra carpeta Scripts: Botn derecho Create JavaScript Lo renombramos como Finish Escribimos el siguiente cdigo:

private var finished : boolean = false; public var finishedText : GUITexture; function Start(){ finishedText.enabled = false; Time.timeScale = 1.0; } function Update () { if (Input.GetKeyDown(KeyCode.Escape) && finished){ Application.LoadLevel("game"); } } function OnControllerColliderHit(hit: ControllerColliderHit){ if (hit.collider.gameObject.tag=="target"){ finished = true; finishedText.enabled = true; Time.timeScale = 0.0; } }
Cdigo 7. Final de nivel

Arrastramos el script sobre el GameObject Player Arrastramos nuestro GUITexture Finish, al campo Finished Text del componente script

En primer lugar, tenemos una variable pblica correspondiente al componente GUITexture de nuestro objeto Finish. Gracias a dicha variable, podremos hacer visible la imagen cuando nuestro CharacterController colisione con el GameObject Objetivo. Para ello, usamos la funcin OnControllerColliderHit y gestionamos el caso en el que la colisin sucede contra un objeto cuyo tag es target. En ese caso ponemos a true un flag finished, activamos nuestra imagen, y paramos el tiempo. Dentro del mtodo Update, controlamos que cuando el flag finished est activado y el jugador pulsa la tecla escape, el nivel se reinicie. El mtodo Start() desactiva la visibilidad de la imagen y reconfigura el tiempo a su velocidad normal. Esto se realiza por seguridad, para que en ningn caso se muestre la imagen cuando comience el juego ni el tiempo est parado.

Ya me lo he pasao

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


20

8.7.

Bonus Track!

A continuacin se muestra el cdigo de un script que permite al jugador parar el tiempo pulsando la tecla P. Hay que tener en cuenta que si se para el tiempo, tambin el jugador deja de moverse . Tambin se muestra una re-implementacin de la funcin Shoot, que emula el funcionamiento de una metralleta, cuya cadencia se puede controlar mediante una variable pblica y que ofrece la posibilidad de disparar proyectiles con una velocidad inicial aleatoria. Por ltimo, con una simple lnea de cdigo, podemos hacer un GameObject rote sobre un eje vertical function Update () { if (Input.GetKeyDown (KeyCode.P)) { Time.timeScale = 1.0-Time.timeScale; Time.fixedDeltaTime = 0.02 * Time.timeScale; } }
Cdigo 8. Parar el tiempo

public var bullet : Rigidbody; public var speed : float = 5.0f; public var paso : float = 1.0f; public var randomSpeed : boolean = false; private var tick : float = 0.0f; function Update () { tick+=Time.deltaTime; if (randomSpeed) speed = Random.Range(0.0f, 20.0f); if (tick>=paso){ tick = 0; if (Input.GetButton("Fire1")){ var instantiatedProjectile : Rigidbody = Instantiate(bullet, transform.position, transform.rotation); instantiatedProjectile.velocity = transform.TransformDirection(Vector3(0,0,speed)); Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider); } } }

Cdigo 9. RepeatedShoot

public var rotAmount : float = 30; function Update () { transform.Rotate(new Vector3(0, rotAmount,0)); }
Cdigo 10. Rotacin continua

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


21

9. Cielo, materiales y texturas


En esta seccin vamos a darle un poco de color a nuestro juego. En primer lugar configuraremos un cielo para la escena, de manera que nuestro espacio sea un poco ms artstico. Posteriormente, crearemos materiales de diferentes tipos para las plataformas del escenario, los enemigos, y el objetivo.

9.1.

Mirando al horizonte

Para configurar nuestro cielo bastar con hacerlo en la configuracin de Renderizado del proyecto: Ruta: Edit Render Settings Skybox Material Elegimos uno de entre la lista de disponbles

Ilustracin 29. Eleccin del skybox

9.2.

El suelo que pisas

A continuacin crearemos un material con relieve (Bump) para el suelo: En nuestra jerarqua de proyecto: Botn derecho - Create Folder Lo renombramos como Materials Sobre nuestra nueva carpeta: Botn derecho Create Material Lo renombramos como GreyStone Lo configuramos como BumpedDiffuse (marcado en verde en la imagen) Le configuramos el color que queramos (preferiblemente gris) haciendo click en el cuadro blanco de Main Color

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


22

Ilustracin 30. Material de piedra para nuestro suelo

Para poder configurar el Normalmap tal y como se ve en la Ilustracin 29, debemos generarlo antes en nuestra jerarqua de proyecto: Dentro de nuestra carpeta Images (ver Apartado 2: Creacin de un proyecto nuevo) hacemos click sobre la imagen stone-bumpmap.jpg En el Texture Importer, configuramos la imagen como Normal Map y hacemos click en Apply

Ilustracin 31. Texture Importer: Normal Map

Arrastramos nuestra imagen al canal Normalmap de nuestro material GreyStone (ver Ilustracin 29)

Una vez hecho esto, bastar con arrastrar nuestro material directamente a los objetos de nuestra escena que queramos que lo usen. Es indiferente hacerlo en la jerarqua de la escena, o en la representacin grfica de los mismos. Ahora deberamos tener ms o menos el siguiente resultado:

Ilustracin 32. Suelo de piedra

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


23

9.3.

Enemigos con carisma

De igual forma que con el suelo, crearemos una textura para los enemigos. En este caso ser algo ms simple: Sobre nuestra carpeta Materials: Botn derecho Create Material Lo renombramos como WaterMelon Lo configuramos como Diffuse (por defecto) Arrastramos desde nuestra carpeta Images la imagen: watermelon.jpg al canal Base de nuestro material Configuramos los valores de Tiling y Offset tal y como se ve en la imagen.

Ilustracin 33. Material para nuestros enemigos

Arrastramos el material a nuestro prefab Enemy

Socorro, Sandas!

9.4.

Toque final

En este ltimo material simplemente veremos cmo modificar la transparencia de un objeto: Sobre nuestra carpeta Materials: Botn derecho Create Material Lo renombramos como Transparent Lo configuramos como Transparent/Diffuse En el cuadro de color, elegimos el que queramos, y modificamos la transparencia (canal A) a nuestro gusto

Ilustracin 34. Color y transparencia

Arrastramos el material a nuestro GameObject de escena Objetivo

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


24

9.5.

Bonus track!

Entre el material extra que se ha suministrado hay una imagen llamada orange-bumpmap.png, la cual se puede utilizar para crear un Material de tipo BumpedDiffuse, con MainColor naranja, y posteriormente aplicrselo al prefab enemy, consiguiendo as la textura de una naranja. Se deja a eleccin del usuario el implementar esta asombrosa funcionalidad. . Tambin est disponible una textura llamada dominoPiece.png, por si alguien quiere modificar las dimensiones de su prefab bullet y aplicarle esta textura, de manera que dispare fichas de domin-asesinas. (Quizs podra combinarse con el Script de rotacin del Bonus Track de Scripting).

10.

Msica Maestro!

En este ltimo punto vamos a aadir una meloda de fondo que vaya incrementando su volumen segn nos acerquemos a la fuente del sonido. Para ello: Tenemos que tener una carpeta Sounds con el track: BSO_GrimFandango.mp3 dentro (ver Apartado 2: Creacin de un proyecto nuevo) Arrastramos el track a nuestro GameObject Objetivo. Se crear un componente AudioSource.

Ilustracin 35. Componente AudioSource

Creamos un script llamado Sound en nuestra carpeta Scripts

function Start() { audio.Play(); }


Cdigo 11. Activando msica

Arrastramos el script a nuestro GameObject Objetivo

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


25

11.

Build Multiplataforma

Hacer el Build es el ltimo paso de nuestro juego. Con ello, construimos un ejecutable que puede correr en cualquier mquina para la que haya sido realizado. El proceso es bastante simple: Ruta: File Build Settings Seleccionamos la plataforma para la cual queremos hacer el build Elegimos el Target (slo disponibles en algunas plataformas) Pulsamos el botn Build Elegimos la ruta donde se guardar nuestro ejecutable. Preferiblemente que sea una carpeta, ya que al mismo nivel del ejecutable se crean ms archivos con los recursos del proyecto, dependencias, etc

Ilustracin 36. Pantalla de Build

En el caso Con la versin gratuita de Unity slo podremos realizar Builds para Navegador Web, Windows y MAC. Para el caso de un Build para navegador, se crea un archivo con extensin *.unity3d, y un *.html que lleva embebido con el cdigo HTML necesario para la visualizacin web de nuestro juego. Bastar con abrir el HTML en una mquina que tenga instalo el plugin de visualizacin correspondiente (Unity Web Browser Plugin) y

A jugar!

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


26

12.

Bibliografa, Referencias y Materiales

1. Will Goldstone. Unity Game Development Essentials. https://www.packtpub.com/unity-game-development-essentials/book 2. Graham McAllister. GUI Essentials (Introduction Tutorial 1) http://download.unity3d.com/support/Tutorials/1%20-%20GUI%20Essentials.pdf 3. Graham McAllister. Introduction To Scripting With Unity (Introduction Tutorial 2). http://download.unity3d.com/support/Tutorials/2%20-%20Scripting%20Tutorial.pdf 4. Graham McAllister . Unity First Person Shooter Tutorial http://unity3d.com/support/resources/tutorials/fpstutorial.html 5. Unity Basics http://unity3d.com/support/documentation/Manual/Unity%20Basics.html 6. Official Scripting Documentation http://unity3d.com/support/documentation/ScriptReference/index.html 7. Official Tutorials http://unity3d.com/support/resources/tutorials/ 8. Official Community http://unity3d.com/support/community 9. UnitySpain http://www.unityspain.com/

Cmo hacer un juego en 60 minutos - I Jornadas sobre Videojuegos MDV/GUEIM - UCM


27

También podría gustarte