You are on page 1of 94

Tutorial

de introduccion a Unity
Integracin de un proyecto de
videojuego












Traduccion 3D Platformer Tutorial Building a 3D


Platform Game in Unity Tomado de www.unity3d.com
Realizada por www.c2estudio.com

Introduccin

Unity es una poderosa herramienta para desarrollo


de juegos. Sirve para diferentes generos de juegos,
desde First Person Shooters (Juegos de primera
persona) hasta juegos de rompecabezas.









Con sus mltiples caractersticas, incluyendo mapas de alturas de terrenos, apoyo a la creacin
de redes nativas, integracin de fsica completa y secuencias de comandos, Unity puede ser
intimidante para los recin llegados, pero el dominio de sus herramientas es bastante sencillo y
gratificante.

Este tutorial le guiar por el proceso de construccin de un nivel completo un juego de
plataformas en 3D con vista en perspectiva de tercera persona. Esto incluye todo como los
controles del jugador, la deteccin de colisiones, algunas secuencias de comandos avanzados,
proyeccin de sombra, IA (Inteligencia Artificial) basica, aadir un HUD, cortos de escenas y
como aadir el audio.


Lo que aprender
Este tutorial se centra en el aspecto tcnico de la construccin de un juego en Unity, que abarca lo
siguiente:
Controladores de personajes
Proyectores
Fuentes de audio y clips de audio
Mltiples cmaras (y cmo cambiar entre ellas)
Sistema UnityGUI de scripting
Controles de colisin
Mensajes y eventos
Iluminacin
Sistemas de partculas
Sombras usando un proyector
Scripting (IA, mquinas de estado, controles de reproduccin)
Este tutorial se muestra cmo estas caractersticas se pueden utilizar juntas para crear un juego.

Lo que usted debe saber ya
En este tutorial hace un amplio uso de scripting por lo que debe estar familiarizado con al menos
uno de los lenguajes de scripting soportados: JavaScript, C # o Boo. (JavaScript se utiliza para las
secuencias de comandos en este tutorial.)

Tambin se supone que est familiarizado con la interfaz de Unity y sabe cmo realizar las
operaciones bsicas, tales como la localizacin de un objeto en una escena, aadir componentes a
un GameObject, y edicin de propiedades en el Inspector.


Organizacin del Proyecto
Unity no intenta forzar una determinada manera de organizar los assets de su proyecto.

Usted puede preferir la organizacin de sus assets por tipo de assets, con carpetas separadas, por
ejemplo, "Texturas", "Modelos", "Los efectos de sonido" y as sucesivamente.

GameObjects y Componentes Abstractos
Unity, por diseo, coloca los assets de cada escena en el centro del proceso de desarrollo. Esto
hace un enfoque muy visual para el desarrollo del juego, con la mayora de los trabajos que
impliquen arrastrar y soltar. Esto es ideal para la mayor parte del trabajo a nivel de diseo, pero
no todos los assets pueden ser mostrados de esta manera. Algunos assets son abstractos en lugar
de ser objetos visuales, as que estn representados por iconos abstractos y gizmos -- Ej. audio y
luces -- o no son mostrados en la ventana Scene. Los Scripts estan en esta ltima categora.

Los Scripts definen cmo los assets y GameObjects en una escena de Unity interactan unos con
otros y esta interaccin es la base de todos los juegos. Por esta razn, es generalmente un buen
plan mantener comentarios dentro de los scripts.
Este tutorial asume que usted puede leer los scripts proporcionados y comprender los
comentarios dentro de ellos. Sin embargo, cuando un script en particular, tcnica o concepto es
importante, vamos a cubrirlo en detalle.

Archivos

La carpeta "Scene" contiene el resultado final: un men principal de escenas, una escena de Game
Over y una escena que contiene el nivel de juego completo.
Este tutorial asume que usted ya sabe los controles bsicos de Unity, tales como objetos de
posicionamiento, en una escena, as que la primera escena con la que comenzamos ya tiene el
escenario de base y algunos objetos en su lugar.


Convenciones tipogrficas

Este es un largo tutorial que contiene una gran cantidad de informacin. Para hacerlo ms fcil de
seguir, algunas convenciones simples son usadas:
Texto en cuadros como stos contiene informacin adicional que puede ayudar a aclarar el texto
principal.


ntes
y Tangentes
Codigo de Scripting aparecer como se muestra a continuacin:
// This is some script code.
function Update()
{
DoSomething();
}


NOTA Los scripts incluidos en el tutorial incluye un montn de comentarios y estn diseados para
ser fcil de seguir. Estos comentarios son generalmente omitidos en fragmentos del cdigo en este
tutorial para ahorrar espacio.
Acciones que necesita llevar a cabo dentro de Unity se muestran as:
Haga clic aqui;
Entonces esto;
Luego haga clic en Reproducir.

Los nombres de scripts, los assets, los elementos de men o el inspector de propiedades se
muestran en texto en negrita.


Convenios de Unity
Unity es un sistema de desarrollo nico. La mayora de los desarrolladores estan acostumbrados
a trabajar en un editor de cdigo, usando el 90% de su tiempo editando cdigo, e incluso escribir
cdigo para cargar y utilizar los assets. Unity es diferente: es enfocado en los assets en vez de
enfocado en el codigo, el foco en los assets es similar al de una aplicacin de modelado 3D. Por
esta la razn, vale la pena entender las principales convenciones y la terminologa nica para el
Desarrollo de Unity:

Proyectos
Un juego construido en Unity se compondr de un proyecto. Contiene todos los elementos de su
proyecto, tales como los modelos, guiones, planos, mens, etc Normalmente, un archivo nico
proyecto contendr todos los los elementos de su juego. Cuando se inicia Unity, lo primero que
hace es abrir un Archivo de proyecto.

Escenas
Cada proyecto contiene uno o ms documentos llamados Escenas. Una sola escena contendr
un nivel de juego, pero elementos principales como una interfaz de usuarioo los mens de juego,
secuencia de GameOver o escenas importantes Tambin pueden vivir en sus propios archivos de
escena. Juegos complejos incluso puede usar escenas enteras slo para fines de inicializacin. As,
todos los niveles en un juego muy probablemente sern escenas, pero no todas las escenas
necesariamente ser un nivel de juego.

GameObjects, componentes, Assets y Prefabricados


La clave para entender Unity es la relacin entre un GameObject y un componente.

GameObjects
Un GameObject es el bloque de construccin fundamental en Unity. Un GameObject es un
contenedor de diferentes piezas de la funcionalidad de llamadas componentes. Un GameObject
casi siempre contiene ms de un componente. Todo GameObjects contienen un componente
transform, que define su posicin y orientacin.

Jerarquas GameObject
El poder real de los GameObject es su capacidad para contener otros GameObjects, muy similar a
una carpeta en OS X Finder. Esto permite la organizacin jerrquica de GameObjects,
por lo que un complejo modelo o una plataforma completa de iluminacin se puede definir en un
solo GameObject padre. (De hecho, la mayora de los modelos aparecern en Unity como una
jerarqua de GameObjects porque esto refleja la forma en que se definen en el paquete de
modelado.) Un GameObject definido dentro de otro GameObject se considera un GameObject hijo.
Componentes
Los componentes son los bloques de construccin de GameObjects. Sin ellos, el GameObject
no har nada interesante.

Un componente puede representar a las entidades visibles, como las mallas, los materiales, los
datos de terreno o un sistema de partculas. Otros tipos de componentes son ms abstractos,
tales como cmaras y Luces, que no tienen un modelo fsico que los representa, en cambio, usted
ver una icono y unas directrices de alambre que ilustran sus valores fundamentales.
Un componente esta siempre unido a un GameObject, no puede vivir solo. Multiples componentes
pueden conectarse a un mismo GameObject. GameObjects puede soportar mltiples
Componentes de ciertos tipos -- un GameObject puede contener cualquier nmero de scripts, por
ejemplo. Pero otros, como los utilizados para definir sistemas de partculas, son exclusivos y
slo puede aparecer una vez en cualquier GameObject nico. Por ejemplo, si desea definir
mltiples sistemas de partculas, normalmente se utiliza una jerarqua de GameObjects, cada uno
que contiene su propio conjunto de componentes de sistema de partculas.

Assets
Todos sus assets importados aparecen en el panel de proyectos y pueden ser casi cualquier cosa:
un material simple o la textura, archivos de audio, o incluso un GameObject prefabricado
(conocido como "prefab").
Por ejemplo, un personaje de jugador de Prefab se podra definir como un solo Asset, que
contiene el modelo y sus animaciones asociadas. Tambin podra contener scripts de
componentes, clips de audio y cualquier otro componente que necesita para funcionar, por lo que
podra simplemente arrstrarlo en una escena e inmediatamente tener un avatar en pleno
funcionamiento.

Los iconos personalizados & Gizmos


Puede decirle a Unity que muestre los iconos personalizados y otra informacin visual para sus
assets si lo desea. Vamos a ver un ejemplo de esto en el siguiente captulo.


Los assets de su proyecto se muestran en el panel Proyecto (Project). Al colocar un asset en la
Escena, aparece en el panel jerarqua (Hierarchy), que define el contenido de la escena. (Una
escena es el equivalente del escenario en un teatro. Puede ser un nivel, un men, un saln de
juego multijugador) el panel Project se mantiene en todas las escenas en su proyecto.

Prefabricados
Un prefab es un asset que ha sido definido como una plantilla. Es para Unity lo que una plantilla
de documento es para una aplicacin de procesamiento de textos. Cuando se coloca un prefab en
la escena, Unity coloca un enlace al Prefab en el panel de jerarqua, no una copia completa. Esto
se llama instanciacin. Cada enlace que se haga se conoce como una instancia del Prefab.

Si hace clic en un prefab en el panel de proyectos y ajusta su configuracin, usted encontrar que
esos cambios se reflejan automticamente en todas las instancias en la escena. Esto hace que
los prefabs sean ideales para muchos elementos reutilizables, tales como las balas, enemigos, etc.
Si usted encuentra un enemigo que no se est comportando correctamente, slo tendr que
ajustar el script o configuracin del Prefab original en lugar de editar cada uno de ellos en la
escena de forma individual.

Sin embargo, si hay que ajustar un par de campos en un caso concreto de un prefab.
Usted puede hacer esto tambin: estos cambios slo afectan a esa instancia particular.

Prefabricados son mostrados en texto azul, tanto en el proyecto como en el panel de jerarqua.

NOTA Un ejemplo de Prefab no puede tener componentes adicionales ya que de hacerlo, se
romper el vnculo con el Prefab original. Unity le avisar si intenta hacer esto. Unity, sin embargo,
le permite actualizar el Prefab original con dichos cambios despus de que el enlace fue roto.


Agradecimientos
Este tutorial es una version en espaol del Tutorial realizado por Unity 3D y no podra haber sido
producido sin las siguientes personas:
David Helgason, Joachim Ante, Tom Higgins, Sam Kalman, Keli Hlodversson, Nicholas
Francis, Aras Pranckeviius, Bosque Johnson y, por supuesto, Ethan Vosburgh que produjo
los assets para este tutorial.
Traducido por C2 Estudio S.A.

Primeros pasos

Cada juego de plataforma tiene un personaje


que el jugador controla.
Nuestra estrella es Lerpz.

Animacin de Lerpz
En este captulo vamos a ver:
Implementacin del jugador de tercera persona y controles de camara
Control y mezcla de animaciones
Uso de sistemas de partculas para aplicar a los propulsores del jetpack
Agregar una blobshadow para el jugador
Mantener el estado del jugador
Manejo de salud de los jugadores, la muerte y el renacimiento.

Antes de comenzar, tenemos que saber lo que este juego se trata. En resumen,
Necesitamos ...


La historia

Nuestro hroe es Lerpz: un extranjero visitando Robot World Version 2. Este sustituye Robot
World Versin 1, que sufri un fallo de segmentacin y de repente se estrell en su sol hace
muchos aos.
Lamentablemente, Lerpz ha tenido mala suerte: su nave espacial ha sido incautada por la
corrupta polica local. Despus por todos lados, Lerpz ha encontrado su nave espacial, pero
Cmo puede recuperarla?
Lerpz sabe que si recoge todas las latas de combustible, la energa utilizada sobrecargar el
sistema de seguridad. Esto apagar la reja del depsito municipal y la nave espacial de Lerpz
quedara libre. Lerpz puede entrar en su nave espacial, agregar el combustible
y volar hacia la libertad.
Los guardias robot intentarn detener a Lerpz, pero por suerte, no son particularmente
brillantes.


Presentacin de Lerpz
Abra el proyecto y vea Scenes->TheGame
Nuestro primer paso es aadir Lerpz a nuestra escena:
Abra la carpeta de objetos en el panel de proyectos;
Arrastre el Prefab Lerpz en la ventana de escena o de jerarqua;
Haga clic en el objeto Lerpz en la Jerarqua y cambiele el nombre a Player;
Mantenga el objeto Jugador seleccionado, mueva el ratn sobre la vista de escena y presione
la tecla F (foco) para que la vista se centre en el modelo de Lerpz.

Mueva a Lerpz hacia la plataforma elevada con el salto (el nicho con los triangulos
amarillos), cerca de la crcel. (Ver la captura de pantalla siguiente.)

Si usted hace clic en Reproducir (Play), debera ver a Lerpz de pie en el patio fuera de la crcel.
En esta etapa, Lerpz no se puede mover y la cmara tambin debe estar vinculada a personaje.
Haga clic en el botn Reproducir de nuevo para detener el juego.

Tenemos que hacer que Lerpz se mueva. Pero en primer lugar, tenemos que retroceder un
momento y dar una vistazo a nuestra cmara.

Posicionamiento de Lerpz en la escena.

Cmaras de Tercera Persona .


En un juego de primera persona, la cmara es el punto de vista del jugador, por lo que no hay
necesidad de que preocuparse de hacer que siga otro objeto alrededor de la escena. El jugador
controla la cmara directamente. Las camaras de primera persona por lo tanto son relativamente
fcil de implementar.
Sin embargo, un punto de vista de la cmara de tercera persona requiere una cmara que pueda
seguir el jugador por todas partes. Esto parece bastante sencillo hasta que te das cuenta de la
cmara tambin tiene que saber cmo evitar objetos que se encuentren entre el personaje del
jugador y el punto de vista de la cmara.
Esto puede conseguirse utilizando raycasting para comprobar si hay objetos no deseados entre la
cmara y el avatar del jugador, pero hay algunos casos especiales a considerar. Por ejemplo:
Qu sucede si Lerpz se apoya contra una pared slida? Deberia la cmara moverse hacia
arriba y mirar hacia abajo en el reproductor? Debe trasladarse a un lado?
Qu pasa si un enemigo se interpone entre la cmara y nuestro avatar del jugador?
Cmo deben funcionar los controles del jugador ? Deberan ser relativos al punto de vista de la
camara? Si es as, esto podra ser muy confuso si la cmara se mueve inesperadamente para evitar
un obstculo.
Una serie de soluciones para las cmaras en tercera persna se han probado en los ltimos aos.
Puede afirmarse que ninguno ha sido 100% perfecto. Algunas soluciones desvanecen todo lo que
esta entre ellos y su enfoque, haciendo paredes o enemigos semitransparentes.
Otras opciones incluyen cmaras que siguen el jugador alrededor, pero que, en caso necesario,
Pueden moverse a travs de paredes y edificios para mantener la vista del jugador consistente.

El proyecto que viene con este tutorial incluye algunas secuencias de comandos de cmara
diferente, pero para los efectos de este tutorial, vamos a utilizar SpringFollowCamera. Usted lo
encontrar en el Panel de Proyecto dentro de la subcarpeta de Cmara de la carpeta Scripts.
Arrastre el script SpringFollowCamera desde el panel de proyectos al objeto NearCamera
en el panel de la Jerarqua.
Haga clic en Reproducir.
Usted recibir un mensaje de error. Esto aparece en la parte inferior de la ventana de Unity.
Abrir la consola de depuracin (Maysculas + Comando + C / Shift + Ctrl + C en PC), si no
est ya visible.
Esto muestra las advertencias, errores y dems informacin de depuracin de su juego.
Probablemente ver una gran cantidad de copias del mensaje de error repetido en el registro.
Resalte una y el panel mostrar mas informacin acerca de este mensaje de error, como se
muestra en la imagen.


Mensaje de error No Target.


SUGERENCIA Siempre que sea posible, la ventana de registro de depuracin mostrar una lnea que
une al GameObject del problema en la jerarqua, (o el panel de proyectos si el fallo est en un
Prefabricado o script). Usted puede ver esta lnea en la pantalla de arriba.
El tipo de error es uno UnassignedReferenceException es probable que lo veas muy
frecuentemente si eres nuevo en Unity. Suena espantoso, pero lo nico que significa es que una
variable de un script no se ha establecido. El registro de depuracin explica esto tambin, as que
vamos a hacer lo que le sugiere:

Haga clic en el objeto NearCamera en el panel de la Jerarqua y mirar las propiedades del
componente Sping Follow Camera (Script).
La propiedad de destino esta definida como None (Transform). Esto define adonde queremos
que apunte la camara, as que vamos a establecer el siguiente:
Parar el juego si no lo ha hecho ya.

Si no est seleccionada, haga clic en el objeto NearCamera en el panel de la Jerarqua.


Arrastre el GameObject Player desde el panel de jerarqua al Campo Target.

Cambios en caliente
Cuando usted est jugando el juego, Unity le permitir ajustar las propiedades de los distintos
objetos del juego y de los componentes en el juego. Sin embargo, no se salvarn! En el momento de
detener el juego, los cambios sern descartados!
Si desea que los cambios se mantengan, siempre se detiene primero el juego!

Si usted hace clic en Reproducir ahora, la cmara no funcionar. Usted ver un error relativo al
Script SpringFollowCamera. El objetivo necesita tener un script ThirdPersonController unido
a l. Esto es porque una cmara de tercera persona est estrechamente vinculada a los controles
del jugador: necesita saber lo que el jugador est haciendo para que pueda reaccionar en
consecuencia.
La configuracin final debera ser como se muestra en la siguiente imagen:

Propiedades del script SpringFollowCamera.

Experimente con los nmeros si no le gusta la forma en que funciona la cmara, esto es algo
subjetivo a juicio personal y no hay ninguna configuracin correcta para algo como esto.
Esta es la primera de una serie de dependencias con las que tenemos que lidiar.

Completar la conexin entre la cmara y el reproductor arrastrando el script
ThirdPersonController desde el folder Scripts->Player en el panel de proyectos
a nuestro GameObject Player (en el panel de jerarqua). (Esto romper la conexcion de Prefab)

El script ThirdPersonController tambin tiene sus propios requisitos y dependencias.
El ms importante de ellos es el componente Character Controller. Afortunadamente, el script
le informa acerca de esto a Unity y este componente es agregado de forma automatica.

Conexiones y dependencias.
Unity Sobresale en la exhibicin de assets visuales, pero estos tambin tienen que estar
conectados entre s para asegurar la interactividad que esperamos de un juego. Estas conexiones
son difciles de
mostrar visualmente.
Estas conexiones son conocidas como las dependencias, y es lo que se obtiene cuando un objeto
requiere de un segundo objeto para funcionar. El segundo objeto, a su vez, puede requerir an
ms
objetos de trabajo. El resultado es que sus assets estn vinculados unos a otros con
innumerables trozos de cadena virtual scripts uniendolos todos juntos para hacer un juego.
Definir correctamente todas estas dependencias es un elemento clave del diseo del juego.



