Académique Documents
Professionnel Documents
Culture Documents
Traduccion 3D Platformer Tutorial Building a 3D Platform Game in Unity Tomado de www.unity3d.com Realizada por www.c2estudio.com
www.detodoprogramacion.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.
2
www.detodoprogramacion.com
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.
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.
Convenciones tipogrficas
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.
3
www.detodoprogramacion.com
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.
4
www.detodoprogramacion.com
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.
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.
5
www.detodoprogramacion.com
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
...
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.
La historia
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.
6
www.detodoprogramacion.com
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.
7
www.detodoprogramacion.com
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.
8
www.detodoprogramacion.com
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:
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.
9
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
Si usted hace clic en Reproducir ahora, Lerpz ahora debe moverse cuando utiliza las teclas de control con los pies firmemente en el suelo.
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
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
www.detodoprogramacion.com
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:
15
www.detodoprogramacion.com
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!
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
www.detodoprogramacion.com
Fire add TIP Este asset tambin se incluye en la carpeta Standard Assets. Establecer los valores de este componente de la siguiente manera:
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
www.detodoprogramacion.com
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.
18
www.detodoprogramacion.com
Ahora debera tener una jerarqua de objetos que se ve algo como esto:
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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:
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
www.detodoprogramacion.com
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:
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.
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.
Conceptos de scripting
23
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
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:
Muerte y Renacimiento
25
www.detodoprogramacion.com
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:
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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:
28
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
Ubicacin de accesorios
El escenario bsico se proporciona ya listo en el tutorial, junto con una serie de accesorios ya existentes.
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.
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
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.
33
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
37
www.detodoprogramacion.com
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:
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
Si
ejecuta
el
juego
ahora,
debera
ver
el
HUD
que
aparece
sobre
el
rea
de
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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:
43
www.detodoprogramacion.com
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:
44
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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:
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.
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:
Game Over
46
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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:
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
www.detodoprogramacion.com
En primer lugar, el fondo de GUI Style. Esto slo necesita la imagen "GameOverSplashScreen" en la ranura Normal->Background, como se muestra a continuacin:
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.)
49
www.detodoprogramacion.com
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:
50
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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 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.
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
www.detodoprogramacion.com
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)
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
Sintase libre de variar las propiedades del script LaserTrap y experimente hasta obtener un resultado con el que este satisfecho.
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
www.detodoprogramacion.com
Si se juega el tutorial, usted debe encontrar que Lerpz pierde un punto de salud si toca el haz del lser.
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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.
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.
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.
Nacimiento y optimizacin
58
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
Introduccin
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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:
64
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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:
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
www.detodoprogramacion.com
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:
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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:
69
www.detodoprogramacion.com
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(); } }
70
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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 ():
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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:
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.
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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.
79
www.detodoprogramacion.com
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(); }
80
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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:
El resultado, al recoger todas las latas de combustible y saltar a la nave espacial, debe verse como esto:
82
www.detodoprogramacion.com
El siguiente captulo se cubre tcnicas de optimizacin que podemos usar para mejorar el rendimiento de nuestro juego.
83
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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.
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.
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
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.
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
www.detodoprogramacion.com
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"); }
90
www.detodoprogramacion.com
// 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
www.detodoprogramacion.com
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
www.detodoprogramacion.com
// 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
www.detodoprogramacion.com
94
www.detodoprogramacion.com