Ahora tenemos que agregar una etiqueta a nuestra GameObject Jugador. Esto es para que los
scripts puedan encontrar el Jugador en la escena, simplemente diciendole a Unity que encuentre
el GameObject con dicha etiqueta.
Con nuestro objeto Jugador mostrado en el inspector, abra el men desplegable Tags y elija
el "Player", como se muestra a continuacin.

Seleccin de la etiqueta Player.


NOTA Las Etiquetas que figuran en el men mostrado arriba son proporcionadas por Unity de
forma predeterminada.
Vamos a aprender a crear nuestras propias etiquetas y capas ms tarde.

La etiqueta se utilizar ms adelante, as que volvamos al controlador de personajes y nuestro
script.
Seleccione el objeto Player y mire en la ventana del Inspector. Debe tener un aspecto similar
a este:

10

Scripts de CharacterController y ThirdPersonController en su lugar.


Nuestro prximo paso es ajustar el Character Controller. Por el momento, el Control de colisin
(Collider) en forma de cpsula que utiliza se encuentra demasiado lejos en el eje Y, por lo que
Lerpz est en el aire. (Usted puede ver la posicin del Collider en la vista de escena: es el largo
alambre cilndrico verde) Tenemos que cambiar el valor del Centro de Y.

Ajuste de la cpsula que controla la colisin del personaje se muestra como un alambre verde.

Posicione el Collider de la cpsula como se muestra en la pantalla de arriba. (Un poco de


experimentacin sugiere poner el Centro del Contralor del personaje en Y a 1.03 Esto, alinear
su extremo inferior con los pies perfectamente.)

11

Si usted hace clic en Reproducir ahora, Lerpz ahora debe moverse cuando utiliza las teclas de
control con los pies firmemente en el suelo.


El controlador de personajes y el script de Controlador de Tercera
Persona
En la mayora de los juegos, el avatar del jugador es capaz de hazaas fsicas imposibles, como
girar y detenerse instantneamente, saltar distancias inverosmiles y otras acciones que sera
muy difcil de modelar con la fsica tradicional. El Character Controller por lo tanto separa
nuestro avatar del jugador desde el motor de fsica, proporcionando controles de movimiento
bsico.

El Contralor de personajes simplifica el movimiento de un jugador (y muchos tipos de personajes
diferentes). Se trata de un Collider de cpsula atado a un sistema de movimiento de base, que
permite que nuestro personaje pueda moverse, subir escaleras y cuestas hacia arriba o hacia
abajo. T puedes cambiar el tamao mximo de las pendientes en el Inspector.

El Character Controller se utiliza normalmente con un script. Esto habla con el controlador de
personaje y ampla sus capacidades para satisfacer las necesidades del juego.
En nuestro proyecto, el script de Third Person Controller realiza esta funcin y agrega el apoyo
necesario para nuestro juego de plataformas. Lee el joystick, teclado, ratn u otro dispositivo de
entrada y acta en consecuencia como el control del avatar del jugador.
El administrador de entradas de Unity (Edit->Project Settings->Input Manager) le permite definir
cmo los dispositivos de entrada controlan el jugador.

Nota: No hay nada especial acerca de los scripts que estamos usando para el jugador. Son scripts
normales de Unity que se han construido para este proyecto. No hay un scriot para controlar
personajes por defecto.

El script de Controlador de Tercera Persona es ya parte de los prefabricados, asi que no hay
necesidad de aadirlo.
El siguiente paso es hacer Lerpz se anime correctamente y aadir los movimientos adicionales,
tales como saltar y golpear ...



Animando a Lerpz
En este punto, Lerpz solo se desliza a travs del paisaje. Esto es porque el Character Controller no
maneja animacin. No sabe nada acerca de nuestro modelo de jugador o secuencias de animacin
que se aplican a cada movimiento. Necesitamos conectar a Lerpz con sus secuencias de
animacin y esto se hace con el script ThirdPersonPlayerAnimation.
Utilice el men de componentes para agregar el script ThirdPersonPlayerAnimation al
GameObject Player.
Si usted hace clic en Reproducir ahora, ver a Lerpz con su animacin correcta.

Entonces, qu est pasando aqu? Qu hace este script? La respuesta est en cmo gestiona
Unity datos de animacin de personajes.

Character Animation
Las secuencias de animacin de los personajes se crean dentro de un paquete de modelado, como
3D Studio Max, Maya, Blender o Cheetah3D. En la importacin en Unity, estas secuencias se
extraen automticamente y se almacenan en un componente de animacin.
Estas secuencias de animacin se definen en un esqueleto virtual, que se utiliza para animar
el modelo bsico. Estos esqueletos definen cmo la malla del modelo --los datos importantes en

12

la definicin de las superficies visibles del modelo en s mismo -- es modificada y transformada


por el motor para producir la animacin necesaria.


armaduras
Mezcla de animacin
Las Animaciones de los personajes suelen ser mezcladas para proporcionar la flexibilidad
necesaria para un juego. Por ejemplo, un ciclo de recorrido animado podra mezclarse con una
serie de animaciones discurso, el resultado es un personaje que camina y habla al mismo tiempo.
La mezcla se utiliza tambin para producir unas suaves transiciones entre las animaciones, como
la transicin entre un ciclo de andar y una secuencia de golpe.
Tenemos que usar un script para decirle a Unity que necesitamos cambiar las animaciones,
cuando se necesita la mezcla de la animacin y cmo debe hacerse. Aqu es donde entra de Nuevo
el scripting.

El Script de Animacin de Jugador de Tercera Persona
El modelo Lerpz que estamos usando usara las siguientes animaciones en el tutorial:
Walk (Caminar) -- Ciclo de andar normal.
Run (Correr) -- Una Animacin de correr. (Mantenga presionada la tecla Shift mientras se
reproduce para correr.)
Punch (Golpe) -- Se usa al atacar a un guardia robot enemigo.
Jump (Saltar) -- Se usa Lerpz cuando se producen saltos en el aire.
Jump Fall (Saltar cada) -- Se usa cuando Lerpz alcanza el limite del salto y comienza a caer.
Idle (Ocioso) -- Un loop que se reproduce cuando Lerpz est inactivo.
Jump Fall (saltar un muro) -- Animacin backflip reproduce cuando Lerpz salta de una pared.
Jet-Pack Jump (Salto jetpack) -- Se usa cuando el jetpack de Lerpz est desacelerando su cada.
Ledge Fall (Caida de un borde) -- Se usa cuando Lerpz se para fuera del borde de una
plataforma.
Buttstomp -- Se usa cuando Lerpz ha sido golpeado por un guardia de robot.
Jump land (Aterrizaje de Salto) -- Se usa cuando Lerpz aterriza despus de un salto o una cada.


El modelo y las animaciones para Lerpz fueron creados con Maya, importados a Unity. Para
obtener ms informacin sobre la importacin de mallas y animaciones, por favor vaya a el
Manual de Unity.

La mayora de estas animaciones se tratan en el script de ThirdPersonPlayerAnimation, que
verifica que controles del reproductor est utilizando y reacciona en consecuencia. Algunas
animaciones se colocan en capas sobre los dems, mientras que otros son simplemente puestos
en cola uno tras otro. El script es sobre todo un conjunto de funciones de respuesta del mensaje.
Los mensajes pertinentes son despachados por el script ThirdPersonController, que lee los
dispositivos de entrada y actualiza el Estado del personaje en consecuencia.


El ataque de Lerpz es un puo. Este se realiza con un script diferente,
ThirdPersonCharacterAttack. (Vamos a aadir esta secuencia de comandos ms tarde.) Esto
puede parecer una divisin arbitraria, pero no lo es : la mayora de los movimientos bsicos

13

caminar, correr, saltar, etc son bastante similares sin importar que personaje sea. Sin embargo, los
movimientos de ataque y defensa tienden a ser mucho ms variados. En algunos juegos de
plataforma, el personaje del jugador podra tener un arma, y en otro, podra realizar un
movimiento de artes marciales.
En este tutorial, Lerpz tiende a golpear a su rival muy duro con el puo. La animacin es una
animacin de puo simple.

Gizmos
ThirdPersonCharacterAttack tambin incluye una caracterstica de prueba til: un Gizmo que
dibuja una esfera para representar a la zona afectada por la accin de puo de Lerpz. Los Gizmos
son elaborados dentro de uno de las das funciones de Gizmodrawing de manejo de mensajes. En
este ejemplo, la malla Gizmo es una esfera amarilla que establece en la posicin de golpe y
muestra su rea de efecto. Es elaborado en respuesta a la funcin OnDrawGizmosSelected().
Esta funcin debe ser esttica y ser llamado por el Editor de Unity. Una alternativa es
OnDrawGizmos(), que es llamada por el Editor de Unity cada ciclo Update, independientemente
de si el padre GameObject ha sido seleccionado.


El JetPack

Jetpack de Lerpz en accin.

En este punto, nuestro personaje puede correr y saltar alrededor, pero su jetpack an no est
funcionando. Lerpz utiliza el jetpack para disminuir su tasa de descenso. El movimiento ya est en
su lugar, pero el fuego del jetpack no se anima. Para que funcionen los chorros, vamos a necesitar
aadir dos sistemas de partculas y un componente de punto de luz. Los sistemas de partculas
producirn un efecto de llamas, mientras la luz de punto dar la ilusin que las llamas actan
como fuente de iluminacin.

TIP Lo ideal sera tener un punto de la fuente de luz para cada jet, pero los chorros de escape
estn lo suficientemente cerca entre s para usar slo uno. Ya que las luces son de alto costo
computacional, esto es una de las muchas optimizaciones que se deben realizar en el desarrollo de
videojuegos.

Qu es un sistema de partculas?
Los Sistemas de partculas emiten docenas de partculas normalmente planos en 2D o sprites al
mundo 3D. Cada partcula se emite a una velocidad establecida y la velocidad, viven un cierto
tiempo. Dependiendo de la configuracin y los materiales utilizados, estos sistemas de partculas
puede ser utilizados para simular algo de fuego, humo, agua y hasta explosiones estelares.

14

Adicin de los Sistemas de Partculas


Utilice el men de GameObject para crear un GameObject vaco en el panel de jerarqua.
Cambie el nombre del GameObject por "Jet".
Con el nuevo GameObject seleccionado, aadir:
Un emisor de partculas del elipsoide (Ellipsoid Particle Emitter)
Un animador de partculas (Particle Animator)
Un Collider de partculas de Mundo (World Particle Collider)
Un Particle Renderer
Desactive la casilla "Enabled" en la ventana para el componente de Particle Renderer . Esto
lo desactiva temporalmente.
Posicione el Jet directamente debajo del chorro de escape derecho de Lerpz
Reactive el Particle Renderer .
Ajuste la configuracin del emisor de partculas del elipsoide, como se muestra a
continuacin:

Configuracin del emisor de partculas elipsoide.

15

Estos ajustes resultan en un pequeo chorro de partculas que vamos a utilizar para simular el
chorro de la llama.

SUGERENCIA Si las partculas no se mueven directamente hacia abajo, utilice las herramientas de
rotacin de Unity para rotar nuestro objeto hasta que el chorro se mueve en lnea con el jetpack.
Cuando hayamos terminado, el sistema de partculas se adjuntar al objeto hijo en la jerarquia del
Player torso. Esto har que el chorro siga los movimientos del jugador. En este punto, sin
embargo, estamos interesados principalmente en conseguir que se vea bien, as que no te preocupes
demasiado por una colocacin precisa.

El tamao mnimo y Tamao mximo defininen el rango de tamao de las partculas. Min y
Max de Energa definen la vida til mnima y mxima de las partculas.
Nuestro partculas vivir slo por un tiempo corto 0,2 segundos en este caso, antes de
apagarse.
Hemos establecido la cantidad de partculas que emiten a 50. El rango Min y Max de emisin
define cuntas partculas que queremos en la pantalla en cualquier momento. El resultado
debera ser un buen flujo de partculas.

NOTA hemos inhabilitado "Simular en Worldspace" aqu. Esto ayuda a dar la impresin de que
tenemos un chorro de gas caliente y rpido ms que una llama mucho ms lenta.
Ahora bien, establecer la configuracin de los componentes Particle Animator como se muestra:

Configuracin de animador de partculas. Los valores en la tabla de definir las entradas de Animacin de color. No se olvide de
configurar los otros ajustes tambin!

Color Rojo Verde Azul Opacidad

El Particle Animator animar los colores de las partculas a medida que envejecen. Las
partculas comienzan en blanco, pasando por el amarillo oscuro y anaranjado mientras nuestro
jet virtual se enfra. Desde que vamos a renderizar una textura en cada partcula, el animador de
partculas se utiliza para teir esta partcula, por lo que la animacin de color ser sutil, pero
efectiva.
El selector de color de dilogo que aparece cuando haces clic en un color tambin ofrece una
"opacidad" con control deslizante. La tabla con los valores de color que tambin lo incluyen.
Mediante la reduccin de la opacidad de todo el ciclo de animacin, la partcula 'llamas' van a a
desaparecer como cuando se enfran.


El siguiente es el Particle Renderer . Este componente dibuja cada partcula, por lo que debe
explicarsele cmo van a aparecer las partculas. Tambin define el material que se utilizar para
representar cada una de las partculas. Queremos un efecto de chorro de llamas , por lo que
deber utilizar el material "fire add", que se puede encontrar en: Particles->Sources->Materials->

16

Fire add
TIP Este asset tambin se incluye en la carpeta Standard Assets.

Establecer los valores de este componente de la siguiente manera:

Configuracin de Particle Renderer.


La variable de estiramiento de particulas (Stretch Particles) le dice Unity si las partculas deben
ser estiradas si se estn moviendo a gran velocidad. Queremos que las partculas se estiren un
poco de acuerdo con su velocidad. Esto aade una seal visual sutil y hace que las formas que
estamos usando para esta mezcla reaccionen mejor entre s.

NOTA Las configuraciones de Cast Shadows y Recieve Shadows no tienen ningn efecto a menos
que utilice un shader personalizado. Este es un tema avanzado ms all del alcance de este tutorial.

Adicin de la Luz
Nuestro jet se ve bien, pero en realidad es una ilusin: EL Sistema de partculas slo escupe un
montn de pequeas imgenes, pero el resultado no emite luz. Para completar la ilusin,
vamos a crear un GameObject Pointlight por separado. Vamos a encenderlo y apagarlo al
mismo tiempo que los chorros. El resultado ser un chorro de fuego que ilumina su entorno
inmediato. (Slo se utiliza una sola luz, en lugar de una luz por chorro, esto ahorra potencia de
procesamiento mientras que mantiene la ilusin.)
Cree un nuevo GameObject de Pointlight.

Nombre este "Jet Light" y posicionelo entre los dos chorros del jet de Lerpz. (Volveremos a
nuestro sistema de partculas Jet en breve.) Esta luz va a crear la ilusin de que los chorros son
emisores de luz.
Para este efecto funcione, necesitamos un punto de luz brillante con una alta intensidad.

17

Seleccione la luz y ajuste la configuracin como se muestra:

Configuracin de la Luz del Jet.

Por qu no las sombras?


Las sombras son computacionalmente costosas para la mayora del hardware. Tiene sentido evitar
clcularlas, si podemos. Los jets no son muy grandes, por lo que slo tendr que iluminar de la
espalda de Lerpz's. La luz de punto tambin se ver reflejada en el escenario cercano, pero no ser
lo suficientemente brillante para que la la falta de sombras sea notable.


El siguiente paso es actualizar el GameObject Player para incluir nuestro jet y los objetos de luz.
Para ello, primero aadimos nuestro Jet al panel de proyectos como Prefab:
En el panel Proyectos, seleccione la carpeta Player (vaca), a continuacin, haga clic en
Crear...
En el menu de lista desplegable, seleccione Prefab. Esto crear un objeto de Prefab vaco
Adentro.
Cambie el nombre de Prefab vaco a Jet.
Arrastre nuestro objeto Jet desde el panel de jerarqua en nuestro Prefab nuevo.

El nombre de Jet en el panel de jerarqua deba ponerse azul para mostrar que est ahora
vinculado un prefab. Vamos a utilizar dos instancias de nuestro Jet prefabricado para el jet pack
de Lerpz.

Color Rojo Verde Azul Opacidad


Eliminar nuestro objeto Jet original desde el panel de la Jerarqua. (Sin embargo, dejar la luz
del Jet donde est!)
Ahora agregamos el jet (dos veces) y la luz (una vez) a nuestro jugador:
Ir al objeto Player en la jerarqua,
Abrirla hasta que encuentre el objeto secundario torso.
Arrastre el objeto Jet Prefab a este objeto en dos ocasiones. Esto crear dos instancias Jet.
Cambie el nombre de las dos instancias Jet por Jet L y Jet R,
Arrastre la Luz Jet en el mismo objeto del torso.

18

Ahora debera tener una jerarqua de objetos que se ve algo como esto:

Jerarqua del Jetpack

Utilice herramientas de manipulacin de Unity para posicionar cada Prefab Jet sobre su
respectivo chorro de salida en el modelo de Lerpz. Puede que tenga que girar el chorro, de modo
que las partculas vayan en la direccin correcta.
Mueva el la Luz Jet a un punto entre los dos Jet Prefabricados.

Cuando hayas logrado esto, Lerpz Ahora debe tener dos jets en llamas que brotan de su jetpack
cuando se mueve. Estamos casi listos!

El paso final es hacer que los Prefabricados Jet y objetos Jet de luz se activen slo cuando este
salte. Esto se logra a travs de scripts.

Busque el script JetPackParticleController en scripts->Player y arrastrelo al objeto
principal Player en el panel de la Jerarqua. Esto agrega el script a nuestro personaje del jugador.
Ahora debe ver que el jetpack funciona como se espera. El script controla los dos sistemas de
partculas y la luz, sincronizandolos con los movimientos de Lerpz
y disparando los tres elementos cada vez que el jugador pulsa el botn de salto o para frenar su
descenso.

19

El Jetpack de Lerpz en accin.

Blob Shadows
Lerpz debe ser fcil de identificar en todo momento, de modo que los jugadores no pierdan la
pista de sus avatares cuando el juego se hace visualmente complejo. La mayor parte de este
trabajo corresponde a los artistas y los el diseadores del juego, pero hay algunos elementos que
tienen que ser manejados por Unity.
Uno de los ms importantes es el sombreado y la iluminacin. Para ayudar el rendimiento,
los efectos de iluminacin son a menudo prerenderizados en las texturas del artista con una
tcnica conocida como "Baking". Esta tcnica slo funciona bien sobre los objetos estticos, tales
como escenarios y accesorios fijos. (Hemos evitado deliberadamente esta tcnica en los assets de
este tutorial.) Un personaje que camina bajo una farola necesita reaccionar a la luz en tiempo
real. El suelo bajo el personaje puede tener la iluminacin con Baking, pero el personaje no puede
utilizar este truco, y tambin necesita reaccionar a la luz.

La solucin es colocar las luces dinmicas, donde es necesario. Si utiliza texturas con Baking,
recuerde aadir una luz donde quiera que se implica esta por la iluminacin, pero haga que las
luces slo afecten a los objetos en movimiento. Las luces ya se han colocado en esta escena para
usted.

Esto deja un ltimo elemento: las sombras.

En un juego de plataformas en 3D, la sombra juega un papel clave ya que nos dice donde el
personaje caer si esta saltando o cayendo. Esto significa que debe tener una sobra visible lo cual
no es el caso en este momento.
Las sombras pueden ser producidos a partir de luces, con la sombra siendo computarizada y
generada en tiempo real por el motor grfico. Sin embargo, las sombras son costosas en trminos
de potencia de procesamiento. Adems, no todas las tarjetas grficas puede calcular sombras
rpidamente o con eficacia; las antiguas tarjetas pueden no ser capaces de hacerlo en absoluto.
Por esta razn, vamos a utilizar una sombra Blob para Lerpz.
Aadir una sombra Blob
Una sombra Blob es una truco. En lugar de emitir rayos de luz y comprobar si afectan cualquier
cosa, simplemente se proyecta una imagen oscura - en este caso, slo una mancha circular negra -
debajo de nuestro personaje. Esto es ms rpido y ms fcil para la tarjeta grfica, as que debera
funcionar bien en todas las gamas de hardware.

Unity incluye un BlobShadow prefabricado en su coleccin de Assets estndar, por lo que se
podra utilizar esto en lugar de crear uno propio. Este asset ya se ha importado y se aade a
el proyecto en la carpeta Blob-Shadow. Abra esta carpeta y haga clic en el prefab blob shadow
projector y arrstrelo a nuestro nivel superior del objeto Player en el panel de jerarqua. Esto debe
agregar el proyector justo por debajo del nivel superior en la jerarqua de nuestro objeto Player:

20

El Prefab blob shadow projector en la jerarqua del Jugador.


A continuacin, tendr que modificar la posicin del proyector de sombra de blob y datos de
rotacin de modo que este directamente encima de nuestro personaje y apuntando directamente
hacia el suelo.

Seleccione el layout 4Split
Ajuste los valores de rotacin del proyector de sombra burbuja a 90, 180 y 0,
respectivamente.
Ahora use las vistas lateral y superior para mover el proyector directamente sobre la cabeza
de Lerpz. Es posible que desee mover hacia arriba o hacia abajo un poco hasta que est satisfecho
con el tamao de sombra.

Crear una nueva capa
En este punto, usted habr notado que la burbuja tambin est siendo proyectada en Lerpz.
No queremos que esto suceda. Hay dos opciones para evitar esto: mover el valor del Near Clip
Plane ms lejos del proyector, o simplemente decirle que no proyecte en los objetos en capas
especficas. Vamos a utilizar la segunda opcin.

Por qu no ajustar Near Clip Plane?


Esta tcnica puede parecer ms fcil a primera vista, pero el plano tendra que ser ajustado
por scripting para tener en cuenta las animaciones de Lerpz. Sus pies se mueven ms lejos
cuando salta y se acercan un poco ms cuando las aterriza de nuevo. Ya que la sombra siempre
debe ser proyectada sobre el suelo, esto significa que el Near Clip Plane no puede seguir siendo el
mismo en toda estas secuencias.

Abra el GameObject Player.


Abra el men desplegable de Layer en el Inspector.
Seleccione Add Layer...
Haga clic en la primera entrada vaca User Layer y nombrela noShadow.

Ahora debera ver algo como esto en su Inspector:

21

Aadir un nuevo Layer usando el Administrador de etiquetas.

Ahora, haga clic de nuevo en el objeto Player en el panel de jerarqua para que aparezca la
ventana de Ajustes de Inspector.
Haga clic en el men desplegable "Layer" pongalo en el nombre de la capa nueva,
noShadow. Unity le preguntar si desea aplicar esto a todos los GameObjects hijo: haga clic en
"Cambiar las Capas hijas".
Lo siguiente que necesitamos decirle al proyector Shadow Blob que no proyecte en los objetos
en este Capa.

Muestre las propiedades de la sombra de blob en la ventana y mire la entrada Ignorar
Capas en el componente del proyector.
Use el men desplegable a la derecha para seleccionar la capa de noShadow (que debe
aplicarse a los hijos), como se muestra:

Propiedades del blob shadow projector.

Si ahora juega el juego y se mueve a su alrededor debe ver la sombra comportarse ms o menos
como se esperaba .... excepto si saltas cerca de las objetos de combustible para recolectar. Si
intentas hacer esto, podrs ver el item mostrando la sombra tambin.

22


Queremos que los artculos recolectables se destaquen en todo momento, tiene sentido que el
proyector de sombras blob evite estos tambin.
Vamos a mirar estos artculos recolectables con mucho ms detalle en el captulo siguiente, pero
vamos a solucionar este problema ahora, mientras estamos aqu.

En primer lugar, detenga el juego.
Ahora vaya al panel de proyectos y busque los objetos FuelCellPrefab y
HealthLifePickUpPrefab. Usted los encontrar dentro de la carpeta Props.
Seleccione el objeto raz de cada uno de Prefab y establezca su Layer a noShadow, como se
muestra a continuacin:

Cambiar Layer a "noShadow"


NOTA Al hacer un cambio a un objeto primario, Unity a menudo se preguntan si el cambio
debera aplicarse tambin a los hijos de dicho objeto. Si lo hace, puede ser peligroso si usted no ha
pensado en todas las ramificaciones.
En este caso, queremos que todos los objetos secundarios de los GameObjects "FuelCellPrefab" y
"HealthLifePickUpPrefab" esten en la misma capa noShadow , as que cuando
Unity pide, propagar los cambios seleccine que esta de acuerdo.

Conceptos de scripting

La mayora de los scripts estn centrados en un concepto popular en el desarrollo del juego: La
maquina de estado finito. Una mquina de estados finitos esencialmente define un sistema de
interaccin de condiciones, conocidos como estados.

Un estado puede ser casi cualquier cosa, por ejemplo si un objeto se debe renderizar,
si debe ser sujeto a las leyes de la fsica, si enciende o no una sombra, si puede rebotar, su
posicin en una pantalla, y as sucesivamente. El panel de Inspector nos permite cambiar
muchos Estados, directamente, porque estos estados son comunes a casi todos los juegos.
Sin embargo, hay otro tipo de Estado que es especfico para el juego en s. Unity no sabe que el
avatar del jugador es un extraterrestre, cunto dao puede soportar Lerpz o que posee un
jetpack. Cmo puede Unity saber de la conducta de los guardias robot o cmo deben interactuar
con Lerpz?
Aqu es donde los scripts son utiles. Usamos scripts para agregar la interaccin y la
administracin de estados especficos para nuestro juego.
Nuestro juego tendr que estar al tanto de una serie de estados. Estos incluyen:
La salud del jugador;
El nmero de objetos de combustible que el jugador ha recogido;
Si el jugador ha acumulado suficiente combustible para desbloquear el campo de fuerza;
Si el jugador se ha parado sobre una plataforma de salto;
Si el jugador ha tocado un item para recolectar;
Si el jugador ha tocado la nave espacial;
Si el jugador ha tocado un punto de reaparecer;
Si el Game Over o pantallas de inicio debe ser mostrado;
... y mucho ms.

23

Muchos de estos estados requieren que se realicen pruebas contra los estados de otros objetos
para garantizar que estn al da. A veces, incluso se necesitan de los estados intermedios, para
ayudar a una transicin. Por ejemplo, recoger una lata de combustible obliga a una verificacin
para ver si el jugador tiene las suficientes para apagar el campo de fuerza.


Organizacin y Estructura
En este tutorial las mquinas de estado para el jugador, el nivel y los enemigos se manejan
por un puado de scripts relacionados con diversos GameObjects. Estos scripts se comunican
entre s, enviando mensajes y llamando funciones de cada uno.
Hay un nmero de maneras en que podemos establecer estos vnculos:
Para aadir un enlace expuesto en la ventana del Inspector, en el que se coloca el objeto en
cuestin. Esto es ideal para scripts de proposito general que van a ser reutilizados en otros
proyectos.
Este es lo ms eficiente ya que el script simplemente arranca los datos de la variable relevante
y no necesita hacer ninguna bsqueda. Sin embargo, se asume que usted sabe de antemano
exactamente qu objeto o componente que ser enlazado.
Nosotros usamos esta opcin para las cmaras en LevelStatus. (Esta secuencia de comandos, ya
est linkeada al GameObject Nivel.) Esto nos da la flexibilidad de la creacin de mltiples
cmaras, una para de escena del nivel "desbloqueado" y otra para la secuencia de "nivel
completo". En la prctica, slo estamos utilizando dos cmaras en el juego, uno para el jugador y
nivel completo y la otra para la escena "desbloqueado". Pero la opcin est ah para cambiar esta
situacin.
Estableciendo un vnculo dentro la funcion Awake () del script. La funion Awake () es llamada
en cada script que usted escriba antes que el primer evento Update se desencadene en el
GameObject al que esta pegado. Configurar el enlace aqu le permite almacenar en cach el
resultado para su uso posterior en una funcion Update(). Normalmente, se crearia una variable
privada con un enlace a otro GameObject o componente al que necesite tener acceso dentro de su
script. Si usted necesita hacer un GameObject.Find () para localizar el objeto, es mucho mejor
hacerlo una sola vez, dentro de Awake () debido a que GameObject.Find () es bastante lento.

Esta opcin es ms adecuada para aquellas situaciones en las que no necesita la flexibilidad de la
primera opcin, pero no quiero tener que realizar una bsqueda complicada para el objeto en
cada ciclo de juego. La solucin es, por tanto, buscar el objeto cuando el script ya fue despertado,
almacenando los resultados de la bsqueda para su uso en la seccin de Update.
Por ejemplo, el script LevelStatus, que maneja el estado del nivel, guarda en cach enlaces a
varios otros objetos, incluido el objeto Player. Sabemos que estos no van a cambiar, as que
bien podramos hacer que la maquina haga este trabajo por nosotros.

Establecer un enlace durante la funcion Update (). Esta funcin se llama al menos una vez
por ciclo de juego, as que es mejor evitar el uso de llamado de funciones lentas aqu. Sin
embargo, las funcionesGameObject.Find () y getComponent () pueden ser bastante lentas.

Esta opcin se utiliza para aquellas situaciones donde el objeto que usted necesita podra
cambiar en cualquier momento durante el juego.
Por ejemplo, En cul de los mltiples puntos de Reaparicin en la escena de este tutorial debera
Reaparecer el jugador? Esto claramente cambia mientras el juego se est ejecutando, por lo que
necesitamos manejar este caso de la manera correcta.

El problema con esto es que es demasiado lento, as que es mejor disear para que no sea
necesario hacer esto a menudo.

24

Scripts en un entorno de desarrollo visual


Unity es una herramienta inusual ya que se centra en los assets visuales en lugar de los vnculos y
las conexiones entre ellos. Un proyecto de Unity grande puede tener docenas de scripts de distintas
complejidades interconectados alrededor de la Jerarqua, por lo que el diseo utilizado para este
tutorial usa algunas tecnicas de programacion orientada a objetos.
El script que trata con una parte especfica de la mquina de estado por ejemplo, Animacion del
Jugador debera tambin el que realiza un seguimiento de las variables de estado correspondientes.
Esto puede hacer las cosas un poco complicadas cuando un script debe tener acceso a una variable
de estado almacenada en otro script, por lo que algunos scripts almacenan algunos valores en
cach para realizar el acceso a la informacin ms rpido. Esta tcnica tambin de vez en cuando
resulta en cadenas de comandos, donde una funcin en un script simplemente llama a una funcin
similar en otro script. El manejo de la muerte y de la salud del jugador es un ejemplo de ello.



Si lo desea, puede volver al GameObject Player en un prefab con todos nuestros cambios, de
manera que usted pueda reutilizarlo en otros proyectos como punto de partida:

Haga clic en la carpeta Player en el panel de proyectos.
Crear un prefab nuevo. (Va a aparecer dentro de la carpeta Player.)
Dar al Prefab nuevo un nombre apropiado. Por ejemplo: LerpzPrefab.
Arrastre el GameObject Player a LerpzPrefab para completar el proceso.

Muerte y Renacimiento

Los personajes de un juego Plataforma tienden a llevar una vida de riesgo y Lerpz no es una
excepcin. Tenemos que asegurarnos de que pierde una vida si se cae del nivel. Tambin
tenemos que hacerlo reaparecer en un lugar seguro en el nivel por lo general llamado un "punto
de reaparecion"
Otro punto es que si Lerpz puede caerse del nivel, tambin es posible que los otros personajes
puedan hacer lo mismo, por lo que estos tambin deben ser tratados adecuadamente.
La mejor solucin para esto es usar un control de colisin tipo caja (Box Collider) para detectar
cualquier objeto que caiga del nivel.
Vamos a hacerla muy larga y amplia, de modo que si un jugador intenta utilizar el jetpack
mientras cae, todava caiga en ella. Sin embargo, Lerpz tendr un lugar para reaparecer.
Iremos a los puntos de reaparecer en breve. En primer lugar, vamos a construir el Box Collider:

Crear un GameObject vaco.
Cambie el nombre del nuevo objeto a FalloutCatcher.
Aadir un Collider Caja al objeto.
Aadir el script Fallout Death del men Components->Third Person Props.

Utilice el inspector para establecer los valores como se muestra en la siguiente imagen:

25

Configuracin del Fallout Catcher.


El script de la muerte Fallout
Este script es corto porque simplemente delega todo el trabajo al script ThirdPersonStatus.
(Este debe ser conectado a Lerpz, pero no vamos a hacerlo justo ahora.)

El cdigo para manejar el trigger del Collider se encuentra en OnTriggerEnter (). Esta funcin es
llamada por Unity cuando el Collider de Caja es golpeado por otro GameObject que tenga un
Componente Collider, como Lerpz o un enemigo.

Hay tres pruebas: una para el personaje, uno para un objeto RigidBody simple, y una tercera
prueba para comprobar si el objeto tiene un componente de CharacterController. La segunda
prueba busca si accesorios como cajas o cajones se caen del nivel. La tercera prueba se utiliza
para los enemigos, ya que estos no manejan fsica ordinaria.

Si el personaje golpea el Collider de caja, el cdigo simplemente llama a la funcion FalloutDeath ()
en el script de ThirdPersonStatus de Lerpz.

Si otro objeto con un objeto Collider golpa nuestro GameObject, simplemente lo destruimos,
de la escena, de lo contrario caer para siempre.
Adems, tenemos:
La funcin de utilidad Reset () la cul garantiza que todos los componentes estan presentes.
Esta funcin es llamada por Unity de forma automtica al aadir el componente por primera vez.
Tambin puede ser llamado en el Editor haciendo clic en el icono de la rueda situado a la derecha
del nombre del componente en el Inspector:

El comando de men Reset.

La directiva @Script, que tambin se agrega el script directamente al men de los componentes
de Unity. Esto es muy conveniente y ahorra tener que buscar en el interior del panel de
proyectos .

26

Si tratamos de jugar el juego en este punto, Unity muestra un error porque no se sabe donde
hacer reaparecer a Lerpz. Aqu es donde los puntos de reaparicin entran en juego.

Puntos de Reaparicion
Cuando el jugador muere, necesitamos un lugar seguro para que vuelva a aparecer.
En este tutorial, Lerpz volver a aparecer en uno de los tres puntos de reaparicin. Cuando Lerpz
toca uno de estos puntos, se convertir en activo y este ser en el que vuelve a aparecer, si l
muere.

Lerpz de pie en un punto de reaparicion activo.

Los puntos de reaparicin son instancias del objeto prefabricadas RespawnPrefab. (Usted lo
encontrar en la carpeta del panel de Proyecto Props.)
Este Prefab es un modelo de una base de telepuerto, junto con tres sistemas de partculas
completo, un reflector y algunas otras cosas. Aqu est la estructura bsica:
RSBase contiene el modelo en s: una base cilndrica corta con un disco azul brillante en el
centro.
RSSpotlight es un objeto de spotlight que ilumina con una luz azul sutil por encima de la
superficie de del modelo, dando la ilusin de que la textura es azul brillante.
El resto de los objetos del juego son los sistemas de partculas. El script Respawn linkeado con
el objeto RespawnPrefab cambia entre estos sistemas de partculas dependiendo del
estado del prefab:

Si el punto de reaparecer esta inactivo, un pequeo efecto de las partculas aparenta una niebla
azul brillante. Esta es la que figura en el RsParticlesInactive.
Si el punto de reaparecer esta activo, un mayor efecto se muestra. Este esta contenido en el
RsParticlesActive.
Slo un punto de reaparicin puede estar activo en el nivel en cualquier momento. Cuando el
jugador toca el punto de reaparecer, un objeto Collider (establecido como un gatillo) lo detecta y
dispara la activacin del punto de reaparecer.
Los otros tres sistemas de partculas RSParticlesRepawn1, RSParticlesRepawn2 y
RSParticlesRepawn3 son activados juntos cuando el jugador aparece en el punto de reaparecer.

27

Estos son sistemas de partculas de una sola vez. El script los activa una vez y luego restaura el
sistema de partculas RsParticlesActive una vez la secuencia ha terminado.

El prefab contiene un script, respawn, que controla el estado del punto de reaparecer.
Sin embargo, para que el juego sepa qu punto de reaparecer especfico es en el que el jugador
tiene que ser devuelto al momento de morir, tenemos que organizar los puntos de reaparicin en
una jerarqua en virtud de un script controlador maestro. Vamos a hacer esto ahora:
Arrastre el RespawnPrefab en la vista de escenas.
Posicinelo como se muestra en la imagen en la pgina siguiente.
Cambie el nombre de esta instancia a Respawn1.
Repita los pasos anteriores dos veces ms. Puede colocar estos donde los quiera o incluso
aadir ms si lo desea!

El siguiente paso es crear un GameObject vacio para adicionar todos los Respawn y dar orden al
proyecto.

Cambie el nombre por RespawnPoints
Haga todas las instancias prefabricadas respawn hijos de RespawnPoints.

Posicionando el punto de reaparecer en primer lugar. (Lerpz se ha trasladado para dar claridad)


Cmo funciona?
Cuando se carga la escena, Unity llama a la funcin start () en cada instancia del Script Respawn,
donde algunas variables tiles estn inicializadas y punteros a otros elementos
se almacenan en cach.
El mecanismo clave se centra en torno a esta variable esttica:

static var currentRespawn : Respawn;

Esto define una variable global llamada currentRespawn.


28

La palabra clave static significa que se comparte entre todas las instancias del script. Esto nos
permite el seguimiento de qu punto de reaparecer es el activo. Sin embargo, cuando la escena
comienza, ninguno de los puntos se activa, por lo que necesitamos establecer un valor
predeterminado para nuestra Escena. El Inspector de Unity no mostrar variables de tipo
esttico nunca, por lo que el script define una propiedad inicial de Reaparicin (Initial
Respawn), que debe ser establecida para cada caso.
Arrastre el punto predeterminado Reaparicin a este.
Tendrs que repetir esto para todos los puntos de reaparicin en la escena. (En el tutorial, el
valor predeterminado se establece en Respawn1, que se encuentra cerca de la crcel,
directamente debajo del punto de partida del jugador.)

NOTA No es posible establecer estas propiedades directamente en el Prefab original.
Cuando un punto de reaparecer es activado por el jugador tocando su control de colisin, el
script de ese punto de Reaparicin primero desactiva el punto Reaparicin viejo y luego
establece currentRespawn para que apunte a s mismo. La funcion SetActive () se encarga de
disparar los correspondientes sistemas de partculas y efectos de sonido.

La reaparicin del personaje del jugador es manejado por el script ThirdPersonStatus, que
gestiona la mayor parte del estado de juego del jugador.
Aada el script ThirdPersonStatus al GameObject Player. El script se encuentra en: Scripts-
>Player
Los scripts de respawn tambin se ocupan de los efectos de sonido. Estos se reproducen como
oneshot (una sola vez), con excepcin de una fuente de audio adjunto a cada uno de los Prefab
Reaparicin. Este componente contiene el sonido "activo", que es un bucle. El script,
simplemente habilita o deshabilita este sonido dependiendo de si tiene que reproducir un sonido
oneshot como cuando el jugador esta reapareciendo o activando el punto de reaparicion o
tambien cuando el punto de reaparicion ha sido desactivado.

NOTA Unity hace que sea demasiado fcil aadir efectos de sonido. Cada vez que va a aadir un
asset de este tipo, considere cuidadosamente cmo se utilizar. Por ejemplo, nunca agregamos un
sonido de "reaparicin desactivado" , ya que nunca lo escucharia cuando el sonido se reproduzca,
ya que es poco probable que, debido a la posicin de los puntos de reaparicion estos esten al alcance
del odo uno del otro. Si usted fuera a convertir el proyecto en una partida multijugador, puede que
desee aadir un sonido y el script necesario para manejarlo.

29

Configuracin de la escena

Con nuestro hroe ahora puede moverse, el siguiente


paso es darle algo que hacer ...



Primeros pasos

En esta seccin veremos la construccin del mundo de juego en donde la accin tiene lugar.
En la terminologa de las pelcula, esto significa la construccin la escenografia, colocando la
utilera y los scripts que permiten a nuestro hroe interactuar con ellos.

Nuestro primer paso es preparar el escenario. El archivo del tutorial ya tiene el nivel bsico de
malla creado y poblado de con una serie de items recolectables. Pondremos un poco ms de
accesorios y elementos, pero la mayora ya se ha puesto, ya que de lo contrario este seria un
tutorial mucho mas largo.

Iluminacin
El nivel ya est provisto de una luz ambiente, as como muchas luces puntuales.
Estas iluminan el paisaje, el jugador, los enemigos y, en menor medida, los items.

En el caso de este proyecto, las luces fueron colocadas por el artista que model el nivel. La
Iluminacin desempea un papel tan importante en la creacin del ambiente que es usual dejar
esto en las manos del modelador que construy el nivel.

30

Ubicacin de accesorios

El escenario bsico se proporciona ya listo en el tutorial, junto con una serie de accesorios ya
existentes.

Construccin de tus propios niveles


El nivel del tutorial fue construido organizando los componentes de paisaje en Maya y despus
importando el nivel a Unity. Si a usted le gusta experimentar, o incluso crear nuevos niveles, los
elementos de cada escenario se puede encontrar en la carpeta Build Your Own! En el panel de
proyectos.

Hay un gran nmero de celdas de combustible y colocar todos estos hara un tutorial muy
aburrido. Vamos a colocar solo algunos items para ver como se hace.
Items de Salud
Empezamos con una tarea sencilla: la adicin de algunos items de salud para recolectar. Estos
son corazones que giran y brillan y le suben el nivel de salud a nuestro jugador. Estos, ya estan
definidos como prefabs en el panel de proyectos. Mire dentro de la carpeta Props y encontrar el
objeto HealthLifePickUpPrefab listo para ser usado.

Ubicacin de un item de salud.


Arrastre uno a la vista de Escena y use las herramientas de posicionamiento de Unity para
ubicarlo en alguna parte en el nivel.
Repita este proceso hasta que haya colocado una media docena de estos en todo el
mapa.
Donde ponerlos depende de usted, aunque no deben ser demasiado fciles de encontrar.
Considere cmo el jugador pueda jugar el nivel y decida cuales son los mejores lugares
para este tipo de items. Es mejor no ser demasiado generoso, o el juego ser demasiado fcil.

Por ltimo, debemos agrupar estos items en una carpeta de algn tipo para evitar saturar el
panel de la Jerarqua. Podemos hacer esto creando un GameObject vaco utilizando GameObject->
Create emtpy en el men. Cambie el nombre de este nuevo objeto a HealthPickups y uselo para
agrupar los items de salud, como se muestra:

31

Jerarqua de items de Salud.


El campo de fuerza

El campo de fuerza.

Por el momento, el campo de fuerza no esta animado: es slo una textura de malla esttica. El
resultado es visualmente decepcionante.
Hay varias maneras de lograr un efecto visual decente, pero cul escoger? A veces una solucin
simple es la mejor: slo animaremos las coordenadas UV de la textura para darle el efecto de un
campo de fuerza de ondulacin.

La animacin se realiza utilizando un script corto que se encuentra dentro de Scripts->Misc en el
panel de proyectos. Se llama FenceTextureOffset y se ve asi:



32

var scrollSpeed = 0.25;


function FixedUpdate()
{
var offset = Time.time * scrollSpeed;
renderer.material.mainTextureOffset = Vector2 (offset,offset);
}

La primera lnea expone una propiedad que se puede editar directamente en la interfaz de Unity
Scroll Speed. La funcion FixedUpdate () es llamada un nmero determinado de veces por
segundo por Unity. Utilizamos una frmula breve -- se multiplican el valor de Scroll Speed por el
tiempo actual para definir un offset para la textura.

Propiedades bien presentadas


Cuando Unity muestra en el inspector propiedades y variables, sus nombres se ajustan para que se
vean mejor. Normalmente, esto significa simplemente buscar las letras maysculas en el nombre y
la insercin de un espacio antes de cada una. Adems, Unity pone en mayscula la primera letra
del nombre. As scrollSpeed se muestra como Scroll Speed.



Cuando una textura se renderiza, la textura en s es por lo general slo una imagen. La propiedad
mainTextureOffset de un material le indica a Unity que debe dibujar el offset de la textura de la
imagen dentro de su espacio UV. Esto puede ser usado para producir unos resultados muy
eficaces sin recurrir a secuencias de animacin complejas.

Amplie el GameObject levelGeometry para ver los distintos elementos de datos del nivel.
Tenemos que animar la cerca en el objeto impoundFence, asi que arrastre el script
fenceTextureOffset aqui.


Script para los items de recoleccin
En el momento Lerpz no recoge ninguno de los items del nivel. Esto se debe a que a Unity no se le
ha dicho que permita que nuestro hroe lo pueda hacer. Tenemos que aadir dos elementos a
cada item:
Un componente de Collider,
Un script para manejar y actualizar el Collider asi como la salud del jugador, etc

Los artculos de recoleccin en el panel de jerarqua todos son instancias de Prefab, que se
muestran en azul. Mediante la edicin del Prefabricado original directamente, se actualizar
automticamente todos los elementos en el juego.
Los dos prefabs que nuestro hroe puede recoger son FuelCellPrefab y HealthPickUpPrefab.
Estos se pueden encontrar dentro de la carpeta Props en el panel de proyectos.

Seleccione el objeto raz HealthPickUpPrefab.
Use Components->Physiscs->Add Sphere Collider para aadir un Collider esfera a los
Prefabs.
Por ltimo, active el checkbox is Trigger.

33

El HealthPickUpPrefab en el Inspector.


NOTA Una script ObjectRotater ya est linkeado a la de Prefab. Esto slo hace que el item gire sobre
el terreno y es muy simple. Vamos a ver un ejemplo ms complejo en un captulo posterior.
Los Collideres tienen dos usos: se puede golpear con otra cosa, o se puede utilizar como
desencadenantes (trigger).

Triggers

Los triggers son los componentes invisibles que, desencadenan un evento. En Unity, un trigger es
simplemente un collider, con su propiedad Is Trigger activada. Esto significa que cuando algo
choca con el trigger, va a actuar como un conmutador virtual en lugar de una entidad fsica.
Los Triggers enviarn uno de tres mensajes de sucesos cuando algo los activa:
onTriggerEnter (), OnTriggerStay () y OnTriggerExit ().


Mensajes de eventos de triggers se envan a cualquier script adjunto al objeto de activacin, por
lo que ahora tenemos que agregar un script adecuado a nuestros Prefabs de salud:
Vaya al men de Componentes y elija el script Pickup del submen Third Person Props. Esto
aadir el script de recogida a nuestro Prefab.
Establezca la propiedad Pickup Type a Health en el inspector.
Por ltimo, establezca la propiedad Ammount hasta en 3 mas o menos. Esta es la cantidad de
salud que otorga al jugador.


34

Cunta Salud?

El "HUD" muestra el nivel de salud actual del jugador, la vidas, etc, slo es posible manejar un nivel
de salud mximo de seis. Qu ocurre si el jugador recoge un item de salud cuando ya tiene toda la
barra de salud completa? Esta es una cuestin de gusto, pero para el tutorial se ha optado por la
adicin de una vida extra. La lgica de esto se encuentra en el script ThirdPersonStatus.


Los items de combustible se fijan de manera muy similar, con dos diferencias:
El valor de Pickup Type debe ser FuelCell,

El valor de Amount que es la cantidad de combustible que el item representa (1 suena logico).



Plataformas de salto

Una plataforma de salto


Las plataformas de salto son los espacios de rayas de color amarillo brillante y negro en nuestro
nivel. Estos sirven para impulsar a Lerpz en el aire. Vamos a utilizar un Collider con un script
adjunto para este fin.
En primer lugar, cree un GameObject vaco y llamelo Jump Pad Triggers. Vamos a utilizar esto
como una carpeta para guardar nuestros objetos Jump Pad Triggers juntos.
Ahora vamos a construir nuestro Prefab:
Crear un GameObject nuevo vaco.
Cambie el nombre de este objeto a JumpPad Trigger 1.

35

Aada un Box Collider. (Un Sphere Collider funcionara en teora, pero el Box Collider se
ajusta mejor a la forma de la plataforma de salto.)
Establezca el Collider como un Trigger.
Aada el script JumpPad.

Ese es el objeto creado. Ahora tenemos que convertirlo en un prefab:
Elija Prefab en el men Create encima del panel del proyecto.
Arrastre y suelte el game object Jump Pad en el Prefab nuevo.
Cambie el nombre de Prefab a JumpPad Trigger.
Elimine el GameObject original de nuestro panel de la Jerarqua.
Arrastre un Prefab JumpPad en la escena y la posicinelo en uno de los lugares para
plataformas de salto. (Hay seis lugares. Se recomienda el uso del layout de 4 vistas para ayudar
con el posicionamiento.)
El valor por defecto del campo Jump Height es de 5 no es suficiente para lanzar a Lerpz
hasta el nivel del jardn. Se sugiere un valor de alrededor de 15-30 para estas plataformas. (El
ejemplo de proyecto terminado utiliza un valor de 30.)
Por ltimo, active la tecla Play y pruebe el juego para asegurarse de que todos nuestros
nuevos triggers funcionan correctamente.
NOTA Los scripts funcionan de manera similar a los Prefabs: hemos aadido un enlace al script
Pickup en la carpeta Props a nuestro Prefab. Editar la version de nuestro panel de proyecto
tambin afectar a las copias en la escena.
Una buena organizacin es importante si desea que su flujo de trabajo sea suave y sin problemas.
Use instancias prefabricadas donde sea posible.
Trate de organizar por funcin en lugar de tipo.
Use GameObjects vacos como contenedores (Objeto vaco que se crea como padre para
agrupar objetos del mismo tipo).

Usted se sorprender de cuantos assets se necesitan incluso para un proyecto de baja escala.

36

La interfaz grfica de usuario


Cuntas vidas nos quedan?
Cual es la salud de Lerpz actualmente?
Es hora de un GUI.

La interfaz de usuario

Los juegos suelen tener Interfaces Grficas de Usuario (GUI), tales como mens, pantallas de
opciones y as sucesivamente. Adems, los juegos suelen tener una interfaz grfica encima del
propio juego. Esto podra ser tan simple como un puntaje que aparece en una esquina, o un
diseo ms elaborado con iconos, pantallas de inventario y barras de estado de salud.


El HUD durante el juego
Nuestro juego necesita un GUI durante el juego para mostrar la salud del jugador, vidas restantes
y el nmero de celdas de combustible que necesita para escapar. Los elementos grficos ya estn
incluidos en nuestro archivo de proyecto.

La interfaz grfica de usuario se maneja dentro del script GameHUD, que utiliza el componente
de GUI para exponer los distintos elementos. Este script necesita estar conectado al GameObject
Level, que se utiliza para tener elementos especificos de la escena. (Podramos haberlo aadido
tambien al objeto NearCamera o a su propio "GameObject GUI", esto es principalmente una
cuestin de el gusto personal en lugar de una clave de decisin del diseo del juego.)
Usaremos el GameObject Level para administrar Estados especificos del nivel y otros scripts.
El objeto GUI Skin
En Unity el sistema de GUI incluye soporte para skinning. Esto le da control total sobre la
apariencia de cada elemento de la GUI. Construir su propio contenido de la GUI Skin le permite
cambiar la forma de un botn, su imagen, su fuente, sus colores y hacer lo mismo a todos los
elemento GUI, desde cajas de entrada de texto a travs de barras de desplazamiento, e incluso
ventanas completas.
Ya que nuestra GUI de juego se basa por completo en torno a imgenes grficas, vamos a
construir el HUD usando la funcion GUI.Label (). Sin embargo, necesitamos utilizar un tipo de
letra personalizado para nuestro HUD, con el fin de mostrar las latas de combustible restantes y
las vidas.

El asset GUISkin define el 'look' de una GUI de Unity, tanto como un archivo CSS define el aspecto
de un sitio web. El objeto es necesario si es necesario cambiar las funciones que estan por
defecto. Cuando cambiamos el tipo de letra, tenemos que incluir una GUISkin en nuestra escena.
Utilice el comando de men Assets para crear un nuevo objeto GUI Skin. Este aparecer
en el panel de proyectos y contiene los datos de la GUI Skin que viene por defecto en Unity.
Cambie el nombre del nuevo objeto GUI Skin a LerpzTutorialSkin.

37

Vamos a utilizar el tipo de letra denominada "Fluoride", para nuestro juego. Este es el
nico cambio que estamos haciendo al skin por defecto.
Arrastre el tipo de letra Fluoride en el campo Font del nuevo GUI Skin:

GUI Skin, estableciendo el tipo de letra.



El objeto de GUI Skin no se aade al panel de jerarqua, sino que referenciamos directamente el
GUI Skin en nuestro script GameHUD. Junto con la GUI Skin, el script GameHUD tambin
necesita que le digan cuales assets utilizar para construir la pantalla GUI. Estos incluyen
el asset GUIHealthRing.

La imagen GUIHealthRing

NOTA: Usted puede haber notado una serie de advertencias por parte de Unity sobre las imgenes
de que no son una "potencia de dos" de tamao. Muchas tarjetas grficas prefieren que las imgenes
tengan tamaos en potencias de dos, independientemente de la cantidad de los datos reales de la
imagen, ya que esto hace que los clculos subyacentes sean mas rapidos de realizar. Las GUIs rara
vez necesitan este nivel de optimizacin y los assets que estamos usando por lo tanto no estan
optimizados. Si desea averiguar si las dimensiones de una imagen son potencias de dos,
simplemente ponga la imagen en la ventana y le permitir saber si necesita dicha optimizacion.

Esta imagen se utiliza para mostrar informacin de salud Lerpz. El espacio a la derecha de Lerpz
muestra la imagen de sus vidas restantes, mientras que el crculo a la izquierda se utiliza para
mostrar un grfico de su salud restante. El grfico se crea simplemente con la superposicin de
la imagen correcta de un conjunto de seis texturas 2D, llamado healthPie1 hasta healthPie6.
La imagen healthPie5 se muestra a continuacin:

38

La imagen healthPie5
NOTA Estas imgenes incluyen los canales alfa para definir la transparencia y la translucidez.

Usando imgenes separadas, nos permite dibujar la imagen correspondiente al estado de salud
actual de Lerpz.
El segundo elemento de la GUI muestra el estado de la celda de combustible, la imagen es
GUIFuelCell:


La imagen GUIFuelCell

Esto se muestra en la esquina inferior derecha de la pantalla de juego y mostrar las celdas de
combustible pendientes por recuperar antes de que el nivel est desbloqueado.

Aadir el script GameHUD al GameObject Level.
Haga clic en el GameObject Level para seleccionarlo y ver el Inspector. Usted debe
ver el componente de entrada del HUD del juego (Script).
Aada las imagenes GUIHealthRing y GUIFuelCell al script GameHUD.
Abra la entrada de Imgenes de Health Pie.
Health Pie Images es un arreglo. Por el momento, Unity no sabe lo grande que debe ser, por lo
que se ha fijado en cero. Tenemos seis imgenes de pastel de salud para poner en este arreglo,
por lo que necesitamos cambiar este valor.
Haga clic en el "0" al lado de Tamao. Cambielo a "6". Ahora debe ver seis elementos vacios,
con nombres del elemento 0 al elemento 5.
Abra la carpeta GUI assets en el panel de proyectos para revelar las imgenes de la salud de
pastel. Hay seis de ellas, numeradas del 1 al 6.
Las computadoras cuentan desde cero, por lo que healthPie1 tiene que ir en el elemento 0.
HealthPie2 tiene que ir en el elemento 1 ... y as sucesivamente. Arrastre las imgenes en sus
correspondientes variables.
Por ltimo agregue el GUI Skin LerpzTutorialSkin en la ranura vaca Gui Skin. Los ajustes
de deben ver asi:

39

Ajustes de script GameHUD.


Si ejecuta el juego ahora, debera ver el HUD que aparece sobre el rea de juego:

El HUD dentro del juego

Independencia en la Resolucin .


GUI.matrix = Matrix4x4.TRS (Vector3.zero, Quaternion.identity, Vector3
(Screen.width / 1920.0, Screen.height / 1200.0, 1));



Un problema con la interfaz grfica de usuario es su tamao. La captura de pantalla de arriba es de un
iMac de 24 pulgadas con con una resolucin de 1920 x 1200.
Es evidente que necesitamos escalar nuestro HUD dinmicamente de acuerdo con el tamao de pantalla
actual y resolucin, as que cmo podemos lograr esto?
Unity incluye soporte para una matriz de transformacin. Esta matriz se aplica a todos los elementos de
la GUI antes de su representacin, para que puedan transformarse, rotarse o escalarse en cualquier
combinacin de forma dinmica.

La lnea de codigo, del script GameHUD, muestra cmo:
Si usted va a la vista de juego, desactiva la opcion "Maximize en Play" y configura la proporcion de la
pantalla a 4:3, usted ver que la interfaz grfica de usuario se reescala para encajar.
Si quisiramos, podramos tener nuestro HUD girara o se volteara boca abajo. Para los mens de juego,
pantallas de alta puntuacin y otros, esta es una caracterstica til para tener y la vamos a utilizar para
nuestras secuencias cuando se complete el nivel.

40

El men de Inicio
Cada juego necesita un men de inicio. Esto se muestra cuando se inicia el juego y permite que el
Jugador seleccione diferentes opciones, cargar una partida guardada y, lo ms importante,
comenzar a jugar el juego. En esta seccin, vamos a construir un men de inicio desde cero.

NOTA pantallas de Splash y los mens son escenas de Unity. As, un nivel de juego suele ser una
escena, pero una escena no es siempre un nivel de juego. Utilizamos scripts en una Escena para
cargar y ejecutar otras escenas que las unen entre s.

Para el men de inicio, vamos a necesitar:
Dos botones GUI text: "Play" y "Salir".
El nombre del juego. Esto se hizo utilizando una tipografa personalizada.
Algo de msica adecuada.
Algun tipo de fondo.
En otras palabras, algo como esto:

El men de Inicio.


Configuracin de la escena
El primer paso es crear una nueva escena vaca.
Escriba CMD + N en Mac o Ctrl + N en la PC, para crear una, a continuacin, CMD + S o Ctrl +
S para guardarla.
Nombrela StartMenu. Unity aadir automticamente una cmara a la escena para
nosotros, pero no hay nada para ver en este momento.
Ahora vamos a utilizar el sistema de GUI para construir un men:
Ir al panel de proyecto y crear un archivo JavaScript en blanco.
Cambiarle el nombre por StartMenuGUI y abrirlo en el editor.

41

En primer lugar, vamos a aadir una directiva de script de Unity . Las directivas son comandos
que proporcionan informacin a Unity o instrucciones adicionales acerca del script. Estos
comandos no son parte de Javascript, como tal, sino que estan destinados a Unity. Usted puede
encontrar el cdigo de script completo en la seccin de apndice.

En este caso, queremos que Unity ejecute nuestro script dentro del editor, de modo que podemos
ver los resultados de inmediato sin tener que parar y volver a ejecutar el proyecto cada vez:
// Make the script also execute in edit mode
@script ExecuteInEditMode()

Necesitamos un enlace al asset LerpzTutorialSkin, por lo que la primera lnea de cdigo ser
esta:
var gSkin : GUISkin;

Vamos a necesitar un objeto texture2D para el fondo. (Vamos a poner la imagen de fondo
Aqu en el inspector)
var backdrop : Texture2D; // our backdrop image goes in here.

Tambin queremos mostrar un mensaje de "Cargando ..." cuando el jugador hace clic en el boton
"Play" botn, por lo que necesitaremos una bandera para manejar esto:
private var isLoading = false; // if true, we'll display the "Loading..." message.

Por ltimo, llegamos a la funcion OnGUI :


function OnGUI()
{
if (gSkin)
GUI.skin = gSkin;
else
Debug.Log("StartMenuGUI: GUI Skin object missing!");


El cdigo anterior comprueba si tenemos un enlace a un objeto GUI Skin vlido . La funcion
debug.log () retorna un mensaje de error si no. (Es una buena costumbre revisar enlaces externos
datos de esta forma ya que hace mucho ms fcil el trabajo de depuracin.)

El fondo.

La imagen de fondo es un elemento GUI.Label configurado para utilizar la imagen de fondo como
el fondo del elemento. No tiene texto y se establece siempre en el tamao de nuestra pantalla, por
lo que llena la pantalla.

42

var backgroundStyle : GUIStyle = new GUIStyle();


backgroundStyle.normal.background = backdrop;
GUI.Label ( Rect( (Screen.width - (Screen.height * 2)) * 0.75, 0, Screen.height * 2,
Screen.height), "", backgroundStyle);


En primer lugar, definimos un objeto GUIStyle nuevo, que vamos a utilizar para reemplazar la
GUI por defecto. En este caso, slo estamos cambiando el elemento "normal.background" para
utilizar nuestra imagen de fondo.

La funcion GUI.Label () toma un objeto Rect. Las Dimensiones de este rectngulo se derivan
de las dimensiones de la pantalla, de modo que la imagen siempre llene la pantalla. La proporcion
de la imagen tambin se tiene en cuenta, de modo que la imagen es recortada y / o re-escalada
para encajar sin aadir distorsin.
Ahora llegamos al texto del ttulo. Antes de escribir el script para esto, tenemos que echar otro
vistazo a nuestra GUI Skin y hacer una pequea modificacin a la misma:

Nuestro men utiliza la fuente predeterminada que se define en el asset LerpzTutorialSkin. Por
el momento, el estilo predeterminado para mostrar el texto es inadecuado para un el ttulo
principal del juego, por lo que aadiremos un nuevo GUI Style personalizado al Skin, llamado
mainMenuTitle:
Ir al panel de proyecto y haga clic en LerpzTutorialSkin para abrir sus detalles en
el Inspector.
Ahora vamos a aadir un estilo personalizado a nuestro GUI Skin:

Definiendo un estilo personalizado en nuestro objeto GUISkin.

43

Abra "Custom Styles" y asegurese que "Size" est ajustado a "1". Usted debe ver una entrada
"Elemento 0".
Abra "Elemento 0" y establezca sus elementos como se muestra arriba.

Por ltimo, ahora podemos aadir el resto del cdigo a nuestro script:
GUI.Label ( Rect( (Screen.width/2)-197, 50, 400, 100), "Lerpz Escapes",
"mainMenuTitle");

Nota: los nombres de GUI Style no son sensibles a mayusculas cuando se intenta acceder a ellos a
travs de scripts. Escribir "mainMenuStyle" es lo mismo que "mainmenustyle".

Los botones.
Ahora tenemos que modificar las propiedades del GUI Button del objeto LerpzTutorialSkin para
producir un botn ms interesante.

Estamos utilizando el mismo objeto GUI Skin para este men y para el HUD del juego. Para el
HUD, slo la fuente debe ser cambiada. Sin embargo, para los botones del men Inicio, tambin
tenemos que tener una imagen grfica detrs del botn de texto. El diseo del botn
predeterminado no se ajusta al estilo visual del juego, as que tenemos que cambiarlo.
Haga clic en el asset LerpzTutorialSkin en el panel de proyectos para abrir sus detalles en el
Inspector. Cambie a la configuracin que se muestra a continuacin. Ignore los otros tipos de GUI
element, que no vamos a utilizarlos:

Configuracin de las imgenes de botn en el objeto de GUISkin LerpzTutorialSkin.

44

Ahora vamos a agregar el botn "Play":



if (GUI.Button( Rect( (Screen.width/2)-70, Screen.height - 160, 140, 70), "Play"))
{
isLoading = true;
Application.LoadLevel("TheGame"); // load the game level.
}


Lo anterior es todo lo que se necesita para hacer y manejar el botn "Play". El cdigo, tanto para
el rendering y la gestin de eventos esta en el mismo lugar, por lo que es ms fcil de mantener.
La funcion GUI.Button () toma un objeto Rect para definir la posicin del botn y su tamao,
seguido de la etiqueta de texto.
Si el usuario hace clic en este botn, el botn de la funcin devuelve verdadero, por lo que puede
cargar el nivel de juego.
Hemos establecido isLoading para que sepamos que debemos mostrar el texto "Cargando ...",
luego decirle a Unity que cargue el nivel de juego.
El botn "Quit" se maneja de forma similar, pero con una prueba para garantizar que esto se
ejecuta como ejecutable independiente (o en el editor de Unity).
var isWebPlayer = (Application.platform == RuntimePlatform.OSXWebPlayer ||
Application.platform == RuntimePlatform.WindowsWebPlayer);
if (!isWebPlayer)
{
if (GUI.Button( Rect( (Screen.width/2)-70, Screen.height - 80, 140, 70), "Quit"))
Application.Quit();
}


El paso final es el texto "Cargando ...", el cual es mostrado cuando la escena esta cargando, esto es
mas notable cuando el juego es streamed y es ejecutado en Web Player.

if (isLoading)
GUI.Label ( Rect( (Screen.width/2)-110, (Screen.height / 2) - 60, 400, 70),
"Loading...", "mainMenuTitle");
}

Botn Salir.
El botn "Salir" slo funcionar si se est ejecutando el juego como una aplicacin independiente. Si
es que se est reproduciendo en un WebPlayer, en un Widget de Dashboard o dentro del Editor de
Unity, el botn "Salir" no har nada.



El siguiente paso es aadir algo de msica.

45

Ir al panel de proyecto, abra la carpeta Sounds y arrastre archivo de audio StartMenu al


objeto MainCamera en el panel de la Jerarqua. Esto aadir un Componente de clip de audio.
Haga clic en el objeto MainCamera y en el Inspector, busque el nuevo componente de clip
de audio. Active las casillas de Play On Awake y Loop.
Aadir el script StartMenuGUI a MainCamera.
Por ltimo, dentro del componente StartMenuGUI, establecer GSkin a LerpzTutorialSkin
y Backdrop a StartSplashScreen.
Si juega ahora en la escena, debera ver algo como esto en la vista de juego, acompaado de un
corto loop con una meloda orquestal:

El men Inicio en accin.

SUGERENCIA La msica fue creada usando loops de Apple Loops Orchestral Jam de Apple y
arregladas en GarageBand. Para usuarios de PC recomendamos el uso de Audacity.



Game Over

El pantallazo de Game Over se muestra cuando el jugador ha terminado su juego o no ha logrado


el reto. A diferencia del men Inicio, esta escena no tiene botones: slo muestra un mensaje de
"Game Over" ms un teln de fondo, mientras que suena un jingle corto. Una vez que el jingle se
ha completado, o si el usuario hace clic en el Mouse, se carga automticamente el "Men de
Inicio" de la escena.
En primer lugar, crear una nueva escena y darle el nombre "GameOver"
Arrastre y suelte los archivos de audio en el GameOverJingle a la camara Main Camera
y configurarlo como se muestra:

46

Los ajustes de GameOverJingle.

No necesitamos aadir nada ms a la escena con el Editor: la cmara por defecto solo ser
suficiente.
El siguiente paso es construir el script (Usted puede encontrar el cdigo de script completo en la
seccin de apndice):
Crear un asset Javascript nuevo y darle el nombre "GameOverGUI"
Abrirlo en el editor y aadir el cdigo se describe a continuacin:
Al igual que con el men Inicio, queremos ser capaces de ver nuestra interfaz grfica de usuario
en el editor de Unity, incluso , cuando el proyecto no se ejecuta, por lo que debemos aadir lo
siguiente:

@script ExecuteInEditMode()

Para el men de inicio, hemos utilizado el asset GUI Skin LerpzTutorialSkin. La GUI Skin define
un montn de estilos de GUI y nos permite aplicarlos a una interfaz grfica de usuario al por
mayor.

Una tcnica alternativa es definir los objetos individuales de estilo GUI directamente. Haremos
esto para el script Game Over definiendo tres variables GUIStyle que luego podemos poner en el
Inspector, junto con dos variables que definen la escala de los elementos de texto:
var background : GUIStyle;
var gameOverText : GUIStyle;
var gameOverShadow : GUIStyle;



Vamos a establecer estos objetos de GUI Style en el Inspector dentro de poco.

A continuacin, debemos definir factor de escala del texto para nuestro mensaje "Game Over", ya
que se hizo ms grande que el tamao de fuente por defecto.

47

Vamos a dibujar este mensaje dos veces, en dos colores diferentes, para dar un efecto de sombra,
por lo que vamos a definir dos variables:

var gameOverScale = 1.5;


var gameOverShadowScale = 1.5;


Por fin llegamos a la funcion OnGUI ():
function OnGUI()
{


En primer lugar, el fondo, se re-escala de forma similar a la utilizada en el men de Inicio:

GUI.Label ( Rect( (Screen.width - (Screen.height * 2)) * 0.75, 0, Screen.height * 2,


Screen.height), "", background);


La siguiente tarea es elaborar la versin de la sombra del mensaje "Game Over". Tenemos que
escalar el texto y centrarlo en la pantalla. Afortunadamente, podemos utilizar la matrix de
transformacion predeterminada para controlar la ampliacin.

Para asegurar el texto aparece color oscuro, pasamos el GUI Style gameOverShadow a la funcin
de GUI.Label.

GUI.matrix = Matrix4x4.TRS(Vector3(0, 0, 0), Quaternion.identity, Vector3.one *


gameOverShadowScale);
GUI.Label ( Rect( (Screen.width / (2 * gameOverShadowScale)) - 150,
(Screen.height / (2 * gameOverShadowScale)) - 40, 300, 100), "Game Over",
gameOverShadow);


Por ltimo, ponemos el mismo texto de nuevo, pero en un color ms claro. Unity siempre
renderizar estos elementos en el orden en que aparecen en el cdigo, por lo que este texto
aparecer en la parte superior de la sombra. Aparte de usar el factor de escala gameOverScale y
el GUI Style gameOverText, no hay otra diferencia.

GUI.matrix = Matrix4x4.TRS(Vector3(0, 0, 0), Quaternion.identity, Vector3.one *
gameOverScale);
GUI.Label ( Rect( (Screen.width / (2 * gameOverScale)) - 150, (Screen.height / (2 *
gameOverScale)) - 40, 300, 100), "Game Over", gameOverText);
}

Guarde el archivo y pongalo en Main Camera.


Haga clic en Main Camera para ponerlo en el Inspector. Es hora de establecer las
variables ...

48

En primer lugar, el fondo de GUI Style. Esto slo necesita la imagen


"GameOverSplashScreen" en la ranura Normal->Background, como se muestra a continuacin:

Los Ajustes para el Background.

Luego, vamos a establecer texto del GUI Style Game Over como se muestra en la imagen
siguiente. (Como de costumbre, deje los otros ajustes como estn.)

La configuracion para el Game Over Text.


A continuacin, establezca la escala del Game Over a 1,69.

49

Ahora los ajustes de Game Over Shadow GUI:

La configuracion para el Game Over Shadow GUI.

Por ltimo, establezca la escala del Game Over Shadow Escala a 1,61.
Ahora debera ver la GUI aparecer en la vista de juego, como se muestra a continuacin:

El pantallazo de Game Over .

50


El toque final consiste en aadir un segundo script a la Main Camera que comprueba si la msica
ha terminado de sonar y, de ser as, carga la escena del men Inicio.
Crear un nuevo asset Javascript Script. Nombre que GameOverScript.
Abra el script en el editor y agregar el siguiente cdigo (Usted puede encontrar el cdigo del
script en la seccin del apndice):
function LateUpdate ()
{
if (!audio.isPlaying || Input.anyKeyDown)
Application.LoadLevel("StartMenu");
}


Este cdigo comprueba si el audio ha terminado de sonar, o si el jugador ha presionado una tecla
antes de cargar la escena "StartMenu".
Aadir GameOverScript a la Main Camera y listo: terminamos el GUI!

51

Adversarios
Ningn juego est completo sin adversarios.
En este captulo, se aaden los
enemigos de Lerpz para luchar.

Contendientes

Estos dos elementos son fundamentales para cualquier juego, as que necesitamos algo para
mantener a Lerpz alerta. El trabajo del diseador del juego es lanzar los obstculos en el camino
del jugador, pero de una forma que sean superables. Lerpz se enfrenta a dos adversarios: los
guardias robot y las barreras lser.

Las Trampas de lser

Las Trampas lser se encuentra en los pasajes de lser y lastimaran a nuestro jugador si llega a
tocar el haz de luz. La siguiente imagen muestra dos de ellos. Los ubicaremos en los pasadizos
cortos a cada lado de la arena, en el otro extremo del nivel de la crcel.

Lerpz se enfrenta a las trampas lser.


Los lseres suben y bajan. Si el jugador trata de pasar a travs de uno de ellos, va a perder algo
de su salud.

52

Implementando las Trampas lser


Cada trampa lser es un haz de luz que sube y baja en un mismo plano vertical. Si Lerpz (o un
enemigo) llega a tocar el rayo, va a causar daos.

El rayo lser es producido por un componente de Line Renderer que figura en su propio
GameObject. Su movimiento y la lgica que lo controla esta totalmente contenida en el Script
LaserTrap. As que vamos a construir nuestra primer trampa lser:

Cree un GameObject vaco.
Cambie el nombre a "Laser"
Agregue un componente Line Renderer (Component->Miscellaneous->Line Renderer).
NOTA No trate de colocar el lser todava! Usted tendr que desactivar la casilla de
"Use World Space" primero.
Aada el script LaserTrap.
Ajuste la configuracin del componentes Line Renderer como se muestra. (El material del
laser se encuentra en: Particles->Sources->Materials)

Configuracin de Line Renderer.


Coloque el objeto resultante en los tneles de lser. (Estos son los pasillos cubiertos en
ambos lados de la arena)
Aada un GameObject Light Point como un hijo a nuestro objeto lser.
Establezca el Point Light como se muestra:

53

Ajustes de luz del Point Light de la trampa Lser.

La luz acta como la fuente de luz del lser y sube y baja con el lser. Esto da la ilusin de que el
rayo lser, elaborado por el Line Renderer, est emitiendo la luz.

El componente de Line Renderer


El renderizador de lnea, como su nombre indica, traza lneas en un espacio 3D dentro de
nuestra escena. Contiene un arreglo que define la serie de puntos a travs de los cuales la lnea
sera
dibujada. La lnea en s es dibujada usando la misma tcnica que el componente Trail Renderer,
lo que es ideal para el lser, rayos y otros efectos similares.

A continuacin, establezca las propiedades del script LaserTrap, como se muestra:

Las propiedades del script LaserTrap.


Por ltimo, duplique (CMD + D en Mac, o Ctrl + D), (o cree un prefab) de nuestro lser y
ponga algunos en el nivel como mejor le parezca. Se sugiere colocar cuatro en total, dos en cada
uno de los tneles.

54

Sintase libre de variar las propiedades del script LaserTrap y experimente hasta obtener un
resultado con el que este satisfecho.


El Script Laser Trap

La clave de la trampa lser es el script LaserTrap, as que vamos a echar un vistazo ms de cerca
...

Descripcin general

La trampa lser es un componente Line Renderer que se mueve hacia arriba y hacia abajo gracias
al script. Este mismo script tambien controla las colisiones y dispara los efectos visuales
necesarios
En primer lugar, definamos algunas propiedades bsicas de nuestra trampa lser:
height (altura) define la amplitud de la oscilacin, dictando hasta qu punto por encima y por
debajo del punto de partida el rayo lser viajara;
speed (velocidad) define qu tan rpido se mueve el haz;
timingOffset nos permite configurar cada objeto de trampa lser para que comience en un
punto diferente en su ciclo de oscilacin;
laserWidth define el ancho del haz de lser desde un extremo a otro;
damage (daos) define el dao que el jugador sufrir si se encuentra con el haz.
hitEffect, puede ser utilizado para conectarlo a un GameObject cualquiera, que ser instanciado
cuando algo le pegue al lser. Esto es ms flexible que codificando el efecto en el objeto Laser
Trap y hace ms fcil la reutilizacin de este asset en otros proyectos.
El script define dos funciones:
La funcion de Start() inicializa el componente Line Renderer, almacenando su ubicacin inicial
(en el eje Y) para ms tarde, y estableciendo de segundo vrtice del Line Renderer para que
coincida con la posicin definida por laserWidth. Esto nos permite ajustar fcilmente la longitud
del haz a que coincida con el ancho del corredor.
Ahora llegamos a la funcion principal Update (). Aqu es donde las cosas interesantes suceden.
En primer lugar, tenemos el movimiento del rayo lser para calcular. Nos limitamos a usar la
funcion Mathf.Sin (). Cogemos la hora actual usando Time.time, (que devuelve el tiempo, en
segundos, desde que el juego comenz), se multiplica por la velocidad de animacin deseada y se
aade en el valor timingOffset. Esto nos da nuestra posicin a lo largo de la curva sinusoidal. Por
ltimo, la modulamos por nuestra altura deseada y usamos el resultado como un offset de
nuestra lnea base.
El siguiente paso es revisar las colisiones. El script lanza un rayo a lo largo de la ruta del laser y
comprueba si golpea cualquier GameObject que tenga un componente Collider unido a ellos.

Si chocamos con algo, revisamos si se trata de un jugador o un enemigo y, en caso afirmativo, se
enva el mensaje "ApplyDamage". Al mismo tiempo, tambin se instancia el GameObject hitEffect
para que realice su accion. Esta es el GameObject LaserHit, que produce un efecto de explosin
de energa:

55

Ser golpeado por un lser es malo para su salud.


Si se juega el tutorial, usted debe encontrar que Lerpz pierde un punto de salud si toca el haz del
lser.



Los Guardias Robot

Los contrincantes mviles son guardias robot, colocados estratgicamente en todo el nivel.
Cundo Lerpz esta dentro de su rango, estos guardias le seguiran y trataran de hacerle dao.

Un guardia robot.

Los enemigos de Lerpz en el juego son los guardias robot. Podemos determinar que:
Los Robots tendrn una IA bastante rudimentaria.
Los robots sueltan items cuando son derribados.
Robots reaparecern cuando el jugador no puede verlos.

Buscar y destruir
La mayora de la IA del juego se centra principalmente en el modelado de comportamiento y no
en la inteligencia como tal. Nuestros robots reaccionan en formas predecibles a la presencia del
jugador. Se les da una pauta para buscar y esto hace ms fcil el aprender a vencer a los robots.
Los guardias robot por lo tanto tienen un patrn de comportamiento muy simple y esto se refleja
en el script de IA, EnemyPoliceGuy.

56

Idle -- En este modo, los guardias se quedan quietos, en silencio y esperan a que un intruso entre
en su rango.
Threaten -- Si un intruso entra a una determinada distancia del guardia, el sale del de modo de
espera y anuncia sus intenciones, girando su bastn de mando de una "forma amenazante".
Seek & Destroy Una vez activados, los guardias robots atacan dentro de un rango, la Guardia
tratar de golpear con su bastn de mando.

Struck Si el jugador golpea al guardia robot, se activa esta animacin. ( "Gothit" en el modelo y
script.)
Si el jugador se mueve fuera del rango de exploracin del robot, el robot se volver al modo idle.
Los estados antes mencionados son manejados por la secuencia de comandos EnemyPoliceGuy,
que tambin se ocupa del cambio entre las secuencias de animacin.

Adicin de los Guardias Robot


Tenemos unos cuantos de estos robots en nuestro nivel, as que ...

Abra el panel de proyectos y busque el Prefab Copper dentro de la carpeta Enemies.
Busque un lugar adecuado en el nivel y los Prefabs en la escena, asegurndose de que est en
el suelo. (El Prefab incluye un componente Character Controller. Asegrese de que el extremo
inferior de la cpsula del Collider toque el suelo, o este ligeramente por encima de este.)

Las reas con cercas o que son principalmente cerradas son las mejores ya que esto hace que que
sea menos probable que el robot se caiga del escenario.
Si prueba el juego ahora, podr ver al robot ejecutando la animacion de inactividad. Ahora
tenemos que aadir algunos scripts para hacer que estos robots hagan algo ms interesante.
Hay dos scrips para el robot y se adicionarn directamente al Prefab original:
Seleccione el Prefab Copper para ponerlo en el Inspector.
Arrastre los scripts EnemyDamage y EnemyPoliceGuy a nivel del Character Controller
en el Inspector.
Si an no lo ha hecho, arrastre el script ThirdPersonCharacterAttack al objeto Player. Este
se encarga del movimiento de puo del personaje.
(Lerpz no golpeara los robots sin l!)
Si usted juega el juego ahora, el robot debe reaccionar si se acerca demasiado a este.

Blue Sparks of Death

Si el jugador vence al robot y lo derriba, una secuencia de muerte es inicializada. Queremos que el
robot caiga en una lluvia de chispas y se quede all hasta que el jugador este fuera del rango antes
de que se reestablezca.
Adems, cuando el robot se muere, queremos que deje caer items.
En lugar de un nmero an mayor de scripts, los datos de animacin y otros elementos a nuestro
Prefab actual, vamos a crear uno nuevo slo para la las chispas.

57

Divide & Conquista


Cuando nuestro robot muere, lo necesitamos que deje de reaccionar al jugador y suspenda los
scripts. Esto no es tan sencillo como parece: los scripts tienden a correr de forma independiente,
por lo que se necesita enviar mensajes y mantener una variable de estado dedicada en cada
script que debe ser revisada durante cada ciclo.

Es mucho ms fcil simplemente cambiar nuestro Prefab robot por otro doble, construido
especficamente para el propsito de caerse, con adecuados efectos especiales, y script para
arrojar hasta dos items al azar.

Un robot de guardia derribado

La imagen de arriba muestra esta sustitucin de Prefab en accin.



El script que ejecuta esto es EnemyDamage, Puede implementar todo lo anterior mediante la
seleccin del gameobject y la alteracin de los valores a los componentes. Le animamos a probar
diferentes variaciones.

Items que sueltan los enemigos y Fsica


Los items que aparecen cuando un robot es derrotado son Prefabricados derivados de los originales
que creamos antes, pero con efectos de partculas adicionales y un script, DroppableMover, que se
ocupa de movimiento y colisiones.

El script es necesario porque el Collider est configurado como un trigger para la recoleccin y por lo
tanto es ignorado por el motor de fsica. Al item se le da una velocidad inicial y el script utiliza casting
raycasting -- una lnea imaginaria hacia abajo para comprobar si el item toca una superficie. Cuando
lo hace, el script es simplemente desactivado. (Este cdigo tiene un inconveniente: slo comprueba
hacia abajo, en el eje Y. As pues, el item puede terminar incrustado a medias en una pared.)

Nacimiento y optimizacin

El nacimiento de enemigos cuando estn dentro de una distancia determinada del jugador es un
viejo truco que data de los primeros juegos de vdeo, asi, se elimina la necesidad de almacenar el
estado de cada enemigo. Tambin podemos usar este truco para reducir la carga en el
procesador. Simplemente borrando cada robot si no es visible para el jugador, se puede evitar la
utilizacin de scripts e IA innecesaria.

58

Empecemos:
crear un GameObject vaco en el nivel superior del panel de la Jerarqua.
Cambiarle el nombre por CopperSpawn.
Arrastre el script EnemyRespawn sobre el objeto.
Posicione nuestro objeto CopperSpawn en algn lugar donde le gustara ver a un robot
aparecer. Ajustar la configuracin del objeto, como se muestra.

Ajustes CopperSpawn.

Vamos a necesitar varios de estos Game Objects, as que vamos a crear un GameObject parent
Para que los CopperSpawn sean sus hijos ...

Cree un GameObject vaco en el nivel superior del panel de la Jerarqua.
Cambie el nombre a Enemies.
Hacer los GameObjects CopperSpawn hijos de Enemies.
Ahora, construya un prefab con nuestro GameObject CopperSpawn. Ponga instancias de
estos en todo el nivel.

Cmo funciona.
Los GameObjects CopperSpawn contienen un script que comprueba si el jugador ha llegado
Al rango previsto y, si es as, crea una instancia del Prefab Copper. Cuando el jugador
camina fuera de este rango, nuestro script automaticamente eliminara el robot de la escena.

El script que hace esto es EnemyRespawn. Las dos funciones principales son:
Start () slo guarda en cach un enlace al transform del Game Object del jugador veremos ms
adelante.
Update () En primer lugar comprueba si el jugador esta en el rea y crea una instancia del robot
si es as. Si el jugador acaba de dejar la zona, se destruye el robot prefabricado.

NOTA El icono de imagen se encuentra actualmente almacenado en la carpeta [ProjectPath] /
Assets / Gizmos

59

El OnDrawGizmos () la funcin que muestra el icono del robot.

El cdigo del Gizmo para el icono se muestra a continuacin:


function OnDrawGizmos ()
{
Gizmos.color = Color(1, 1, 1, 1);
Gizmos.DrawIcon(transform.position, gizmoName + ".psd");
}



La funcion OnDrawGizmos () es llamada cada vez que la interfaz grafica del editor de Unity se
actualiza o se refresca, por lo que el icono ser siempre visible. Para que esta funcion sepa que
imagen usar para el icono debemos
Asignarle a la variable Gizmo Name de el script el nombre de la imagen el cual es Copper.

Por el contrario, la funcion OnDrawGizmosSelected () es llamada por el editor de Unity slo


cuando se selecciona el objeto. Mientras est seleccionado, ser llamado cada vez que el GUI de el
editor de Unity se actualiza o se refresca.
En este ejemplo, la funcin dibuja una esfera utilizando spawnRange para definir su radio,
proporcionando as una representacin visual de la zona en la que el robot enemigo ser
instanciado; cuando el jugador se mueve fuera de esta esfera, el robot sera destruido de forma
automtica .
function OnDrawGizmosSelected ()
{
Gizmos.color = Color(0, 1, 1);
Gizmos.DrawWireSphere(transform.position, spawnRange);
}

60

La funcion OnDrawGizmosSelected () muestra la esfera definida por la variable Spawn Range.


Optimizaciones Alternas
Adems de la tcnica anterior, Unity tambin ofrece las funciones OnBecameVisible () y
OnBecameInvisible (). Sin embargo, a diferencia de nuestra tcnica de reaparicin, las funciones
anteriores se basan en la orientacin de la cmara y otras opciones en lugar de los del objeto del
jugador. Esto significa que usted ver OnBecameInvisible () llamada en un objeto, simplemente
porque la cmara a dejado de mirar hacia este y ya no es visible para la misma. Esto puede no ser lo
que que usted requiere.

Otra tcnica, an ms ptima que la nuestra, es utilizar componentes como Collider de manera de
Trigger en lugar de utilizar cdigo de script para verificar la ubicacin del jugador. Unity
proporciona las funciones OnTriggerEnter () y OnTriggerExit () para este fin. Sin embargo, esto
podra no ser factible si quieres que tus scripts de reaparicion esten conectados a un objeto que
debe utilizar un collider para otros fines.

61

Audio y Toques Finales


En este captulo, agregaremos efectos de sonido


y dos cinemas a nuestro juego.










Introduccin

Cuando usted compra un CD o ve una pelcula, el sonido que se oye siempre ha pasado a travs
de una serie de etapas, la ltima de las cuales es conocido como el masterizado. El masterizado es
el arte de escuchar el audio en su conjunto y ajustar los niveles de volumen, filtrado las
frecuencias y cualquier nmero de otros trucos tcnicos para hacer la mezcla final de sonido
suene lo mejor posible. A veces el proceso corrige de errores evidentes en proceso un nmero
musical o banda sonora, como un instrumento que est demasiado alto o suena demasiado
brusco. En otras ocasiones, el proceso slo se utiliza para garantizar la banda sonora suene bien
atravez de el altavoz de un televisor barato sin comprometer el sonido que se escucha en un
sistema de sonido de cine en casa o home theater.

Los juegos no son diferentes: una vez que el gameplay basico est en su lugar, tiene sentido
gastar algo de tiempo modificandolo y ajustandolo hasta que sea tan bueno como sea posible.

Audio
La finalizacin y masterizada de audio para juegos es una tarea dificil. Los juegos son
interactivos a diferencia de otras formas convencionales de entretenimiento las cuales son
pasivas y lineales. Esto significa que usted necesita considerar cmo los assets individuales de
audio en el proyecto van a interactuar entre si, y si es necesario, realizar algunas tareas de
masterizacin y mezcla usted mismo. Esencialmente el masterizado es una tarea en tiempo real
que debe ser manejada dentro de la lgica del juego en s.
En un mundo ideal, todos los desarrolladores tendrian acceso a su propio ingeniero de audio,
pero este es el mundo real, y para muchos proyectos de pequea escala esto seria simplemente
imposible.
La consideracin ms importante es asegurar cada sonido en el proyecto sea coherente con
todos sus compaeros. Este es un proceso subjetivo, como algunas personas les gusta mucho el
bajo, mientras que otros prefieren sonidos de alta frecuencia, as que es una buena idea usar la
retroalimentacion de testes para obtener una mezcla de puntos de vista objetivos sobre los
sonidos de su proyecto.

Idealmente, usted necesita utilizar el audio de una sola fuente, mezclado por el mismo par de
oidos, por lo que usted consigue un sonido consistente. En el caso de este tutorial se deben
utilizar un montn de diferentes fuentes de audio, hay que estar preparado para una gran
cantidad de retoques en la configuracin para lograr que los sonidos suenen bien dentro de la
mezcla. Un efecto de sonido sobresaturado(muy duro) ser muy evidente para los jugadores y

62

podra llegar a ser irritante si se escucha con frecuencia. Pruebe el juego con frecuencia y este listo
para separar tiempo para realizar estos ajustes.


Notas
Unity tiene una interfaz bastante simple para el audio, pero hay algunas cosas importantes para
tener en cuenta:
Asegrese de que los efectos de audio tengan niveles similares. Esto hace que los niveles de
volumen y la atenuacin sean mucho ms consistentes. La normalizacin puede ayudar aqu, pero
tambin debe considerar cmo sus sonidos se mezclan. Demasiados efectos de sonido ruidosos
confundiran la jugador.
Utilice efectos de sonido mono si necesita posicionar el sonido de forma realista en un mundo
3D.
Comprima los efectos de audio utilizando el sistema de compresin Ogg Vorbis. (Unity puede
hacer esto por usted.)
Si el juego es para web, siempre se debe comprimir tus sonidos usando Ogg Vorbis.
Marque la casilla "Decompress on load" para sonidos cortos que se usan frecuentemente.
Utilice sonidos en stereo solo para larga piezas musicales que no necesitan ser colocadas
espacialmente dentro de la escena. Los sonidos de esta clase siempre se reproducirn tal como
son, en el volumen de audio predeterminado de el Audio Listener.

Agregando sonido a Lerpz Escapes!

Ya hemos aadido algunos pocos efectos en el juego. En este captulo vamos a aadir un poco
ms de audio a nuestro juego y completar el proceso.
Para muchos gneros de juegos, los efectos de sonido se pueden obtener a partir de fuentes
reales, o sacados de una biblioteca de efectos de sonido. Sin embargo, Lerpz Escapes! necesita
algunos efectos de sonido que no pueden obtenerse tan fcilmente. Apuntando con un micrfono
en una nave espacial que pasa o un conveniente guardia robot no es una opcin, as que
tendremos que pensar de manera creativa acerca de estos.
No vamos a agregar todos los efectos de sonido posibles para el juego en este captulo, slo lo
suficiente para demostrar las caractersticas de audio de Unity. Una vez que haya ledo este
captulo, usted ser capaz de aadir efectos de sonido adicionales por su cuenta.


La lista completa de efectos de sonido que necesita el juego es:


El jugador:
Sonidos Caminar / Correr.
Sonido de ataque.
Sonido de golpe recibido.
Sonido de muerte de personaje.
Sonido de propulsores del Jetpack.


La Guardia Robot:
Sonido de ocio.
Sonido de ataque.
Sonido de golpe recibido.
Sonidos de Muerte / Explocion;.


Items:
Sonido de cogida de pila de Combustible.
Sonido de cogida de item de salud.
Los sonidos ambientales:
Un sonido largo en loop para dar una sensacin de ambiente.
Un sonido de zumbido para las almohadillas de salto.


Cerca de la nave espacial:
Sonido de activacion.

63

Sonido de apagado.


La nave espacial:
Sonido de despegue para reproducir en el cinema.

Ya hemos agregado algunos efectos de sonido a nuestro juego, pero todava tenemos que aadir
ms de quince ms. Algunos de estos sonidos fueron tomados de el mundo real, como los pasos
del jugador y los propulsores del jetpack. Algunos de los sonidos de otros son tambien sacados
del mundo real pero reacondicionados para nuestras necesidades.
(El sonido pickupFuel, por ejemplo, es slo el sonido de una pelota de golf al ser golpeada por el
palo.)
Estos sonidos pueden encontrarsen en casi cualquier biblioteca de efectos de sonido. GarageBand
de Apple, Logic Studio 8 y Soundtrack / Soundtrack Pro incluyen este tipo de sonidos y estas
bibliotecas fueron la fuente de la mayora de los efectos de sonido en este tutorial. Muchos de
estos sonidos estan disponibles en linea, muchas veces gratis!


Sonidos de Ambiente
Nuestro juego se desarrolla en un medio ambiente por encima de las nubes con una
impresionante vista de los planetas cercanos. Este lugar fuera de este mundo necesita una
adecuada ambientacion sonora para mejorar la sensacin de inmersin en el juego.


El proyecto incluye un loop de sonido ambiental llamado sceneAtmosphere.


La muestra se agrega al objeto Near Camera en el panel de la Jerarqua.


Arrastre y suelte el efecto de sonido dentro de el objeto Near Camera. Unity creara
automaticamente un componenet Audio Source.
Ajuste su configuracin como se muestra a continuacin:

Agregar el sonido sceneAtmosphere al objeto Near Camera.


64

El componente Audio Source incluye los controles bsicos que nos permiten decir cmo Unity
maneja el efecto de sonido ya sea a travs de el Inspector o a travs de scripting.
En este caso, activamos la opcion Play On Awake para que el sonido empieze a reproducirse
automticamente. El nivel de volumen es deliberadamente bajo ya que es un sonido de ambiente
de fondo y no queremos distraer la atencin de los otros sonidos en el juego.
Echemos un rpido vistazo a lo que los valores restantes significan:


El Pitch define la rapidez con la que el sonido se reproduce , siendo 1 la velocidad normal.
El algoritmo usado es basico, similar a una grabadora; un valor de 2 aqu reproduciria la muestra
a el doble de su velocidad normal.
SUGERENCIA El ajuste de Pitch es til para efectos de sonido cortos ya que usted puede ajustar el
valor ligeramente con cada reproduccin para aadir variedad a los sonidos. Es ideal para
disparos, los lseres y los pasos y evita as la necesidad de tener que crear mltiples efectos de
sonido.


Despues estan los valores que definen el rango de volumen de el sonido. Si quisiramos que el clip
fuera inaudible cuando estamos muy lejos de su fuente, Min Volume se establece en cero.

Como su nombre indica, Max Volume es el mximo volumen del sonido. Podramos pararnos
sobre la fuente de sonido y no se escucharia mas duro que este valor.
Luego viene el Rolloff factor, que determina lo rpido que el volumen del sonido cambia relativo
a la distancia del oyente. Un valor ms pequeo significa que el sonido sera audible sobre una
distancia mayor. Esta configuracin es clave para asegurar un comportamiento foneticamente
realista en el juego.

NOTA Es importante asegurarse de sonidos en loop esten diseados para un loopeo limpio, de lo
contrario lo ms probable es que escuche un clic o pop cada vez que se reinicia la reproduccin
desde el comienzo de la muestra. La mayora de los editores de audio incluyen una funcion llamada
"Find zero crossings " para este fin.


Plataformas de salto
Cuando se construy el Prefab JumpPad, ignoramos su efecto de sonido. Ahora vamos a agregar
uno. Pero, cmo vamos a reproducirlo?
Por suerte, el script del JumpPad ya tiene soporte para un efecto de sonido. Si abre el script en el
editor, ver el cdigo de reproduccin de aqu:

...
if (audio)
{
audio.Play();
}
...


La variable de audio no parece estar definida en el script, as que dnde viene esta?

Viene de el mismo Unity. Esta es una variable de conveniencia, una entre un nmero de tales
variables, que simplemente apunta hacia el componente de Audio Source conectado a el
GameObject en el cual se encuentra el script. Como no hemos aadido uno de estos
Componentes, la variable audio ser nula, por lo que el script se salta la reproduccin.

65

Haga clic en una de las instanias de plataformas de salto en al escena para desplegar el
inspector de este GameObject.
Arrastre el efecto de sonido jumpPad hacia el inspector. (Esto crear automticamente
un componente de Audio Source.)
Aplicar el cambio a la Prefab original, as que todas nuestras plataformas de salto puedan
compartir el mismo efecto de sonido.
Experimente y ajuste la configuracin de la fuente de audio hasta que est satisfecho con el
efecto de sonido.


Items
Los items son los ms fciles de tratar. Estos efectos de sonido son pickupFuel y pickupHealth
para las cldas de combustible y items de la salud, respectivamente. La incorporacin de estos
efectos es la simplicidad misma: el script de recogida ya tiene soporte para audio, slo
necesitamos arrastrar el efecto de sonido relevante hacia el espacio correspondiente para cada tipo
de item.
La imagen de abajo muestra los detalles del Inspector para FuelCellPrefab de una de las
instancias en el nivel, con el efecto de sonido pickupFuel aadido a la variable de sonido de
recogida de el script:

Configuracin de el efectos de sonido de el prefab fuelCellPrefab.

Agregue el audio ya sea arrastrando el efecto de sonido pickupFuel hacia la variable sound,
o seleccionando el efecto de sonido directamente desde la lista de disponibles efectos de sonido
que se puede abrir haciendo clic en el pequeo tringulo a la derecha de la variable.
Establecer el sound volume a 2, para hacer que el efecto de sonido se destaque.
Aplicar el mismo proceso para el item de la Salud, utilizando el ejemplo de pickupHealth.

66

Sugerencia Puede agregar el efecto de sonido directamente a el prefab para ahorrar tiempo.

Si usted juega el juego ahora, cada item debera reproducir el sonido apropiado cuando este se
recoja.
La cerca
El campo de fuerza que rodea la nave espacial debera hacer un zumbido, ruido de efervescencia
mientras est activo.


El efecto de sonido se llama activeFence.


vaya al panel de jerarqua, despliegue levelGeometry y encontrara el objeto
impoundFence.
Arrastre el sonido activeFence directamente a este objeto. Esto aadir un componente de
Audio Source a el objeto impoundFence.
Por ltimo, cambie la configuracin de Audio Source de la siguiente manera:

Ajustes Audio Source del objeto cerca.


El Personaje
Lerpz por si solo no hace ningn sonido en el momento. Adicin de efectos de sonido tiene
sentido, pero cules?


Los efectos de sonido que vamos a aplicar en este tutorial son:
Un sonido de puetazo.
Un sonido de "golpeado", se reproducir cuando Lerpz es golpeado por un robot.
Un efecto de sonido para los propulsores del jetpack.
Un sonido para que suene cuando el jugador muere y renace.
(El efecto de pasos se deja como ejercicio para el lector.)


Estos sonidos seran reproducidos por nuestros scripts.


El Puetazo.
El movimiento de puetazo y la animacin son manejados por el script Third Person Character
Attack. Una propiedad para el efecto de sonido es expuesta por el script en el inspector.

67

Establezca la propiedad Punch Sound como se muestra a continuacion:

Efecto de sonido de puetazo de Lerpz.

El Script reproduce este sonido con el siguiente cdigo:


if (punchSound)
audio.PlayOneShot(punchSound);



Este fragmento de codigo comprueba si un efecto de sonido para el puetazo se ha facilitado a el
script. Si es as, que usa la funcion PlayOneShot () para reproducir el sonido. Esta funcin crea un
GameObject temporal con un componente de fuente de audio, lo agrega a la escena y lo
reproduce. Cundo el efecto de sonido se termina, el GameObject es retirado de la escena.

NOTA Mientras que el juego se est ejecutando, ver estos sonidos aparecer brevemente en el panel
de la Jerarqua. Este comportamiento es normal.



Sonidos de golpeado y grito
El script Third Person Status maneja dos efectos de sonido: el que reproduce cuando Lerpz es
golpeado por un enemigo, y el que reproduce cuando Lerpz muere (justo antes de que renasca o
el juego termine). Ambos efectos de sonido son manejados de la misma manera como el efecto de
sonido "lerpzPunch que agregamos anteriormente.


Aada los sonidos LerpzStruck y LerpzScreamSFX como se muestra a continuacin:

68

Agregar los efectos de sonido a las variables Struck sound y Deatrh Sound.


El Jetpack
El jetpack usa un efecto de sonido en loop, en lugar de un oneshot, as que vamos a aadir el
efecto de sonido a el GameObject del Player directamente como un componente de fuente de
audio. El controlador de partculas de el Jetpack crear automticamente un componente de
fuente de audio vaco, pero tenemos que agregar el archivo de audio a el mismo:


Arrastre el archivo de audio thrusterSound hacia el componente de fuente de audio dentro
de el GameObject del Player.
Asegrese de que la configuracin de fuente de audio sea como se muestra:

Jetpack ajustes de audio

69

Hay dos secciones de script para controlar este efecto de sonido, los cuales estn en el script
Jet Pack Particle Controller. La primera seccin va en la funcin start () e inicializa el
componente fuente de audio:
audio.loop = false;
audio.Stop();



El segundo bloque est ms abajo en la misma funcin:

if (isFlying)
{
if (!audio.isPlaying)
{
audio.Play();
}
}
else
{
audio.Stop();
}

SUGERENCIA La variable de audio es creada por Unity y apunta siempre a el componente de


AudioSource en el GameObject.
Este cdigo es autoexplicativo.
La necesidad de probar si el efecto de sonido ya est reproduciendose es debido a que la funcin
Play () siempre empieza a reproducir el efecto de sonido desde el principio,
independientemente de si ya est reproduciendose. Esto significa que escuchariamos el sonido
entrecortado ya que Unity reiniciaria repetidamente a la muestra de sonido cada vez que la
funcion Play () es llamada.


Robot Guardia
Estos personajes tienen una serie de scripts algunos de los cuales tambin tienen muestras de
audio como de propiedades.
Adems, cada robot guardia tiene un componente de fuente de audio.
A diferencia del jugador, que utiliza su componente de fuente de audio exclusivamente para el
sonido del jet pack, el script EnemyPoliceGuy utiliza el componente de fuente de audio del
Prefab Copper para mltiples sonidos loppeados, cambiando entre ellos cuando sea necesario.
if (idleSound)
{
if (audio.clip != idleSound)
{
audio.Stop();
audio.clip = idleSound;
audio.loop = true;
audio.Play();
}
}

Un ejemplo el cdigo utilizado para lograr esto se muestra a continuacin:

70

El ejemplo de arriba se puede ver en la parte superior de la funcion idle () en el script


EnemyPoliceGuy . La llamada a audio.Stop () es importante ya que el intercambio de una
muestra de sonido mientras se est reproduciendo puede tener resultados impredecibles.


Para aadir los efectos de sonido:


Seleccione el Prefab Copper en el panel de proyecto para visualizar sus propiedades en el
Inspector.
Arrastre el efecto de sonido CopperIdleLoop hacia el componente de fuente de audio.
Agregue el mismo effectto de sonido a la propiedad Idle Sound en el componente script
EnemyPoliceGuy.
Aadir el efecto de sonido CopperActiveLoop a la propiedad Attack Sound en el mismo
componente.
Por ltimo, aadir el efecto de sonido MetalHit a la propiedad del Struck Sound impacto
del Componente script Enemy Damage.

(La vista resultante en el panel de Inspector se muestra en la siguiente pgina.)
El sonido MetalHit se reproduce en la funcion ApplyDamage () dentro de el script
EnemyDamage. El cdigo que hace esto se muestra a continuacin:


if (audio && struckSound)
audio.PlayOneShot(struckSound);

Al igual que con el jet pack, la variable audio que usamos aqu es en realidad una variable de
acceso directo creada por Unity. Es el equivalente a llamar la funcion
GetComponent(AudioSource).

NOTA El mismo truco se usa para algunos de los efectos de reproduccin de sonido.

71

Copper Prefab ajustes Inspector despus de aadir los archivos de audio.

Cut Scenes
Los cutscenes o cinemas proporcionan un medio til para tener al tanto al jugador de un evento
en la historia. En este tutorial tenemos 2 cutscenes.

La primera ocurre cuando el jugador se las arregla para recoger todas las pilas de combustible
necesarias para el nivel, lo cual desbloquea la nave espacial. Esta escena aparece en un picture-
in-picture o recuadro, de modo que el jugador puede continuar jugando mientras la secuencia se
reproduce.
Una de las razones muy pragmticas para no usar toda la pantalla para esta escena es que de otro
modo tendra que congelar todos los elementos de juego de los robots, el jugador, controles, etc,
mientras la escena se reproduce, porque el jugador quedaria ciego hasta que la escena termine.
La segunda escena se produce cuando el jugador toca la nave espacial despus que la cerca ha
sido desactivada. Esta escena se reproduce en pantalla completa, vemos la nave espacial
despegando y volando hacia la libertad antes de pasar a la secuencia de Game Over.


Echemos un vistazo a la primera escena en detalle ...

72

Desbloqueo de la cerca
Nos topamos con la cerca por primera vez cuando agregamos animaciones a esta misma , en este
capitulo le agregamos sonidos, ahora vamos a animarla.
Pero primero, tenemos que asegurarnos de hacer esto cuando hemos recogido todas nuestras
latas de combustible
(Usted puede encontrar el cdigo de script completo en la seccin de apndice):


Abra el script ThirdPersonStatus y busque dentro de el la funcion FoundItem ().
Despus de el bloque de comentarios, agregue las siguientes lneas de cdigo. (Asegrese de
que insertar antes de la llave de cierre de la funcin '}' o no funciona!)
if (remainingItems == 0)
{
levelStateMachine.UnlockLevelExit(); // ...and let our player out of the level.
}


Guardar el script.
Abrael script LevelStatus. Aqu es donde tanto las escenas se controlan (Usted puede
encontrar el cdigo de script completo de apndice).
En la parte superior de el script, agregue el siguiente cdigo:
var
var
var
var
var
var
var

exitGateway: GameObject;
levelGoal: GameObject;
unlockedSound: AudioClip;
levelCompleteSound: AudioClip;
mainCamera: GameObject;
unlockedCamera: GameObject;
levelCompletedCamera: GameObject;


NOTA El cdigo anterior incluye variables que necesitaremos para la segunda escena tambin.
A continuacin, aada la siguiente lnea de cdigo de script a la funcion Awake ():

levelGoal.GetComponent (MeshCollider). isTrigger = false;


Esa lnea es crucial. Esta previene que el segundo cutscene se active antes de tiempo. Con
isTrigger en falso la nave espacial hace parte del escenario siempre y cuando la cerca este activa.
Ahora, para la secuencia de desbloqueo.


Agregue la siguiente funcin a el script LevelStatus.

function UnlockLevelExit()
{
mainCamera.GetComponent(AudioListener).enabled = false;

73

Unity soporta slo un componente de escucha de audio en la escena.


Normalmente esto se adjunta a la cmara principal en la escena, pero estamos utilizando
mltiples cmaras en nuestra escena, por lo que tenemos que asegurarnos de que slo tengamos
un componente Audio Listener(escucha de audio) activo en cualquier momento. Queremos
escuchar el efecto de sonido de fence disabled (cerca desactivada) , as que activaremos
brevemente el componente de escucha de audio de la camara de nuestro cutscene aqu.

A continuacin, debemos activar el vdeo de la cmara y activar su componente de escucha de
audio:

unlockedCamera.active = true;
unlockedCamera.GetComponent(AudioListener).enabled = true;



La cerca tiene un efecto de sonido en loop asignado a ella. Tenemos que detener la reproduccion
de el sonido ahora:

exitGateway.GetComponent(AudioSource).Stop();



Ahora podemos empezar a reproducir nuestro sonido de "cerca desactivada" :
if (unlockedSound)
{
AudioSource.PlayClipAtPoint(unlockedSound,
unlockedCamera.GetComponent(Transform).position, 2.0);
}


Con nuestro efecto de sonido reproducioendose, podemos iniciar la secuencia de animacin.
Haremos esto de proceduralmente mediante el uso de cdigo de script para lograr la animacin.
Las siguientes lneas realizan esta secuencia. La primera lnea aade un retraso antes de el
comienzo de la secuencia para darle tiempo a el jugador de fijar su atencin a la secuancia.. (He
dejado los comentarios en su lugar para que pueda seguir la secuencia de animacin):

yield WaitForSeconds(1);
exitGateway.active = false; // ... the fence goes down briefly...
yield WaitForSeconds(0.2); //... pause for a fraction of a second...
exitGateway.active = true; //... now the fence flashes back on again...
yield WaitForSeconds(0.2); //... another brief pause before...
exitGateway.active = false; //... the fence finally goes down forever!



Ahora tenemos acceso a la nave! Todo lo que necesitamos hacer ahora es convertir el componente
Mesh Collider de la nave en un trigger envez de un collider convencional.
levelGoal.GetComponent(MeshCollider).isTrigger = true;


74

Por ltimo, hacemos una pausa de unos segundos para que el jugador tenga tiempo para ver los
resultados, antes de apagar la cmara de nuestra escena y restaurar el componente de escucha de
audio a nuestra NearCamera:
yield WaitForSeconds(4); // give the player time to see the result.
// swap the cameras back.
unlockedCamera.active = false; // this lets the NearCamera get the screen all to
itself.
unlockedCamera.GetComponent(AudioListener).enabled = false;
mainCamera.GetComponent(AudioListener).enabled = true;
}


La creacin cmara para el cutscene es nuestra prxima tarea. Esto es slo otro Camera
GameObject, exactamente como la que hemos estado utilizando en el juego en s. Vamos a
configurarlo:


Aadir una nueva cmara a la escena.
Cambiarle el nombre a CutSceneCamera1
Aadir el script SmoothLookAt a la cmara.
Asignarle spaceShip en a el script SmoothLookAt para que el script sepa para donde necesita
apuntar la camara.
Establezca las propiedades restantes como se muestra:

CutScenCamera1 propiedades.

75

Esta cmara debe ser configurada para mirar hacia la plataforma donde se encuentra encerrada
la nave, mostrando claramente la cerca. La configuracin que se muestra arriba debera ser una
buena aproximacin, pero no dude en modificarla a su gusto:

Posicionamiento de CutsceneCamera1.

A continuacin, ajustar la configuracin de la cmara CutSceneCamera1 as:

Configuracin del el componente Camera de CutSceneCamera1 .


La cmara debe ser desactivada por defecto. Ser activada por nuestros scripts, pero no
queremos que renderize nada hasta que el script no le indique lo contrario. La descativacin de la
cmara es muy sencilla:

76

Descative la casilla situada junto a Cut Scene Camera 1, a la derecha en la parte superior de el
inspector.
Adems, ajuste la configuracin de Normalized View Port Rect como se muestra arriba. Estos
definen la posicin en la cual se dibujara la camara para que aparezca en la parte superior
derecha de la pantalla. El parametro Depth tambien se establece a 10, que es mayor que el Depth
de Near Camera para que la camara se dibuje sobre el resto de las camaras.

Necesitamos poner a prueba la secuencia, por lo que debemos establecer las propiedades de el
script LevelStatus como se muestra a continuacin:

Configuracin de las propiedades de el script LevelStatus.

El objeto spaceship es el modelo de nave espacial .


TIP he temporalmente establecido el valor de la propiedad Items Needed a 2 en la imagen de
arriba. Esto me permite probar la escena con tan solo recolectar dos latas de combustible en lugar
de perder tiempo recolectando el resto por todo el nivel. Recuerde restaurar a un nmero mayor
como 20 cuando hallamos terminado.
Si usted juega el juego ahora, debera ver el cinema aparecer tal como se muestra a continuacin.

Nuestro primer cinema en accin.

NOTA El contador de cuadros por segundo esta visible tanto en la camara principal como en la del
cinema, su funcionamiento e implementacion esta cubierto en el captulo sobre la optimizacin.


El ltimo cinema es un poco ms complejo. Necesitamos que la nave espacial despegue y salga

77

volando. Podemos hacer esto utilizando scripting, pero es mucho ms fcil utilizar un
AnimationClip para algo asi:


Haga clic en el modelo de nave espacial dentro de la cerca. (O haga clic en l en el panel de
jerarqua)
Agregar el AnimationClip ShipAnimation de la carpeta de Animations en el panel del
proyecto y aadirlo al objeto spaceShip (nave espacial).
Si usted a juega el juego ahora vera la nave despegar. Sin embargo, slo queremos que la nave
despegue, cuando el nivel este completo. Vamos a hacer esto con un script en un minuto. Sin
embargo Unity, por defecto, supone que las animaciones se reproducen de forma automtica. No
queremos esto, as que, con el juego en Stop:
Deshabilitar la opcion "Play Automatically" del componente de Animacin de la nave
espacial.

Ajustes de animacin de el objeto nave espacial.


El siguiente paso es crear la camara para nuestro segundo cinema:
Crear un nuevo objeto de tipo camera.
Cambiarle el nombre CutSceneCamera2.
Posicinela en la parte superior del edificio donde se encuentra la nave, como se muestra:

78

Posicionamiento CutSceneCamera2.

No te preocupes por la direccin que apunta: slo estamos interesados en su ubicacin. El


script que agregaremos se encargar del resto.
Agregar el script SmoothLookAt a la cmara.
Asigne el modelo de spaceShip al script SmoothLookAt para que el script sepa a donde debe
apuntar la cmara.
Al igual que con CutSceneCamera1, tambin tenemos que garantizar que esta se este
desactivada por defecto, pero los valores restantes son un poco diferentes, como se puede ver en
la imagen. La diferencia clave es que esta cmara tiene que dibujarse en toda la pantalla, en lugar
de aparecer en la esquina, por lo que las propiedades de Normalized Viewport Rect son
configuradas para tomar esto en cuenta.

Ajustes para CutSceneCamera2.


79

Ahora para la el cinema. Esto es un poco ms complicado que nuestro primer cinema porque el
mensajes utilizados para desencadenar la escena deben ser transmitidos a lo largo de una
cadena:
Todo incia cuando el jugador toca el modelo de nave espacial. (Si el primer cinema ha
transcurrido, el modelo de nave espacial est actuando como un Trigger en lugar de un objeto
slido).
El modelo de nave espacial por lo tanto necesita un script adjunto a la misma para hacer frente a
este evento:
Crear un nuevo script de tipo JavaScript.
Cambiarle el nombre HandleSpaceshipCollision.
Agregue el cdigo siguiente a el script (Usted puede encontrar el cdigo de el script
completo en la seccin de apndice):

private var playerLink : ThirdPersonStatus;
function OnTriggerEnter (col : Collider)
{
playerLink=col.GetComponent(ThirdPersonStatus);
if (!playerLink) // not the player.
{
return;
}
else
{
playerLink.LevelCompleted();
}
}

Todo el cdigo de arriba es para probar si el jugador ha tocado la nave espacial y, de ser as,
llame al la funcion LevelCompleted () en el script ThirdPersonStatus del Jugador.
Aadir el script al objeto spaceShip.

La funcion LevelCompleted() de el script ThirdPersonStatus es an ms corta y hace algo muy


similar.


Agregue la siguiente funcin a el script ThirdPersonStatus:

function LevelCompleted()
{
levelStateMachine.LevelCompleted();
}

Aadir la funcion LevelCompleted () a LevelStatus.


80

function LevelCompleted()
{


En primer lugar, tenemos que hacer el mismo intercambio de Audio Listener que hicimos para
nuestro primer cinema:
mainCamera.GetComponent(AudioListener).enabled = false;
levelCompletedCamera.active = true;
levelCompletedCamera.GetComponent(AudioListener).enabled = true;


A continuacin, queremos dar la ilusin de que el jugador est dentro de la nave espacial, por lo
que vamos a esconderlo. Para ello, vamos a enviar un mensaje de "HidePlayer" a el script
ThirdPersonController del jugador. La funcin desactiva el renderizado de que el jugador para
que se haga invisible:


playerLink.GetComponent(ThirdPersonController).SendMessage("HidePlayer");


Slo para estar en el lado seguro, tambin trasladaremos fsicamente al jugador a una posicin
que sabermos debe ser segura. (Los robots no comprueban si el jugador es visible o no, y estn
an en funcionamiento.) En este caso, slo tendremos que mover el jugador 500 unidades hacia
arriba, lo cual debe ser lo suficientemente lejos de cualquier peligro inmediato.

playerLink.transform.position+=Vector3.up*500.0; // just move him 500 units


A continuacin, vamos a reproducir el sonido de nivel completado. En este caso, es el sonido de la
nave espacial que despega:
if (levelCompleteSound)
{
AudioSource.PlayClipAtPoint(levelCompleteSound, levelGoal.transform.position,
2.0);
}



Ahora empezamos a reproducir la animacion de la nave y esperamos a que termine:
levelGoal.animation.Play();
yield WaitForSeconds (levelGoal.animation.clip.length);



Y, por ltimo, cargamos la escena "Game Over":

81


Application.LoadLevel("GameOver"); //...just show the Game Over
sequence.
}


Ahora debemos asegurar que el modelo de nave espacial no este configurado como un trigger
cuando nuestro nivel inicia, y tambin asegurar playerLink est apuntando a el GameObject
Player. Vamos a definir la variable dentro de una funcin Awake () en playerLink, que ser
llamada automticamente por Unity cuando se carga el script.
Cambiar el Awake () para como vemos en el script de abajo . Debera estar ubicado justo
encima de la primera funcin en LevelStatus.

private var playerLink: GameObject;
function Awake()
{
playerLink = GameObject.Find("Player");
if (!playerLink)
Debug.Log("Could not get link to Lerpz");
levelGoal.GetComponent(MeshCollider).isTrigger = false; // make very sure of this!
}



Finalmente, debemos establecer las propiedades de nuestro script, como se muestra:

La configuracin final de las propiedades de el script de Level Status.

El resultado, al recoger todas las latas de combustible y saltar a la nave espacial, debe verse como
esto:

82

Misin cumplida! Nuestro hroe se marcha para nuevas aventuras.


El siguiente captulo se cubre tcnicas de optimizacin que podemos usar para mejorar el
rendimiento de nuestro juego.

83

Optimizacin

Es necesario optimizar nuestro juego para que pueda


correr en maquinas del mayor rango possible de
especificaciones tecnicas.












Estamos ahora en la etapa final. La optimizacin es algo que se hace cerca del final de un
proyecto, una vez todos los elementos estn en su lugar y definidos. Qu, dnde y cmo
optimizar su proyecto depende en gran medida de el diseo de su proyecto y el contenido,
por lo que este captulo es principalmente un debate sobre los tipos ms comunes de
optimizacin.

Por qu optimizar?
Los proyectos de Unity usualmente estan dirigidos a equipos de modesto rendimiento con el fin de
llevar al mayor numero de usuarios.
Por esta razn, debemos considerar la optimizacin de nuestros proyectos para la versin final.
En nuestro caso, ya hemos optimizado los robots enemigos, hacindolos materializarse slo
cuando esten en rango del jugador. Sin embargo, la representacin de la escena puede ser algo
lenta y esto vale la pena examinarlo ms a fondo.

Optimizacin de Rendering: Monitoreo de Frames Per Second


La mejor manera de determinar si el juego necesita ser optimizado es averiguar el numero de
cuadros por segundo que nuestro equipo puede presentar cuando el juego se esta ejecutando. Cuanto
menor sea el nmero, ms lento el juego se est ejecutando.
Usted puede haber notado un nmero o las letras "FPS", en algunas de las imagenes en este
tutorial. Esto es porque un script importante, pero afortunadamente muy corto, se esta
ejecutando lo cual examinaremos ahora:


El script se llama FPS y se puede encontrar en la Carpeta Scripts->GUI del panel de proyecto.

El script est bien documentado, por lo que no esta cubierto en detalle aqu, aparte de alclarar
que se requiere un componente de GUIText en el objeto al cual agregamos el script.

Con este contador FPS, es ms fcil obtener una buena idea de donde hay necesidad de hacer
optimizaciones.


NOTA El script FPS puede reportar un numero mas bajo en modo de edicion que en el proyecto
compilado, esto se debe a que el editor tiene que hacer mucho trabajo adicional para ejecutar el
juego. Para una lectura mas exacta compile el juego y ejecutelo como standalone.

84

Pantalla de Estadsticas
El boton "Stats" arriba de la vista de juego. Si lo presionamos podemos obtener algunos
indicadores adicionales en nuestro juego, que pueden ayudarnos a determinar si hay poblemas de
numero de poligonos o otra complejidad por resolver.

El panel de Estadstica en accin.

Estas estadsticas se basan en lo que la cmara esta mirando, por lo cual, lo que se mueva
alrededor de la escena puede cambiar muchas de las estadsticas. Los elementos ms
importantes son:


Draw Calls
El nmero de pasadas de dibujado. Puede ser necesario dibujar algunos elementos varias veces:
las sombras, mltiples cmaras, dibujando las texturas, luces de pixel, y ms. Shaders complejos
tambin pueden incrementar el numero de pasadas, especialmente si se trata de reflexin o
refraccin.
Tris
Nmero de tringulos que se estn dibujando.
Todos los modelos 3D se construyen a partir de tringulos. El menor nmero de los tringulos,
ms rpido se va a dibujar. Objetos curvos generalmente un usan ms tringulos que objetos con
formas rectas.


Verts
Nmero de vrtices que se esta enviando a los chips grficos.
Un vrtice es un punto en el espacio 3D. Mientras mas vertices se puedan compartir entre
triangulos, ms tringulos se puede hacer y por lo tanto ms complejo puede ser el modelo.


Used Textures
nmero de texturas necesarias para dibujar lo que ves.
Los materiales pueden utilizar una o ms texturas, dependiendo de cmo se define el material y
el shader que est utilizando. El shader define cmo se combinan las texturas, producir efectos
tales como bump mapping, gloss, reflexin y refraccin.


TIP Los sistemas de partculas utilizan dos tringulos por cada partcula, y al menos una textura.
(Texturas suelen ser compartidos por todas las partculas en un sistema de partculas.) Es muy
fcil dejarse llevar por esos efectos, pero debe tener cuidado de no exagerarse.

85

Render Textures
el nmero de cmaras dibujando a un Render Texture en lugar de directamente a la pantalla.
Esto no es tan simple como uno pudiera esperar ...
Render textures se utilizan para conseguir una serie de efectos, como los efectos de
postprocesado, una pantalla de circuito cerrado de televisin que muestra otra rea de un nivel, o
para producir una reflexin en el agua, de un espejo o los efectos de refraccin de vidrio. Adems,
la mayora de las sombras tambin se producen usando esta tcnica, por lo que no
necesariamente se ven cmaras adicionales en el Scene View.

Optimizacin de Rendering: Sistema de dos camaras


Si has jugado con el proyecto terminado, te habrs dado cuenta ahora que hay, de hecho, dos
camaras: una cmara cercana (Near Camera) y una cmara lejana (Far Camera). Este sistema
reduce la cantidad de dibujado necesario para cada frame. La camara cercana dibuja todo dentro
de un rango cercano, en este caso, 0,4 a 50 unidades. La camara lejana dibuja de 50 unidades a
alrededor de 500 unidades. Sin embargo, slo dibuja un subgrupo de objetos en la escena. El
subgrupo se define por capas. Cada objeto de la escena se le da una capa para vivir. La camara
cercana dibuja todos los elementos cercanos, independientemente de su capa, pero como se
puede ver en la pantalla de abajo, la cmara lejana se le ha instruido a ignorar objetos en las capas
cameraTwo"o"cameraTwoIgnoreLights ". Tambin nos gustara ignorar las latas de combustible
y los items de la salud. Estos estan en la capa "noShadow", de modo que tambin est desactivada
para esta cmara.


Nota Si desactiva capa "noShadow" tambin significa que dibujara el jugador tampoco, esto est
bien ya que es poco probable que el jugador este tan lejos de la cmara cercana.

Los Parmetros de culling Mask de la cmara lejana.

NOTA La cmara lejana tambien es la encargada de dibujar el skybox . (Vase la configuracin de


clear flags en la imagen de arriba.). La configuracion de clear flags de la camara cercana esta en

86

depth only, de modo que su contenido se superpone a la de la cmara lejana. El contenido de la


cmara lejana se representa en primer lugar.


Esta seleccin se define por la propiedad de culling mask en el componente de la cmara.
Capas seleccionadas son dibujadas; capas deseleccionadas no son dibujadas.

Usted puede ver esta optimizacin en accin con los guardias robot y los items. Si usted se
mueve hacia uno de estos elementos, podrs ver que el paisaje que lo rodea es siempre dibujado,
mientras que el elemento en s mismo aparece cuando esta relativamente cerca al jugador.

87

El Fin del camino.


Sugerencias para mejorar

Este juego se ha dejado deliberadamente sin terminar. Tenemos un men muy bsico de inicio,
una pantalla de game over y el ultimo nivel del juego, podria tener mas niveles. Cmo podra ser
mejorado?


Arreglando los errores dejados deliberadamente
S, hay algunos problemas menores con el juego tal como est. Estos han sido deliberadamente
dejados en su lugar para darle al usuario oportunidad de perfeccionar sus habilidades. Ellos son:

Si usted mata a un robot, pero renace cerca antes que el jugador se haya movido fuera de rango,
un nuevo robot aparecer, pero el viejo se mantendr.
Las Trampas de lser no empujan a el jugador, por lo que es posible perder toda la vida con
bastante rapidez.


Ambos pueden ser resueltos mediante la aplicacin de lo que has aprendido en este tutorial.


Ms niveles
El panel de proyecto incluye una carpeta "Build your own" que contiene todos los assets
individuales utilizados para construir el nivel, por lo que aadir nuevos niveles no debera ser
difcil.
Usted tendr que utilizar DontDestroyOnLoad () de modo que pueda llevar la informacin de
estado del juego entre los niveles como la puntuacin actual, la vida restante, etc.
Ms enemigos
El juego slo tiene un enemigo, los guardias robot. Por qu no aadir un poco ms? Esta es una
buena manera de asegurarse de que han entendido la animacin y los aspectos de la IA. Tambin
le ayudar a obtener una slida comprensin de la construccin de modelos y la importacin de
ellos en Unity.


Aadir marcador
El juego carece de un sistema de puntuacin. Aadir uno no es difcil, pero aadiendo efectos
visuales cuando el jugador hace algo digno de aumentar su puntuacin puede ser tan difcil como
usted quiera. (Y, por supuesto, usted desea hacer un seguimiento de los puntajes entre escenas.)


Aadir un sistema de puntaje en red
Qu mejor manera de presumir que subir tu mejor puntuacin a una central de servidor para
que todos puedan ver tu grandeza? Esta es una buena manera de envolver su cabeza en torno a
conceptos bsicos de redes.


Aadir soporte multijugador

88

Aadiendo soporte para juegos en red multijugador es probablemente una de las cosas ms
difciles que usted puede hacerle a cualquier juego. Naturalmente, Unity puede servir tambin de
ayuda, pero usted tendr que familiarizarse mucho con scripting. Esta es una buena mejora para
un nivel avanzado.

Para leer ms

El primer lugar para buscar ms informacin es, como siempre, la propia documentacin de
Unity.


Tambin hay muchos tutoriales en el sitio web de Unity:
http://unity3d.com/support/documentation/


Adems, el Unify Wiki es una fuente excelente de informacin contribuida por los usuarios:
http://www.unifycommunity.com


Y, por ltimo, usted puede hablar con expertos y recin llegados en los foros de Unity:
http://forum.unity3d.com /

89

Apndice de Scripts
Aqu se congregan todos los scripts
Script StartMenuGUI
Aqu est el cdigo para el script StartMenuGUI.

//@script ExecuteInEditMode()
var gSkin : GUISkin;
var backdrop : Texture2D;
private var isLoading = false;
function OnGUI()
{
if(gSkin)
GUI.skin = gSkin;
else
Debug.Log("StartMenuGUI: GUI Skin object missing!");
var backgroundStyle : GUIStyle = new GUIStyle();
backgroundStyle.normal.background = backdrop;
GUI.Label ( Rect( (Screen.width - (Screen.height * 2)) * 0.75, 0, Screen.height * 2, Screen.height), "", backgroundStyle);
GUI.Label ( Rect( (Screen.width/2)-197, 50, 400, 100), "Lerpz Escapes", "mainMenuTitle");
if (GUI.Button( Rect( (Screen.width/2)-70, Screen.height -160, 140, 70), "Play"))
{
isLoading = true;
Application.LoadLevel("TheGame");
}
var isWebPlayer = (Application.platform == RuntimePlatform.OSXWebPlayer ||
Application.platform == RuntimePlatform.WindowsWebPlayer);
if (!isWebPlayer)
{
if (GUI.Button( Rect( (Screen.width/2)-70, Screen.height - 80, 140, 70), "Quit"))
Application.Quit();
}
if (isLoading)
GUI.Label ( Rect( (Screen.width/2)-110, (Screen.height / 2) - 60, 400, 70), "Loading...", "mainMenuTitle");
}



GameOverGUI
Aqu est el cdigo para el script GameOverGUI:
@script ExecuteInEditMode()
var background : GUIStyle;
var gameOverText : GUIStyle;
var gameOverShadow : GUIStyle;
var gameOverScale = 1.5;
var gameOverShadowScale = 1.5;
function OnGUI()
{
GUI.Label ( Rect( (Screen.width - (Screen.height * 2)) * 0.75, 0, Screen.height * 2, Screen.height), "", background);

GUI.matrix = Matrix4x4.TRS(Vector3(0, 0, 0), Quaternion.identity, Vector3.one * gameOverShadowScale);


GUI.Label ( Rect( (Screen.width / (2 * gameOverShadowScale)) - 150, (Screen.height / (2 * gameOverShadowScale)) - 40,
300, 100), "Game Over", gameOverShadow);
GUI.matrix = Matrix4x4.TRS(Vector3(0, 0, 0), Quaternion.identity, Vector3.one * gameOverScale);
GUI.Label ( Rect( (Screen.width / (2 * gameOverScale)) - 150, (Screen.height / (2 * gameOverScale)) - 40,
300, 100), "Game Over", gameOverText);

90

GameOverScript
Aqu est el cdigo para el script GameOverScript:
function LateUpdate ()
{
if (!audio.isPlaying || Input.anyKeyDown)
Application.LoadLevel("StartMenu");
}



ThirdPersonStatus
Aqu est el cdigo para el script ThirdPersonStatus:
// ThirdPersonStatus: Handles the player's state machine.
// Keeps track of inventory, health, lives, etc.
var health : int = 6;
var maxHealth : int = 6;
var lives = 4;
// sound effects.
var struckSound: AudioClip;
var deathSound: AudioClip;
private var levelStateMachine : LevelStatus; // link to script that handles the level-complete sequence.
private var remainingItems : int; // total number to pick up on this level. Grabbed from LevelStatus.
function Awake()
{
levelStateMachine = FindObjectOfType(LevelStatus);
if (!levelStateMachine)
Debug.Log("No link to Level Status");
}

remainingItems = levelStateMachine.itemsNeeded;

// Utility function used by HUD script:


function GetRemainingItems() : int
{
return remainingItems;
}
function ApplyDamage (damage : int)
{
if (struckSound)
AudioSource.PlayClipAtPoint(struckSound, transform.position); // play the 'player was struck' sound.

health -= damage;
if (health <= 0)
{
SendMessage("Die");
}

function AddLife (powerUp : int)


{
lives += powerUp;
health = maxHealth;
}
function AddHealth (powerUp : int)
{
health += powerUp;

if (health>maxHealth) // We can only show six segments in our HUD.


{
health=maxHealth;
}

91

function FoundItem (numFound: int)


{
remainingItems-= numFound;
//
//
//
//

NOTE: We are deliberately not clamping this value to zero.


This allows for levels where the number of pickups is greater than the target number needed.
This also lets us speed up the testing process by temporarily reducing the collecatbles needed.
Our HUD will clamp to zero for us.
if (remainingItems == 0)
{
levelStateMachine.UnlockLevelExit(); // ...and let our player out of the level.
}

function FalloutDeath ()
{
Die();
return;
}
function Die ()
{
// play the death sound if available.
if (deathSound)
{
AudioSource.PlayClipAtPoint(deathSound, transform.position);
}
lives--;
health = maxHealth;
if(lives < 0)
Application.LoadLevel("GameOver");
// If we've reached here, the player still has lives remaining, so respawn.
respawnPosition = Respawn.currentRespawn.transform.position;
// reset camera too
Camera.main.transform.position = respawnPosition - (transform.forward * 4) + Vector3.up;
// Hide the player briefly to give the death sound time to finish...
SendMessage("HidePlayer");
// Relocate the player. We need to do this or the camera will keep trying to focus on
// the (invisible) player where he's standing on top of the FalloutDeath box collider.
transform.position = respawnPosition + Vector3.up;
yield WaitForSeconds(1.6);

// give the sound time to complete.

// (NOTE: "HidePlayer" also disables the player controls.)


SendMessage("ShowPlayer"); // Show the player again, ready for...
// ... the respawn point to play it's particle effect
Respawn.currentRespawn.FireEffect ();
}
function LevelCompleted()
{
levelStateMachine.LevelCompleted();
}

92

LevelStatus
Aqu est el cdigo para el script LevelStatus:
// LevelStatus: Master level state machine script.
var exitGateway: GameObject;
var levelGoal: GameObject;
var unlockedSound: AudioClip;
var levelCompleteSound: AudioClip;
var mainCamera: GameObject;
var unlockedCamera: GameObject;
var levelCompletedCamera: GameObject;
// This is where info like the number of items the player must collect
// in order to complete the level lives.
var itemsNeeded: int = 20;

// This is how many fuel canisters the player must collect.

// Awake(): Called by Unity when the script has loaded.


// We use this function to initialise our link to the Lerpz GameObject.
private var playerLink: GameObject;
function Awake()
{
playerLink = GameObject.Find("Player");
if (!playerLink)
Debug.Log("Could not get link to Lerpz");
levelGoal.GetComponent(MeshCollider).isTrigger = false; // make very sure of this!
}
function UnlockLevelExit()
{
mainCamera.GetComponent(AudioListener).enabled = false;
unlockedCamera.active = true;
unlockedCamera.GetComponent(AudioListener).enabled = true;
exitGateway.GetComponent(AudioSource).Stop();
if (unlockedSound)
{
AudioSource.PlayClipAtPoint(unlockedSound, unlockedCamera.GetComponent(Transform).position, 2.0);
}
yield WaitForSeconds(1);
exitGateway.active = false; // ... the fence goes down briefly...
yield WaitForSeconds(0.2); //... pause for a fraction of a second...
exitGateway.active = true; //... now the fence flashes back on again...
yield WaitForSeconds(0.2); //... another brief pause before...
exitGateway.active = false; //... the fence finally goes down forever!
levelGoal.GetComponent(MeshCollider).isTrigger = true;
yield WaitForSeconds(4); // give the player time to see the result.

// swap the cameras back.


unlockedCamera.active = false; // this lets the NearCamera get the screen all to itself.
unlockedCamera.GetComponent(AudioListener).enabled = false;
mainCamera.GetComponent(AudioListener).enabled = true;

function LevelCompleted()
{
mainCamera.GetComponent(AudioListener).enabled = false;
levelCompletedCamera.active = true;
levelCompletedCamera.GetComponent(AudioListener).enabled = true;
playerLink.GetComponent(ThirdPersonController).SendMessage("HidePlayer");
playerLink.transform.position+=Vector3.up*500.0; // just move him 500 units
if (levelCompleteSound)
{
AudioSource.PlayClipAtPoint(levelCompleteSound, levelGoal.transform.position, 2.0);
}
levelGoal.animation.Play();
yield WaitForSeconds (levelGoal.animation.clip.length);
Application.LoadLevel("GameOver"); //...just show the Game Over sequence.
}

93

HandleSpaceshipCollision
Aqu est el cdigo para el script HandleSpaceshipCollision:
private var playerLink : ThirdPersonStatus;
function OnTriggerEnter (col : Collider)
{
playerLink=col.GetComponent(ThirdPersonStatus);

if (!playerLink) // not the player.


{
return;
}
else
{
playerLink.LevelCompleted();
}

94

You might also like