Professional Documents
Culture Documents
de
introduccion
a
Unity
Integracin
de
un
proyecto
de
videojuego
Introduccin
Lo
que
aprender
Este
tutorial
se
centra
en
el
aspecto
tcnico
de
la
construccin
de
un
juego
en
Unity,
que
abarca
lo
siguiente:
Controladores
de
personajes
Proyectores
Fuentes
de
audio
y
clips
de
audio
Mltiples
cmaras
(y
cmo
cambiar
entre
ellas)
Sistema
UnityGUI
de
scripting
Controles
de
colisin
Mensajes
y
eventos
Iluminacin
Sistemas
de
partculas
Sombras
usando
un
proyector
Scripting
(IA,
mquinas
de
estado,
controles
de
reproduccin)
Este
tutorial
se
muestra
cmo
estas
caractersticas
se
pueden
utilizar
juntas
para
crear
un
juego.
Lo
que
usted
debe
saber
ya
En
este
tutorial
hace
un
amplio
uso
de
scripting
por
lo
que
debe
estar
familiarizado
con
al
menos
uno
de
los
lenguajes
de
scripting
soportados:
JavaScript,
C
#
o
Boo.
(JavaScript
se
utiliza
para las
secuencias
de
comandos
en
este
tutorial.)
Tambin
se
supone
que
est
familiarizado
con
la
interfaz
de
Unity
y
sabe
cmo
realizar
las
operaciones
bsicas,
tales
como
la
localizacin
de
un
objeto
en
una
escena,
aadir
componentes
a
un
GameObject,
y
edicin
de
propiedades
en
el
Inspector.
Organizacin
del
Proyecto
Unity
no
intenta
forzar
una
determinada
manera
de
organizar
los
assets
de
su
proyecto.
Usted
puede
preferir
la
organizacin
de
sus
assets
por
tipo
de
assets,
con
carpetas
separadas,
por
ejemplo, "Texturas",
"Modelos",
"Los
efectos
de
sonido"
y
as
sucesivamente.
GameObjects
y
Componentes
Abstractos
Unity,
por
diseo,
coloca
los
assets
de
cada
escena
en
el
centro
del
proceso
de
desarrollo.
Esto
hace
un
enfoque
muy
visual
para
el
desarrollo
del
juego,
con
la
mayora
de
los
trabajos
que
impliquen arrastrar
y
soltar.
Esto
es
ideal
para
la
mayor
parte
del
trabajo
a
nivel
de
diseo,
pero
no
todos los
assets
pueden
ser
mostrados
de
esta
manera.
Algunos
assets
son
abstractos
en
lugar
de
ser
objetos
visuales, as
que
estn
representados
por
iconos
abstractos
y
gizmos
--
Ej.
audio
y
luces
--
o
no
son
mostrados
en
la
ventana
Scene.
Los
Scripts
estan
en
esta
ltima
categora.
Los
Scripts
definen
cmo
los
assets
y
GameObjects
en
una
escena
de
Unity
interactan
unos
con
otros y
esta
interaccin
es
la
base
de
todos
los
juegos.
Por
esta
razn,
es
generalmente
un
buen
plan
mantener
comentarios
dentro
de
los
scripts.
Este
tutorial
asume
que
usted
puede
leer
los
scripts
proporcionados
y
comprender
los
comentarios
dentro
de
ellos.
Sin
embargo,
cuando
un
script
en
particular,
tcnica
o
concepto
es
importante,
vamos
a
cubrirlo
en
detalle.
Archivos
La
carpeta
"Scene"
contiene
el
resultado
final:
un
men
principal
de
escenas,
una
escena
de
Game
Over y
una
escena
que
contiene
el
nivel
de
juego
completo.
Este
tutorial
asume
que
usted
ya
sabe
los
controles
bsicos
de
Unity,
tales
como
objetos
de
posicionamiento, en
una
escena,
as
que
la
primera
escena
con
la
que
comenzamos
ya
tiene
el
escenario
de
base
y
algunos
objetos
en
su
lugar.
Convenciones
tipogrficas
Este
es
un
largo
tutorial
que
contiene
una
gran
cantidad
de
informacin.
Para
hacerlo
ms
fcil
de
seguir, algunas
convenciones
simples
son
usadas:
Texto
en
cuadros
como
stos
contiene
informacin
adicional
que
puede
ayudar
a
aclarar
el
texto
principal.
ntes
y
Tangentes
Codigo
de
Scripting
aparecer
como
se
muestra
a
continuacin:
// This is some script code.
function Update()
{
DoSomething();
}
NOTA Los
scripts
incluidos
en
el
tutorial
incluye
un
montn
de
comentarios
y
estn
diseados para
ser
fcil
de
seguir.
Estos
comentarios
son
generalmente
omitidos
en
fragmentos
del
cdigo en
este
tutorial
para
ahorrar
espacio.
Acciones
que
necesita
llevar
a
cabo
dentro
de
Unity
se
muestran
as:
Haga
clic
aqui;
Entonces
esto;
Luego
haga
clic
en
Reproducir.
Los
nombres
de
scripts,
los
assets,
los
elementos
de
men
o
el
inspector
de
propiedades
se
muestran
en
texto
en
negrita.
Convenios
de
Unity
Unity
es
un
sistema
de
desarrollo
nico.
La
mayora
de
los
desarrolladores
estan
acostumbrados
a
trabajar
en
un
editor
de
cdigo,
usando
el
90%
de
su
tiempo
editando
cdigo,
e
incluso
escribir
cdigo
para
cargar y
utilizar
los
assets.
Unity
es
diferente:
es
enfocado
en
los
assets
en
vez
de
enfocado
en
el
codigo,
el
foco
en
los
assets
es
similar
al
de
una
aplicacin
de
modelado
3D.
Por
esta la
razn,
vale
la
pena
entender
las
principales
convenciones
y
la
terminologa
nica
para el
Desarrollo
de
Unity:
Proyectos
Un
juego
construido
en
Unity
se
compondr
de
un
proyecto.
Contiene
todos
los
elementos
de
su
proyecto, tales
como
los
modelos,
guiones,
planos,
mens,
etc
Normalmente,
un
archivo
nico
proyecto
contendr
todos
los los
elementos
de
su
juego.
Cuando
se
inicia
Unity,
lo
primero
que
hace
es
abrir
un Archivo
de
proyecto.
Escenas
Cada
proyecto
contiene
uno
o
ms
documentos
llamados
Escenas.
Una
sola
escena
contendr
un
nivel
de
juego,
pero
elementos
principales
como
una
interfaz
de
usuarioo
los
mens
de
juego,
secuencia
de
GameOver
o
escenas
importantes Tambin
pueden
vivir
en
sus
propios
archivos
de
escena.
Juegos
complejos
incluso
puede
usar
escenas
enteras
slo
para
fines
de
inicializacin.
As,
todos
los
niveles en
un
juego
muy
probablemente
sern
escenas,
pero
no
todas
las
escenas
necesariamente
ser
un
nivel
de
juego.
Assets
Todos
sus
assets
importados
aparecen
en
el
panel
de
proyectos
y
pueden
ser
casi
cualquier
cosa:
un
material
simple
o
la
textura,
archivos
de
audio,
o
incluso
un
GameObject prefabricado
(conocido
como
"prefab").
Por
ejemplo,
un
personaje
de
jugador
de
Prefab
se
podra
definir
como
un
solo
Asset,
que
contiene el
modelo
y
sus
animaciones
asociadas.
Tambin
podra
contener
scripts
de
componentes, clips
de
audio
y
cualquier
otro
componente
que
necesita
para
funcionar,
por
lo
que
podra
simplemente
arrstrarlo
en
una
escena
e
inmediatamente
tener
un
avatar
en
pleno
funcionamiento.
Los
assets
de
su
proyecto
se
muestran
en
el
panel
Proyecto
(Project).
Al
colocar
un
asset
en
la
Escena,
aparece
en
el
panel
jerarqua
(Hierarchy),
que
define
el
contenido
de
la
escena.
(Una
escena
es
el
equivalente
del
escenario
en
un
teatro.
Puede
ser
un
nivel,
un
men,
un
saln
de
juego
multijugador) el
panel
Project
se
mantiene
en
todas
las
escenas en
su
proyecto.
Prefabricados
Un
prefab
es
un
asset
que
ha
sido
definido
como
una
plantilla.
Es
para
Unity
lo
que
una
plantilla
de
documento
es
para
una
aplicacin
de
procesamiento
de
textos.
Cuando
se
coloca
un
prefab en
la
escena,
Unity
coloca
un
enlace
al
Prefab
en
el
panel
de
jerarqua,
no
una
copia
completa.
Esto
se
llama
instanciacin.
Cada
enlace
que
se
haga
se
conoce
como
una
instancia
del
Prefab.
Si
hace
clic
en
un
prefab
en
el
panel
de
proyectos
y
ajusta
su
configuracin,
usted
encontrar
que
esos
cambios
se
reflejan
automticamente
en
todas
las
instancias
en
la
escena.
Esto
hace
que
los
prefabs
sean
ideales
para
muchos
elementos
reutilizables,
tales
como
las
balas,
enemigos,
etc.
Si
usted
encuentra un
enemigo
que
no
se
est
comportando
correctamente,
slo
tendr
que
ajustar
el
script
o
configuracin
del Prefab
original
en
lugar
de
editar
cada
uno
de
ellos
en
la
escena
de
forma
individual.
Sin
embargo,
si
hay
que
ajustar
un
par
de
campos
en
un
caso
concreto
de
un
prefab.
Usted
puede
hacer
esto
tambin:
estos
cambios
slo
afectan
a
esa
instancia
particular.
Prefabricados
son
mostrados
en
texto
azul,
tanto
en
el
proyecto
como
en
el
panel
de
jerarqua.
NOTA Un
ejemplo
de
Prefab
no
puede
tener
componentes
adicionales
ya
que
de
hacerlo,
se
romper
el
vnculo
con
el
Prefab
original.
Unity
le
avisar
si
intenta
hacer esto.
Unity,
sin
embargo,
le
permite
actualizar
el
Prefab
original
con
dichos
cambios
despus
de
que
el
enlace
fue
roto.
Agradecimientos
Este
tutorial
es
una
version
en
espaol
del
Tutorial
realizado
por
Unity
3D
y
no
podra
haber
sido
producido
sin
las
siguientes
personas:
David
Helgason,
Joachim
Ante,
Tom
Higgins,
Sam
Kalman,
Keli
Hlodversson,
Nicholas
Francis,
Aras
Pranckeviius,
Bosque
Johnson
y,
por
supuesto,
Ethan
Vosburgh
que
produjo
los
assets
para
este
tutorial.
Traducido por C2 Estudio S.A.
Primeros
pasos
Animacin
de
Lerpz
En
este
captulo
vamos
a
ver:
Implementacin
del
jugador
de
tercera
persona
y
controles
de
camara
Control
y
mezcla de animaciones
Uso
de
sistemas
de
partculas
para
aplicar
a
los
propulsores
del
jetpack
Agregar
una
blobshadow para
el
jugador
Mantener
el
estado
del
jugador
Manejo
de
salud
de
los
jugadores,
la
muerte
y
el
renacimiento.
Antes
de
comenzar,
tenemos
que
saber
lo
que
este
juego
se
trata.
En
resumen,
Necesitamos
...
La
historia
Nuestro
hroe
es
Lerpz:
un
extranjero
visitando
Robot
World
Version
2.
Este
sustituye
Robot
World Versin
1,
que
sufri
un
fallo
de
segmentacin
y
de
repente se
estrell
en
su
sol
hace
muchos
aos.
Lamentablemente,
Lerpz
ha
tenido
mala
suerte:
su
nave
espacial
ha
sido
incautada
por
la
corrupta
polica
local.
Despus
por
todos
lados,
Lerpz
ha
encontrado
su
nave
espacial,
pero
Cmo
puede
recuperarla?
Lerpz
sabe
que
si
recoge
todas
las
latas
de
combustible,
la
energa
utilizada
sobrecargar
el
sistema
de
seguridad.
Esto
apagar
la
reja
del
depsito
municipal
y
la
nave
espacial
de
Lerpz
quedara
libre.
Lerpz
puede
entrar
en
su
nave
espacial,
agregar
el
combustible
y
volar
hacia
la
libertad.
Los
guardias
robot
intentarn
detener
a
Lerpz,
pero
por
suerte,
no
son particularmente
brillantes.
Presentacin
de
Lerpz
Abra
el
proyecto
y
vea
Scenes->TheGame
Nuestro
primer
paso
es
aadir
Lerpz
a
nuestra
escena:
Abra
la
carpeta
de objetos en
el
panel
de
proyectos;
Arrastre
el
Prefab Lerpz en
la
ventana
de
escena
o
de
jerarqua;
Haga
clic
en
el
objeto Lerpz en
la
Jerarqua
y
cambiele
el
nombre
a
Player;
Mantenga
el objeto
Jugador
seleccionado,
mueva
el
ratn
sobre
la
vista
de
escena
y
presione
la
tecla
F (foco)
para
que
la
vista
se
centre
en
el
modelo
de
Lerpz.
Mueva
a
Lerpz
hacia
la
plataforma
elevada
con
el
salto
(el
nicho
con
los
triangulos
amarillos),
cerca
de
la
crcel.
(Ver
la
captura
de
pantalla
siguiente.)
Si
usted
hace
clic
en
Reproducir
(Play),
debera
ver
a
Lerpz
de
pie
en
el
patio
fuera
de
la
crcel.
En
esta
etapa,
Lerpz
no
se
puede
mover
y
la
cmara
tambin
debe
estar
vinculada
a
personaje.
Haga
clic
en
el
botn
Reproducir
de
nuevo
para
detener
el
juego.
Tenemos
que
hacer
que
Lerpz
se
mueva.
Pero
en
primer
lugar,
tenemos
que
retroceder
un
momento
y
dar
una vistazo
a
nuestra
cmara.
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.
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.
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
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.
11
Si
usted
hace
clic
en
Reproducir
ahora,
Lerpz
ahora
debe
moverse
cuando
utiliza
las
teclas
de
control con
los
pies
firmemente
en
el
suelo.
El
controlador
de
personajes
y
el
script
de
Controlador
de
Tercera
Persona
En
la
mayora
de
los
juegos,
el
avatar
del
jugador
es
capaz
de
hazaas
fsicas
imposibles,
como
girar y
detenerse
instantneamente,
saltar
distancias
inverosmiles
y
otras
acciones que
sera
muy
difcil
de
modelar
con
la
fsica
tradicional.
El
Character
Controller
por
lo
tanto
separa
nuestro
avatar
del
jugador
desde
el
motor
de
fsica,
proporcionando
controles
de
movimiento
bsico.
El
Contralor
de
personajes
simplifica
el
movimiento
de
un
jugador
(y
muchos
tipos
de
personajes
diferentes).
Se
trata
de
un
Collider
de
cpsula
atado
a
un
sistema
de
movimiento
de
base,
que
permite que nuestro
personaje
pueda
moverse,
subir
escaleras
y
cuestas
hacia
arriba
o
hacia
abajo.
T puedes
cambiar
el
tamao
mximo
de
las
pendientes
en
el
Inspector.
El
Character
Controller
se
utiliza
normalmente
con
un
script.
Esto
habla
con
el
controlador
de
personaje
y
ampla
sus
capacidades
para
satisfacer
las
necesidades
del
juego.
En
nuestro
proyecto, el script de Third
Person
Controller
realiza
esta
funcin
y
agrega
el
apoyo
necesario para
nuestro
juego
de
plataformas.
Lee
el
joystick,
teclado,
ratn
u
otro
dispositivo
de
entrada y
acta
en
consecuencia
como
el
control
del
avatar
del
jugador.
El
administrador
de
entradas
de
Unity
(Edit->Project
Settings->Input
Manager)
le
permite
definir
cmo
los
dispositivos
de
entrada
controlan
el
jugador.
Nota:
No hay
nada
especial
acerca
de
los
scripts
que
estamos
usando
para
el
jugador.
Son scripts
normales
de
Unity
que
se
han
construido
para
este
proyecto.
No
hay
un
scriot
para
controlar
personajes
por
defecto.
El
script
de
Controlador
de
Tercera
Persona
es
ya
parte
de
los
prefabricados,
asi
que
no
hay
necesidad
de aadirlo.
El
siguiente
paso
es
hacer
Lerpz
se
anime
correctamente
y
aadir
los
movimientos
adicionales,
tales
como
saltar
y
golpear
...
Animando
a
Lerpz
En
este
punto,
Lerpz
solo
se
desliza
a
travs
del
paisaje.
Esto
es
porque
el
Character
Controller
no
maneja
animacin.
No
sabe
nada
acerca
de
nuestro
modelo
de
jugador o
secuencias
de
animacin
que
se
aplican
a
cada
movimiento.
Necesitamos
conectar
a
Lerpz con sus
secuencias
de
animacin
y
esto
se
hace
con
el
script
ThirdPersonPlayerAnimation.
Utilice
el
men
de
componentes
para
agregar
el
script ThirdPersonPlayerAnimation al
GameObject
Player.
Si
usted
hace
clic
en
Reproducir
ahora,
ver
a
Lerpz
con
su
animacin
correcta.
Entonces,
qu
est
pasando
aqu?
Qu
hace
este
script?
La
respuesta
est
en
cmo
gestiona
Unity datos
de
animacin
de
personajes.
Character
Animation
Las
secuencias
de
animacin
de
los
personajes
se
crean
dentro
de
un
paquete
de
modelado,
como
3D
Studio Max,
Maya,
Blender
o
Cheetah3D.
En
la
importacin
en
Unity,
estas
secuencias
se
extraen
automticamente
y
se
almacenan
en
un
componente
de
animacin.
Estas
secuencias
de
animacin
se
definen
en
un
esqueleto
virtual,
que
se
utiliza
para
animar
el
modelo
bsico.
Estos
esqueletos
definen
cmo
la
malla
del
modelo
--los
datos
importantes en
12
armaduras
Mezcla
de
animacin
Las
Animaciones
de
los
personajes
suelen
ser
mezcladas
para
proporcionar
la
flexibilidad
necesaria
para un
juego.
Por
ejemplo,
un
ciclo
de
recorrido
animado
podra
mezclarse
con
una
serie
de animaciones
discurso,
el
resultado
es
un
personaje
que
camina
y
habla
al
mismo
tiempo.
La
mezcla
se
utiliza
tambin
para
producir
unas
suaves
transiciones
entre
las
animaciones,
como
la transicin
entre
un
ciclo
de
andar
y
una
secuencia
de
golpe.
Tenemos
que
usar
un
script
para
decirle
a
Unity
que
necesitamos
cambiar
las
animaciones,
cuando
se
necesita
la
mezcla
de
la
animacin y
cmo
debe
hacerse.
Aqu
es
donde
entra
de
Nuevo
el
scripting.
El
Script
de
Animacin
de
Jugador
de
Tercera
Persona
El
modelo
Lerpz
que
estamos
usando
usara
las
siguientes
animaciones
en
el
tutorial:
Walk
(Caminar) -- Ciclo
de
andar
normal.
Run
(Correr)
-- Una Animacin
de
correr.
(Mantenga
presionada
la
tecla
Shift
mientras
se
reproduce
para
correr.)
Punch
(Golpe)
-- Se
usa al
atacar
a
un
guardia
robot
enemigo.
Jump
(Saltar) -- Se
usa Lerpz
cuando
se
producen
saltos
en
el
aire.
Jump
Fall
(Saltar
cada) -- Se
usa cuando
Lerpz
alcanza
el
limite
del
salto
y
comienza
a
caer.
Idle
(Ocioso)
-- Un loop que se
reproduce
cuando
Lerpz
est
inactivo.
Jump
Fall
(saltar
un
muro) -- Animacin
backflip
reproduce
cuando
Lerpz
salta
de
una
pared.
Jet-Pack
Jump
(Salto
jetpack) -- Se
usa cuando
el
jetpack
de
Lerpz est
desacelerando
su
cada.
Ledge
Fall
(Caida
de
un
borde) --
Se
usa cuando
Lerpz
se
para
fuera
del
borde
de
una
plataforma.
Buttstomp
-- Se
usa cuando Lerpz
ha
sido
golpeado
por
un
guardia
de
robot.
Jump
land
(Aterrizaje
de
Salto) -- Se
usa cuando
Lerpz
aterriza
despus
de
un
salto
o
una
cada.
El
modelo
y
las
animaciones
para
Lerpz
fueron
creados
con
Maya,
importados
a Unity.
Para
obtener
ms
informacin
sobre
la
importacin
de
mallas
y
animaciones,
por
favor
vaya
a
el
Manual
de
Unity.
La
mayora
de
estas
animaciones
se
tratan
en
el
script
de
ThirdPersonPlayerAnimation, que
verifica
que
controles
del
reproductor
est
utilizando
y
reacciona
en
consecuencia.
Algunas
animaciones se
colocan
en
capas
sobre
los
dems,
mientras
que
otros
son
simplemente
puestos
en
cola
uno
tras
otro.
El script es
sobre
todo
un
conjunto
de
funciones
de
respuesta
del
mensaje.
Los
mensajes
pertinentes
son
despachados
por
el
script
ThirdPersonController,
que
lee
los
dispositivos
de
entrada
y
actualiza
el Estado
del
personaje
en
consecuencia.
El
ataque
de
Lerpz
es
un
puo.
Este
se
realiza
con
un
script
diferente,
ThirdPersonCharacterAttack. (Vamos
a
aadir
esta
secuencia
de
comandos
ms
tarde.)
Esto
puede
parecer
una
divisin
arbitraria,
pero
no
lo
es :
la
mayora
de
los
movimientos
bsicos
13
caminar,
correr,
saltar,
etc son bastante
similares sin importar que personaje sea. Sin
embargo,
los
movimientos
de
ataque
y
defensa tienden
a
ser
mucho
ms
variados.
En
algunos
juegos
de
plataforma,
el
personaje
del
jugador podra
tener
un
arma,
y
en
otro,
podra
realizar
un
movimiento
de
artes
marciales.
En
este
tutorial,
Lerpz
tiende
a
golpear
a
su
rival
muy
duro
con
el
puo. La
animacin
es
una
animacin
de
puo
simple.
Gizmos
ThirdPersonCharacterAttack
tambin
incluye
una
caracterstica
de
prueba
til:
un
Gizmo
que
dibuja
una
esfera
para
representar
a
la
zona
afectada
por
la
accin
de
puo
de
Lerpz.
Los
Gizmos
son elaborados
dentro
de
uno
de
las
das
funciones
de
Gizmodrawing de
manejo
de
mensajes.
En
este
ejemplo, la
malla
Gizmo es una esfera
amarilla
que
establece
en
la
posicin
de
golpe
y
muestra
su rea
de
efecto.
Es elaborado
en
respuesta
a
la
funcin
OnDrawGizmosSelected().
Esta
funcin
debe
ser
esttica
y
ser
llamado
por
el
Editor
de
Unity.
Una
alternativa es
OnDrawGizmos(),
que
es
llamada
por
el
Editor
de
Unity
cada
ciclo
Update,
independientemente
de
si
el
padre
GameObject
ha
sido
seleccionado.
El
JetPack
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
15
Estos
ajustes
resultan
en
un
pequeo
chorro
de
partculas
que
vamos
a
utilizar
para
simular
el
chorro
de la
llama.
SUGERENCIA Si
las
partculas
no
se
mueven
directamente
hacia
abajo,
utilice
las
herramientas
de
rotacin
de
Unity
para
rotar
nuestro
objeto
hasta
que
el
chorro
se
mueve
en
lnea
con
el
jetpack.
Cuando
hayamos
terminado,
el
sistema
de
partculas
se
adjuntar
al
objeto
hijo
en
la
jerarquia
del
Player
torso.
Esto
har
que
el
chorro
siga
los
movimientos
del
jugador.
En
este
punto,
sin
embargo,
estamos
interesados
principalmente
en
conseguir
que se
vea
bien,
as
que
no
te
preocupes
demasiado
por
una
colocacin
precisa.
El
tamao
mnimo
y
Tamao
mximo
defininen
el
rango
de
tamao
de
las
partculas.
Min
y
Max
de
Energa definen
la
vida
til
mnima
y
mxima
de
las
partculas.
Nuestro
partculas
vivir
slo
por
un
tiempo
corto
0,2 segundos
en
este
caso,
antes
de
apagarse.
Hemos
establecido
la
cantidad
de
partculas
que
emiten
a
50.
El
rango
Min
y
Max
de
emisin
define
cuntas
partculas
que
queremos
en
la
pantalla
en
cualquier
momento.
El
resultado
debera
ser
un
buen
flujo
de
partculas.
NOTA hemos
inhabilitado
"Simular
en
Worldspace"
aqu.
Esto
ayuda
a
dar
la
impresin
de
que
tenemos
un
chorro
de
gas
caliente
y
rpido
ms
que
una
llama
mucho
ms
lenta.
Ahora
bien,
establecer
la
configuracin
de
los
componentes Particle
Animator
como
se
muestra:
Configuracin
de
animador
de
partculas.
Los
valores
en
la
tabla
de
definir
las
entradas
de
Animacin
de
color.
No
se
olvide
de
configurar los
otros
ajustes
tambin!
El
Particle
Animator
animar
los
colores
de
las
partculas
a
medida
que
envejecen.
Las
partculas
comienzan
en
blanco,
pasando
por
el
amarillo
oscuro
y
anaranjado
mientras
nuestro
jet
virtual
se
enfra.
Desde
que vamos
a
renderizar
una
textura
en
cada
partcula,
el
animador
de
partculas
se utiliza
para
teir
esta
partcula,
por
lo
que
la
animacin
de
color
ser
sutil,
pero
efectiva.
El
selector
de
color
de
dilogo
que
aparece
cuando
haces
clic
en
un
color
tambin
ofrece
una
"opacidad" con control
deslizante.
La
tabla
con
los
valores
de
color
que
tambin
lo
incluyen.
Mediante
la
reduccin
de la
opacidad
de
todo
el
ciclo
de
animacin,
la
partcula
'llamas'
van
a
a
desaparecer
como
cuando
se
enfran.
El
siguiente
es
el
Particle
Renderer
.
Este
componente
dibuja
cada
partcula,
por
lo
que
debe
explicarsele
cmo
van
a
aparecer
las
partculas.
Tambin
define
el
material
que
se
utilizar
para
representar
cada
una
de
las
partculas.
Queremos
un
efecto
de
chorro
de
llamas
,
por
lo
que
deber
utilizar
el
material
"fire
add",
que se
puede
encontrar
en:
Particles->Sources->Materials->
16
Fire
add
TIP
Este
asset
tambin
se
incluye
en
la
carpeta
Standard
Assets.
Establecer
los
valores
de
este
componente
de
la
siguiente
manera:
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
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
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
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
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.
21
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
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.
Conceptos de scripting
La
mayora
de
los
scripts
estn
centrados
en
un
concepto
popular
en
el
desarrollo
del
juego:
La
maquina
de
estado
finito.
Una
mquina
de
estados
finitos
esencialmente
define
un
sistema
de
interaccin
de
condiciones, conocidos
como
estados.
Un
estado
puede
ser
casi
cualquier
cosa,
por
ejemplo
si
un
objeto
se
debe
renderizar,
si
debe
ser
sujeto
a
las
leyes
de
la
fsica,
si
enciende
o
no
una
sombra,
si
puede
rebotar,
su
posicin
en
una
pantalla,
y
as
sucesivamente.
El
panel
de
Inspector
nos
permite
cambiar
muchos
Estados,
directamente,
porque
estos
estados
son
comunes
a
casi
todos
los
juegos.
Sin
embargo,
hay
otro
tipo
de
Estado
que
es
especfico
para
el
juego
en
s.
Unity
no
sabe
que
el
avatar
del
jugador
es
un
extraterrestre,
cunto
dao
puede
soportar
Lerpz o
que
posee
un
jetpack. Cmo
puede
Unity
saber
de
la
conducta
de
los
guardias
robot
o
cmo
deben
interactuar
con
Lerpz?
Aqu
es
donde
los
scripts
son
utiles.
Usamos
scripts
para
agregar
la
interaccin
y
la
administracin
de
estados especficos
para
nuestro
juego.
Nuestro
juego
tendr
que
estar
al
tanto
de
una
serie
de
estados.
Estos
incluyen:
La
salud
del
jugador;
El
nmero
de
objetos
de
combustible
que
el
jugador
ha
recogido;
Si
el
jugador
ha
acumulado
suficiente
combustible
para
desbloquear
el
campo
de
fuerza;
Si
el
jugador
se
ha
parado
sobre
una
plataforma
de
salto;
Si
el
jugador
ha
tocado
un
item
para
recolectar;
Si
el
jugador
ha
tocado
la
nave
espacial;
Si
el
jugador
ha
tocado
un
punto
de
reaparecer;
Si
el
Game
Over
o
pantallas
de
inicio
debe
ser
mostrado;
...
y
mucho
ms.
23
Muchos
de
estos
estados
requieren
que
se
realicen
pruebas
contra
los
estados
de
otros
objetos
para
garantizar que
estn
al
da.
A
veces,
incluso
se
necesitan
de
los
estados
intermedios,
para
ayudar
a
una
transicin. Por
ejemplo,
recoger
una
lata
de
combustible
obliga
a
una
verificacin
para
ver
si
el jugador
tiene
las
suficientes
para
apagar
el
campo
de
fuerza.
Organizacin
y
Estructura
En
este
tutorial
las
mquinas
de
estado
para
el
jugador,
el
nivel
y
los
enemigos
se
manejan
por
un
puado
de
scripts
relacionados
con
diversos
GameObjects.
Estos
scripts
se
comunican
entre
s,
enviando
mensajes
y
llamando
funciones
de
cada
uno.
Hay
un
nmero
de
maneras
en
que
podemos
establecer
estos
vnculos:
Para
aadir
un
enlace
expuesto
en
la
ventana
del
Inspector,
en
el
que
se
coloca
el
objeto
en
cuestin. Esto
es
ideal
para
scripts
de
proposito
general
que
van
a
ser
reutilizados
en
otros
proyectos.
Este
es
lo
ms
eficiente
ya
que
el
script
simplemente
arranca
los
datos
de
la
variable
relevante
y
no
necesita
hacer
ninguna
bsqueda.
Sin
embargo,
se
asume
que
usted
sabe
de
antemano
exactamente
qu
objeto
o
componente
que
ser
enlazado.
Nosotros
usamos
esta
opcin
para
las cmaras
en
LevelStatus.
(Esta
secuencia
de
comandos,
ya
est
linkeada
al
GameObject
Nivel.)
Esto
nos
da
la
flexibilidad
de la
creacin
de
mltiples
cmaras,
una
para
de
escena
del
nivel
"desbloqueado"
y
otra para
la
secuencia
de
"nivel
completo".
En
la
prctica,
slo
estamos
utilizando
dos
cmaras
en
el juego,
uno
para
el
jugador
y
nivel
completo
y
la
otra
para
la
escena
"desbloqueado". Pero
la
opcin
est
ah
para
cambiar
esta
situacin.
Estableciendo
un
vnculo
dentro
la
funcion
Awake
()
del
script.
La
funion
Awake
()
es
llamada
en
cada
script
que
usted
escriba
antes
que
el
primer
evento
Update
se
desencadene
en
el
GameObject
al
que
esta
pegado.
Configurar
el
enlace
aqu
le
permite
almacenar
en
cach
el
resultado
para
su
uso
posterior
en
una
funcion
Update().
Normalmente,
se
crearia
una
variable
privada
con
un
enlace
a
otro
GameObject
o
componente
al
que
necesite
tener
acceso
dentro
de
su
script.
Si
usted
necesita
hacer
un
GameObject.Find
()
para
localizar
el
objeto,
es
mucho
mejor
hacerlo
una
sola
vez,
dentro
de
Awake
()
debido
a
que
GameObject.Find
()
es
bastante
lento.
Esta
opcin
es
ms
adecuada
para
aquellas
situaciones
en
las
que
no
necesita
la
flexibilidad
de
la
primera
opcin,
pero
no
quiero
tener
que
realizar
una
bsqueda
complicada
para
el
objeto en
cada
ciclo
de
juego.
La
solucin
es,
por
tanto,
buscar
el
objeto
cuando
el
script
ya
fue
despertado,
almacenando
los
resultados
de
la
bsqueda
para
su
uso
en
la
seccin
de
Update.
Por
ejemplo,
el
script
LevelStatus,
que
maneja
el
estado
del
nivel,
guarda
en
cach
enlaces
a
varios otros
objetos,
incluido
el
objeto
Player.
Sabemos
que
estos
no
van
a
cambiar,
as
que
bien
podramos
hacer
que
la
maquina
haga
este
trabajo
por
nosotros.
Establecer
un
enlace
durante
la
funcion
Update
().
Esta
funcin
se
llama
al
menos
una
vez
por
ciclo
de
juego,
as
que
es
mejor
evitar
el
uso
de
llamado
de
funciones
lentas
aqu.
Sin
embargo,
las
funcionesGameObject.Find
()
y
getComponent
()
pueden
ser
bastante
lentas.
Esta
opcin
se
utiliza
para
aquellas
situaciones
donde
el
objeto
que
usted
necesita
podra
cambiar
en
cualquier momento
durante
el
juego.
Por
ejemplo,
En
cul
de
los
mltiples
puntos
de
Reaparicin
en
la
escena
de
este
tutorial
debera
Reaparecer
el
jugador?
Esto
claramente
cambia
mientras
el
juego
se
est
ejecutando,
por
lo
que
necesitamos manejar
este
caso
de
la
manera
correcta.
El
problema
con
esto
es
que
es
demasiado
lento,
as
que
es
mejor
disear
para
que
no
sea
necesario
hacer
esto
a
menudo.
24
Si
lo
desea,
puede
volver
al
GameObject
Player
en
un
prefab
con
todos
nuestros cambios,
de
manera
que
usted
pueda
reutilizarlo
en
otros
proyectos
como
punto
de
partida:
Haga
clic
en
la
carpeta
Player
en
el
panel
de
proyectos.
Crear
un
prefab
nuevo.
(Va
a
aparecer
dentro
de
la
carpeta
Player.)
Dar
al
Prefab
nuevo
un
nombre
apropiado.
Por
ejemplo:
LerpzPrefab.
Arrastre
el
GameObject
Player
a
LerpzPrefab
para
completar
el
proceso.
Muerte y Renacimiento
Los
personajes
de
un
juego
Plataforma
tienden
a
llevar
una
vida
de
riesgo
y
Lerpz
no
es
una
excepcin.
Tenemos
que
asegurarnos
de
que
pierde
una
vida
si
se
cae
del
nivel.
Tambin
tenemos
que
hacerlo
reaparecer en
un
lugar
seguro
en
el
nivel
por
lo
general
llamado
un
"punto
de
reaparecion"
Otro
punto
es
que
si
Lerpz
puede
caerse
del
nivel,
tambin
es
posible
que
los
otros
personajes
puedan
hacer
lo
mismo,
por
lo
que
estos
tambin
deben
ser
tratados
adecuadamente.
La
mejor
solucin
para
esto
es
usar
un
control
de
colisin
tipo
caja
(Box
Collider)
para
detectar
cualquier
objeto
que
caiga
del
nivel.
Vamos
a
hacerla
muy
larga
y
amplia,
de
modo
que
si
un
jugador
intenta
utilizar
el
jetpack
mientras
cae,
todava
caiga
en
ella.
Sin
embargo,
Lerpz
tendr
un
lugar
para
reaparecer.
Iremos
a
los
puntos
de
reaparecer
en
breve.
En
primer
lugar,
vamos
a
construir
el
Box
Collider:
Crear
un
GameObject
vaco.
Cambie
el
nombre
del
nuevo
objeto
a
FalloutCatcher.
Aadir
un
Collider
Caja
al
objeto.
Aadir
el
script
Fallout
Death
del
men
Components->Third
Person
Props.
Utilice
el
inspector
para
establecer
los
valores
como
se
muestra
en
la
siguiente
imagen:
25
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
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
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
La
palabra
clave
static
significa
que
se
comparte
entre
todas
las
instancias
del
script.
Esto
nos
permite el
seguimiento
de
qu
punto
de
reaparecer
es
el
activo.
Sin
embargo,
cuando
la escena
comienza,
ninguno
de
los
puntos
se
activa,
por
lo
que
necesitamos
establecer
un
valor
predeterminado
para
nuestra
Escena.
El
Inspector
de
Unity
no
mostrar
variables
de
tipo
esttico
nunca,
por
lo
que
el
script
define una
propiedad
inicial
de
Reaparicin
(Initial
Respawn),
que
debe
ser
establecida
para
cada
caso.
Arrastre
el
punto
predeterminado
Reaparicin
a
este.
Tendrs
que
repetir
esto
para
todos
los
puntos
de
reaparicin
en
la
escena.
(En
el
tutorial,
el
valor
predeterminado
se
establece
en
Respawn1,
que
se
encuentra
cerca
de
la
crcel,
directamente
debajo
del
punto
de
partida
del
jugador.)
NOTA No
es
posible
establecer
estas
propiedades
directamente
en
el
Prefab
original.
Cuando
un
punto
de
reaparecer
es
activado
por
el
jugador
tocando
su
control
de
colisin,
el
script
de
ese
punto
de Reaparicin
primero
desactiva
el
punto
Reaparicin
viejo
y
luego
establece
currentRespawn
para
que
apunte
a
s
mismo.
La
funcion
SetActive
()
se
encarga
de
disparar
los
correspondientes
sistemas
de
partculas
y
efectos
de
sonido.
La
reaparicin
del
personaje
del
jugador
es
manejado
por
el
script
ThirdPersonStatus, que
gestiona
la
mayor
parte
del
estado
de
juego
del
jugador.
Aada
el
script ThirdPersonStatus al
GameObject
Player.
El
script
se
encuentra
en: Scripts-
>Player
Los
scripts
de
respawn
tambin
se
ocupan
de
los
efectos
de
sonido.
Estos
se
reproducen
como
oneshot (una sola vez),
con
excepcin
de
una
fuente
de
audio
adjunto
a
cada
uno
de
los
Prefab
Reaparicin.
Este
componente contiene
el
sonido
"activo",
que
es
un
bucle.
El
script,
simplemente
habilita
o
deshabilita este
sonido
dependiendo
de
si
tiene
que
reproducir
un
sonido
oneshot como
cuando
el
jugador
esta
reapareciendo
o
activando
el
punto
de
reaparicion
o
tambien
cuando
el
punto
de
reaparicion
ha
sido
desactivado.
NOTA Unity
hace
que
sea
demasiado
fcil
aadir
efectos
de
sonido.
Cada
vez
que
va
a aadir
un
asset
de
este
tipo,
considere
cuidadosamente
cmo
se
utilizar.
Por
ejemplo,
nunca
agregamos
un
sonido
de
"reaparicin
desactivado"
,
ya
que
nunca
lo
escucharia
cuando
el
sonido
se
reproduzca,
ya
que
es
poco
probable
que,
debido
a
la
posicin
de
los
puntos
de
reaparicion
estos
esten
al
alcance
del
odo uno
del
otro.
Si
usted
fuera
a
convertir
el
proyecto
en
una
partida
multijugador, puede
que
desee
aadir
un
sonido
y
el
script
necesario
para
manejarlo.
29
Configuracin
de
la
escena
Primeros
pasos
En
esta
seccin
veremos
la
construccin
del
mundo
de
juego
en
donde
la
accin
tiene
lugar.
En
la
terminologa
de
las
pelcula,
esto
significa
la
construccin
la
escenografia,
colocando
la
utilera
y
los
scripts
que
permiten
a
nuestro
hroe
interactuar
con
ellos.
Nuestro
primer
paso
es
preparar
el
escenario.
El
archivo
del
tutorial
ya
tiene
el
nivel
bsico
de
malla creado
y
poblado
de
con
una
serie
de
items
recolectables.
Pondremos
un
poco
ms de
accesorios
y
elementos,
pero
la
mayora
ya
se
ha
puesto,
ya
que
de
lo
contrario
este
seria
un
tutorial
mucho
mas
largo.
Iluminacin
El
nivel
ya
est
provisto
de
una
luz
ambiente,
as
como
muchas
luces
puntuales.
Estas
iluminan
el
paisaje,
el
jugador,
los
enemigos
y,
en
menor
medida,
los
items.
En
el
caso
de
este
proyecto,
las
luces
fueron
colocadas
por
el
artista
que
model
el
nivel.
La
Iluminacin desempea
un
papel
tan
importante
en
la
creacin
del
ambiente
que
es usual
dejar
esto
en
las
manos
del
modelador
que
construy
el
nivel.
30
Ubicacin de accesorios
El
escenario
bsico
se
proporciona
ya
listo
en
el
tutorial,
junto
con
una
serie
de
accesorios
ya
existentes.
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
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
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.
Script
para
los
items
de
recoleccin
En
el
momento
Lerpz
no
recoge
ninguno
de
los
items
del
nivel.
Esto
se
debe
a
que
a
Unity
no
se
le
ha
dicho
que
permita
que
nuestro
hroe
lo
pueda
hacer.
Tenemos
que
aadir
dos
elementos
a
cada
item:
Un
componente
de
Collider,
Un
script
para
manejar
y
actualizar
el
Collider
asi
como
la
salud
del
jugador,
etc
Los
artculos
de
recoleccin
en
el
panel
de
jerarqua
todos
son
instancias
de
Prefab,
que
se
muestran en
azul.
Mediante
la
edicin
del
Prefabricado
original
directamente,
se
actualizar
automticamente todos
los
elementos
en
el
juego.
Los
dos
prefabs
que
nuestro
hroe
puede
recoger
son
FuelCellPrefab
y
HealthPickUpPrefab.
Estos
se
pueden
encontrar
dentro
de
la
carpeta
Props
en
el
panel
de
proyectos.
Seleccione
el
objeto
raz
HealthPickUpPrefab.
Use
Components->Physiscs->Add
Sphere
Collider
para
aadir
un
Collider
esfera
a
los
Prefabs.
Por
ltimo,
active el checkbox is
Trigger.
33
El HealthPickUpPrefab en el Inspector.
NOTA Una
script
ObjectRotater
ya
est
linkeado
a
la
de
Prefab.
Esto
slo
hace
que
el
item
gire
sobre
el
terreno
y
es
muy
simple.
Vamos
a
ver
un
ejemplo
ms
complejo en
un
captulo
posterior.
Los
Collideres
tienen
dos
usos:
se
puede
golpear
con
otra
cosa,
o
se
puede
utilizar
como
desencadenantes
(trigger).
Triggers
Los
triggers
son
los
componentes
invisibles
que,
desencadenan
un
evento.
En Unity,
un
trigger
es
simplemente
un
collider,
con
su
propiedad
Is
Trigger
activada.
Esto
significa
que
cuando algo
choca
con
el
trigger,
va
a
actuar
como
un
conmutador
virtual
en
lugar
de
una
entidad
fsica.
Los
Triggers
enviarn
uno
de
tres
mensajes
de
sucesos
cuando
algo
los
activa:
onTriggerEnter
(),
OnTriggerStay
()
y
OnTriggerExit
().
Mensajes
de
eventos
de
triggers
se
envan
a
cualquier
script
adjunto
al
objeto
de
activacin,
por
lo
que
ahora tenemos
que
agregar
un
script
adecuado
a
nuestros
Prefabs
de
salud:
Vaya
al
men
de
Componentes
y
elija
el
script
Pickup
del
submen
Third
Person
Props. Esto
aadir
el
script
de
recogida
a
nuestro
Prefab.
Establezca
la
propiedad Pickup
Type a
Health
en
el
inspector.
Por
ltimo,
establezca
la
propiedad
Ammount
hasta
en
3
mas
o
menos.
Esta
es
la
cantidad
de
salud
que otorga
al
jugador.
34
Cunta Salud?
El
"HUD"
muestra
el
nivel
de
salud
actual
del
jugador,
la
vidas, etc,
slo
es
posible
manejar
un
nivel
de
salud
mximo
de
seis.
Qu
ocurre
si
el
jugador
recoge un item de
salud
cuando
ya
tiene
toda
la
barra
de
salud
completa?
Esta
es
una
cuestin
de
gusto, pero
para
el
tutorial
se
ha
optado
por
la
adicin
de
una
vida
extra.
La
lgica
de
esto
se
encuentra
en
el
script
ThirdPersonStatus.
Los
items
de
combustible
se
fijan
de
manera
muy
similar,
con
dos
diferencias:
El
valor
de
Pickup
Type debe
ser
FuelCell,
El
valor
de
Amount que
es
la
cantidad
de
combustible
que
el
item
representa
(1
suena
logico).
Plataformas
de
salto
Las
plataformas
de
salto
son
los
espacios
de
rayas
de
color
amarillo
brillante
y
negro
en
nuestro
nivel.
Estos
sirven
para
impulsar
a
Lerpz
en
el
aire.
Vamos
a
utilizar
un
Collider
con
un
script
adjunto para
este
fin.
En
primer
lugar,
cree
un
GameObject
vaco
y
llamelo
Jump
Pad
Triggers.
Vamos
a
utilizar
esto
como
una carpeta
para
guardar
nuestros
objetos
Jump
Pad
Triggers
juntos.
Ahora
vamos
a
construir
nuestro
Prefab:
Crear
un
GameObject
nuevo
vaco.
Cambie
el
nombre
de
este
objeto
a JumpPad
Trigger
1.
35
Aada
un
Box
Collider.
(Un
Sphere
Collider
funcionara
en
teora,
pero
el
Box
Collider
se
ajusta
mejor
a
la
forma
de
la
plataforma
de
salto.)
Establezca
el
Collider
como
un
Trigger.
Aada
el
script
JumpPad.
Ese
es
el
objeto
creado.
Ahora
tenemos
que
convertirlo
en
un
prefab:
Elija Prefab en
el
men Create encima
del
panel
del
proyecto.
Arrastre
y
suelte
el
game
object
Jump
Pad
en
el
Prefab
nuevo.
Cambie
el
nombre
de
Prefab
a JumpPad
Trigger.
Elimine
el
GameObject
original
de
nuestro
panel
de
la
Jerarqua.
Arrastre
un
Prefab JumpPad en
la
escena
y
la
posicinelo
en
uno
de
los
lugares
para
plataformas
de
salto.
(Hay
seis
lugares.
Se
recomienda
el
uso
del
layout
de
4
vistas
para
ayudar
con
el
posicionamiento.)
El
valor
por
defecto
del
campo Jump
Height es
de
5
no
es
suficiente
para
lanzar
a
Lerpz
hasta
el
nivel
del
jardn.
Se
sugiere
un
valor
de
alrededor
de
15-30 para
estas plataformas.
(El
ejemplo
de
proyecto
terminado
utiliza
un
valor
de
30.)
Por
ltimo,
active
la
tecla
Play
y
pruebe
el
juego
para
asegurarse
de
que
todos
nuestros
nuevos
triggers
funcionan
correctamente.
NOTA Los scripts
funcionan
de
manera
similar
a
los
Prefabs:
hemos
aadido
un
enlace
al
script
Pickup
en la
carpeta
Props
a
nuestro
Prefab.
Editar
la
version
de
nuestro
panel
de
proyecto
tambin afectar
a
las
copias
en
la
escena.
Una
buena
organizacin
es
importante
si
desea
que
su
flujo
de
trabajo
sea
suave
y
sin
problemas.
Use
instancias
prefabricadas
donde
sea
posible.
Trate
de
organizar
por
funcin
en
lugar
de
tipo.
Use GameObjects
vacos
como
contenedores
(Objeto
vaco
que
se
crea
como
padre
para
agrupar
objetos
del
mismo
tipo).
Usted
se
sorprender
de
cuantos
assets
se
necesitan
incluso
para
un
proyecto
de
baja
escala.
36
La interfaz de usuario
Los
juegos
suelen
tener
Interfaces
Grficas
de
Usuario
(GUI),
tales
como
mens,
pantallas
de
opciones
y
as
sucesivamente.
Adems,
los
juegos
suelen
tener
una
interfaz
grfica
encima
del
propio
juego. Esto
podra
ser
tan
simple
como
un
puntaje
que
aparece
en
una
esquina,
o
un
diseo
ms
elaborado con
iconos,
pantallas
de
inventario
y
barras
de
estado
de
salud.
El
HUD
durante
el
juego
Nuestro
juego
necesita
un
GUI
durante
el
juego
para
mostrar
la
salud
del
jugador,
vidas
restantes
y
el
nmero
de
celdas
de
combustible
que
necesita
para
escapar.
Los
elementos
grficos
ya
estn
incluidos en
nuestro
archivo
de
proyecto.
La
interfaz
grfica
de
usuario
se
maneja
dentro
del
script
GameHUD,
que
utiliza
el
componente
de
GUI
para exponer
los
distintos
elementos.
Este
script
necesita
estar
conectado
al
GameObject
Level, que
se
utiliza
para
tener
elementos
especificos
de
la
escena.
(Podramos
haberlo
aadido
tambien al
objeto
NearCamera
o
a
su
propio
"GameObject
GUI",
esto
es
principalmente
una
cuestin
de el
gusto
personal
en
lugar
de
una
clave
de
decisin
del
diseo
del
juego.)
Usaremos
el
GameObject
Level
para
administrar
Estados
especificos
del
nivel
y
otros
scripts.
El
objeto
GUI
Skin
En
Unity
el
sistema
de
GUI
incluye
soporte
para
skinning.
Esto
le
da
control
total
sobre la
apariencia
de
cada
elemento
de
la
GUI.
Construir
su
propio
contenido
de
la
GUI
Skin
le
permite
cambiar
la
forma
de
un
botn,
su
imagen,
su
fuente,
sus
colores
y
hacer
lo
mismo
a
todos
los
elemento
GUI,
desde
cajas
de
entrada
de
texto
a
travs
de
barras
de
desplazamiento,
e
incluso
ventanas
completas.
Ya
que
nuestra
GUI
de
juego
se
basa
por
completo
en
torno
a
imgenes
grficas,
vamos
a
construir
el
HUD
usando
la
funcion
GUI.Label
().
Sin
embargo,
necesitamos
utilizar un
tipo
de
letra
personalizado
para
nuestro
HUD,
con
el
fin
de
mostrar
las
latas
de
combustible
restantes
y
las
vidas.
El
asset
GUISkin
define
el
'look'
de
una
GUI
de
Unity,
tanto
como
un
archivo
CSS
define
el
aspecto
de
un
sitio
web.
El
objeto
es
necesario
si
es
necesario
cambiar
las
funciones
que
estan
por
defecto.
Cuando
cambiamos
el
tipo
de
letra,
tenemos
que
incluir
una
GUISkin
en
nuestra
escena.
Utilice
el
comando
de
men Assets para
crear
un
nuevo
objeto
GUI
Skin.
Este
aparecer
en
el
panel
de
proyectos
y
contiene
los
datos
de
la
GUI
Skin
que
viene
por
defecto
en
Unity.
Cambie
el
nombre
del
nuevo
objeto
GUI
Skin
a
LerpzTutorialSkin.
37
Vamos
a
utilizar
el
tipo
de
letra
denominada
"Fluoride",
para
nuestro
juego.
Este
es
el
nico
cambio
que
estamos
haciendo
al
skin
por
defecto.
Arrastre
el
tipo
de
letra
Fluoride
en
el
campo
Font
del
nuevo
GUI
Skin:
El
objeto
de
GUI
Skin
no
se
aade
al
panel
de
jerarqua,
sino
que
referenciamos
directamente
el
GUI
Skin
en
nuestro
script
GameHUD.
Junto
con
la
GUI
Skin,
el
script
GameHUD
tambin
necesita
que
le
digan
cuales
assets
utilizar
para
construir
la
pantalla
GUI.
Estos
incluyen
el
asset
GUIHealthRing.
La imagen GUIHealthRing
NOTA: Usted
puede
haber
notado
una
serie
de
advertencias
por
parte
de
Unity
sobre
las
imgenes
de que no son una
"potencia
de
dos"
de
tamao.
Muchas
tarjetas
grficas
prefieren
que
las
imgenes
tengan
tamaos en
potencias
de
dos,
independientemente
de
la
cantidad
de
los
datos
reales
de
la
imagen,
ya
que
esto
hace
que
los
clculos
subyacentes
sean
mas
rapidos
de
realizar.
Las
GUIs
rara
vez
necesitan este
nivel
de
optimizacin
y
los
assets
que
estamos
usando
por
lo
tanto
no
estan
optimizados.
Si
desea
averiguar
si
las
dimensiones
de
una
imagen
son
potencias
de dos,
simplemente
ponga
la
imagen
en
la
ventana
y
le
permitir
saber
si necesita
dicha
optimizacion.
Esta
imagen
se
utiliza
para
mostrar
informacin
de
salud
Lerpz.
El
espacio
a
la
derecha
de
Lerpz
muestra
la
imagen
de
sus
vidas
restantes,
mientras
que
el
crculo
a
la
izquierda
se
utiliza
para
mostrar
un
grfico
de
su
salud
restante.
El
grfico
se
crea
simplemente
con
la
superposicin
de
la
imagen
correcta
de
un
conjunto
de
seis
texturas
2D,
llamado
healthPie1
hasta
healthPie6.
La
imagen
healthPie5
se
muestra
a
continuacin:
38
La
imagen
healthPie5
NOTA Estas
imgenes
incluyen
los
canales
alfa
para
definir
la
transparencia
y
la
translucidez.
Usando
imgenes
separadas,
nos
permite
dibujar
la
imagen
correspondiente
al
estado
de
salud
actual
de
Lerpz.
El
segundo
elemento
de
la
GUI
muestra
el
estado
de
la
celda
de
combustible,
la
imagen
es
GUIFuelCell:
La
imagen
GUIFuelCell
Esto
se
muestra
en
la
esquina
inferior
derecha
de
la
pantalla
de
juego
y
mostrar
las
celdas
de
combustible pendientes
por
recuperar
antes
de
que
el
nivel
est
desbloqueado.
Aadir
el
script GameHUD al
GameObject
Level.
Haga
clic
en
el GameObject
Level
para
seleccionarlo
y
ver
el
Inspector.
Usted
debe
ver
el
componente
de
entrada
del
HUD
del
juego
(Script).
Aada
las
imagenes
GUIHealthRing
y
GUIFuelCell
al
script
GameHUD.
Abra
la
entrada
de
Imgenes
de
Health
Pie.
Health Pie Images
es
un
arreglo.
Por
el
momento,
Unity
no
sabe
lo
grande
que
debe ser,
por
lo
que
se
ha
fijado
en
cero.
Tenemos
seis
imgenes
de
pastel
de
salud
para
poner
en
este
arreglo,
por
lo
que necesitamos
cambiar
este
valor.
Haga
clic
en
el
"0"
al
lado
de
Tamao.
Cambielo
a
"6".
Ahora
debe
ver
seis
elementos
vacios,
con
nombres
del
elemento
0
al
elemento
5.
Abra
la
carpeta
GUI
assets
en
el
panel
de
proyectos
para
revelar
las
imgenes
de
la
salud
de
pastel. Hay
seis
de
ellas,
numeradas
del
1
al
6.
Las
computadoras
cuentan
desde
cero,
por
lo
que healthPie1 tiene
que
ir
en
el
elemento
0.
HealthPie2 tiene
que
ir
en
el
elemento
1
...
y
as
sucesivamente.
Arrastre
las
imgenes
en
sus
correspondientes variables.
Por
ltimo
agregue
el
GUI
Skin LerpzTutorialSkin en
la
ranura
vaca Gui
Skin. Los
ajustes
de
deben
ver
asi:
39
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
El
men
de
Inicio
Cada
juego
necesita
un
men
de
inicio.
Esto
se
muestra
cuando
se
inicia
el
juego
y
permite
que
el
Jugador
seleccione
diferentes
opciones,
cargar
una
partida
guardada
y,
lo
ms
importante,
comenzar
a
jugar
el
juego.
En
esta
seccin,
vamos
a
construir
un
men
de
inicio
desde
cero.
NOTA pantallas
de
Splash
y
los
mens
son
escenas
de
Unity.
As,
un
nivel
de
juego suele
ser
una
escena,
pero
una
escena
no
es
siempre
un
nivel
de
juego.
Utilizamos
scripts
en
una
Escena
para
cargar
y
ejecutar
otras
escenas
que
las
unen
entre
s.
Para
el
men
de
inicio,
vamos
a
necesitar:
Dos
botones
GUI
text:
"Play"
y
"Salir".
El
nombre
del
juego.
Esto
se
hizo
utilizando
una
tipografa
personalizada.
Algo
de
msica
adecuada.
Algun
tipo
de
fondo.
En
otras
palabras,
algo
como
esto:
El men de Inicio.
Configuracin
de
la
escena
El
primer
paso
es
crear
una
nueva
escena
vaca.
Escriba
CMD
+
N
en
Mac
o
Ctrl
+
N
en
la
PC,
para
crear
una,
a
continuacin,
CMD
+
S
o
Ctrl
+
S
para guardarla.
Nombrela
StartMenu.
Unity
aadir
automticamente
una
cmara
a
la
escena
para
nosotros, pero
no
hay
nada
para
ver
en
este
momento.
Ahora
vamos
a
utilizar
el
sistema
de
GUI
para
construir
un
men:
Ir
al
panel
de
proyecto
y
crear
un
archivo
JavaScript
en
blanco.
Cambiarle
el
nombre por StartMenuGUI y
abrirlo
en
el
editor.
41
En
primer
lugar,
vamos
a
aadir
una
directiva
de
script
de
Unity
.
Las
directivas
son
comandos
que
proporcionan
informacin
a
Unity o
instrucciones
adicionales
acerca
del
script.
Estos
comandos
no
son
parte
de Javascript,
como
tal,
sino
que
estan
destinados
a
Unity.
Usted
puede
encontrar
el
cdigo
de
script
completo
en
la
seccin
de
apndice.
En
este
caso,
queremos
que
Unity
ejecute
nuestro
script
dentro
del
editor,
de
modo
que
podemos
ver
los
resultados
de
inmediato
sin
tener
que
parar
y
volver
a
ejecutar el
proyecto
cada
vez:
// Make the script also execute in edit mode
@script ExecuteInEditMode()
Necesitamos
un
enlace
al
asset
LerpzTutorialSkin,
por
lo
que
la
primera
lnea
de
cdigo
ser
esta:
var gSkin : GUISkin;
Vamos
a
necesitar
un
objeto
texture2D
para
el
fondo.
(Vamos
a
poner
la
imagen
de
fondo
Aqu
en
el
inspector)
var backdrop : Texture2D; // our backdrop image goes in here.
Tambin
queremos
mostrar
un
mensaje
de
"Cargando
..."
cuando
el
jugador
hace
clic
en
el
boton
"Play" botn,
por
lo
que
necesitaremos
una
bandera
para
manejar
esto:
private var isLoading = false; // if true, we'll display the "Loading..." message.
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
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
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
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
SUGERENCIA La
msica
fue
creada
usando
loops
de
Apple
Loops
Orchestral
Jam
de
Apple
y
arregladas
en
GarageBand.
Para
usuarios
de
PC recomendamos
el
uso
de
Audacity.
Game
Over
46
No
necesitamos
aadir
nada
ms
a
la
escena
con
el
Editor:
la
cmara
por
defecto solo
ser
suficiente.
El
siguiente
paso
es
construir
el
script
(Usted
puede
encontrar
el
cdigo
de
script
completo
en
la
seccin
de
apndice):
Crear
un
asset
Javascript
nuevo
y
darle
el
nombre
"GameOverGUI"
Abrirlo
en
el
editor
y
aadir
el
cdigo
se
describe
a
continuacin:
Al
igual
que
con
el
men
Inicio,
queremos
ser
capaces
de
ver
nuestra
interfaz
grfica
de
usuario
en
el
editor
de
Unity,
incluso , cuando
el
proyecto
no
se
ejecuta,
por
lo
que
debemos
aadir
lo
siguiente:
@script ExecuteInEditMode()
Para
el
men
de
inicio,
hemos
utilizado
el
asset
GUI
Skin
LerpzTutorialSkin.
La
GUI
Skin
define
un
montn
de
estilos
de
GUI
y
nos
permite
aplicarlos
a
una
interfaz
grfica
de
usuario
al
por
mayor.
Una
tcnica
alternativa
es
definir
los
objetos
individuales
de
estilo
GUI
directamente.
Haremos
esto
para
el
script
Game
Over
definiendo
tres
variables
GUIStyle
que
luego
podemos
poner
en
el
Inspector,
junto
con
dos
variables
que
definen
la
escala
de
los
elementos
de
texto:
var background : GUIStyle;
var gameOverText : GUIStyle;
var gameOverShadow : GUIStyle;
Vamos
a
establecer
estos
objetos
de
GUI
Style
en
el
Inspector
dentro
de
poco.
A
continuacin,
debemos
definir
factor
de
escala
del
texto
para
nuestro
mensaje
"Game
Over",
ya
que se
hizo
ms
grande
que
el
tamao
de
fuente
por
defecto.
47
Vamos
a
dibujar
este
mensaje
dos
veces,
en
dos
colores
diferentes,
para
dar
un
efecto
de
sombra,
por
lo
que
vamos
a
definir
dos
variables:
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:
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.
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);
}
48
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.)
A
continuacin,
establezca
la
escala
del
Game
Over
a
1,69.
49
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
El
toque
final
consiste
en
aadir
un
segundo
script
a
la
Main
Camera
que
comprueba
si
la
msica
ha
terminado
de
sonar
y,
de
ser
as,
carga
la
escena
del
men
Inicio.
Crear
un
nuevo
asset
Javascript
Script.
Nombre
que
GameOverScript.
Abra
el
script
en
el
editor
y
agregar
el
siguiente
cdigo
(Usted puede
encontrar
el cdigo
del
script
en
la
seccin
del
apndice):
function LateUpdate ()
{
if (!audio.isPlaying || Input.anyKeyDown)
Application.LoadLevel("StartMenu");
}
Este
cdigo
comprueba
si
el
audio
ha
terminado
de
sonar,
o
si
el
jugador
ha
presionado
una tecla
antes
de
cargar
la
escena
"StartMenu".
Aadir
GameOverScript
a
la
Main
Camera
y
listo:
terminamos
el
GUI!
51
Adversarios
Ningn
juego
est
completo
sin
adversarios.
En
este
captulo,
se
aaden
los
enemigos
de
Lerpz
para
luchar.
Contendientes
Estos
dos
elementos
son
fundamentales
para
cualquier
juego,
as
que
necesitamos
algo
para
mantener
a
Lerpz
alerta.
El
trabajo
del
diseador
del
juego
es
lanzar
los
obstculos
en
el
camino
del
jugador, pero
de
una
forma
que
sean
superables. Lerpz
se
enfrenta
a
dos
adversarios:
los
guardias
robot
y
las
barreras
lser.
Las
Trampas
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
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
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
Sintase
libre
de
variar
las
propiedades
del
script
LaserTrap
y
experimente
hasta
obtener
un
resultado
con
el
que
este
satisfecho.
El
Script
Laser
Trap
La
clave
de
la
trampa
lser
es
el
script
LaserTrap,
as
que
vamos
a
echar
un
vistazo
ms
de
cerca
...
Descripcin
general
La
trampa
lser
es
un
componente
Line
Renderer
que
se
mueve
hacia
arriba
y
hacia
abajo
gracias
al
script.
Este
mismo
script
tambien
controla
las
colisiones
y
dispara
los
efectos
visuales
necesarios
En
primer
lugar,
definamos
algunas
propiedades
bsicas
de
nuestra
trampa
lser:
height
(altura) define
la
amplitud
de
la
oscilacin,
dictando
hasta
qu
punto
por
encima
y
por
debajo
del
punto
de
partida
el
rayo
lser
viajara;
speed
(velocidad) define
qu
tan
rpido
se
mueve
el
haz;
timingOffset nos
permite
configurar
cada
objeto
de
trampa
lser
para
que
comience
en
un
punto
diferente
en
su ciclo
de
oscilacin;
laserWidth define
el
ancho
del
haz
de
lser
desde
un
extremo
a
otro;
damage
(daos) define
el
dao
que
el
jugador
sufrir
si
se
encuentra
con
el
haz.
hitEffect,
puede
ser
utilizado
para
conectarlo
a
un
GameObject
cualquiera,
que
ser
instanciado
cuando
algo
le
pegue
al
lser.
Esto
es
ms
flexible
que
codificando el
efecto
en
el objeto
Laser
Trap
y
hace
ms
fcil
la
reutilizacin
de este
asset
en
otros
proyectos.
El
script
define
dos
funciones:
La
funcion
de
Start()
inicializa
el
componente
Line
Renderer,
almacenando
su
ubicacin
inicial
(en
el
eje
Y)
para
ms
tarde,
y
estableciendo
de
segundo
vrtice
del
Line
Renderer
para
que
coincida
con la
posicin
definida
por
laserWidth.
Esto
nos
permite
ajustar
fcilmente
la
longitud
del
haz
a que
coincida
con
el
ancho
del
corredor.
Ahora
llegamos
a
la
funcion
principal
Update
().
Aqu
es
donde
las
cosas
interesantes suceden.
En
primer
lugar,
tenemos
el
movimiento
del
rayo
lser
para
calcular.
Nos
limitamos
a
usar
la
funcion
Mathf.Sin
().
Cogemos
la
hora
actual
usando
Time.time,
(que
devuelve
el
tiempo,
en
segundos,
desde
que
el
juego
comenz),
se
multiplica
por
la
velocidad
de
animacin
deseada y
se
aade
en
el
valor
timingOffset.
Esto
nos
da
nuestra
posicin
a
lo
largo
de
la
curva
sinusoidal.
Por
ltimo, la
modulamos
por
nuestra
altura
deseada
y
usamos
el
resultado
como
un
offset
de
nuestra lnea
base.
El
siguiente
paso
es
revisar
las
colisiones.
El
script
lanza
un
rayo
a
lo
largo
de
la ruta
del
laser
y
comprueba
si
golpea
cualquier
GameObject
que
tenga
un
componente
Collider
unido
a
ellos.
Si
chocamos
con
algo,
revisamos
si
se
trata
de
un
jugador
o
un
enemigo
y,
en
caso
afirmativo,
se
enva
el
mensaje
"ApplyDamage".
Al
mismo
tiempo,
tambin
se
instancia
el
GameObject
hitEffect
para
que
realice
su
accion.
Esta
es
el
GameObject
LaserHit,
que
produce un
efecto
de
explosin
de
energa:
55
Si
se
juega
el
tutorial,
usted
debe
encontrar
que
Lerpz
pierde
un
punto
de
salud
si
toca
el haz
del
lser.
Los
Guardias
Robot
Los
contrincantes
mviles
son
guardias
robot,
colocados
estratgicamente
en
todo
el
nivel.
Cundo Lerpz
esta
dentro
de
su
rango,
estos
guardias
le
seguiran
y
trataran
de
hacerle dao.
Un guardia robot.
Los
enemigos
de
Lerpz
en
el
juego
son
los
guardias
robot.
Podemos
determinar
que:
Los Robots
tendrn
una
IA
bastante
rudimentaria.
Los
robots
sueltan
items
cuando
son
derribados.
Robots
reaparecern
cuando
el
jugador
no
puede
verlos.
Buscar
y
destruir
La
mayora
de
la
IA
del
juego
se
centra
principalmente
en
el
modelado
de
comportamiento
y
no
en
la
inteligencia
como tal.
Nuestros
robots
reaccionan
en
formas
predecibles
a
la
presencia
del
jugador.
Se
les
da
una
pauta
para
buscar
y
esto
hace ms
fcil
el
aprender
a
vencer
a
los
robots.
Los
guardias
robot
por
lo
tanto
tienen
un
patrn
de
comportamiento
muy
simple
y
esto
se
refleja
en el
script
de
IA,
EnemyPoliceGuy.
56
Idle
--
En
este
modo,
los
guardias
se
quedan
quietos,
en
silencio
y
esperan
a
que
un
intruso
entre
en
su
rango.
Threaten -- Si un
intruso
entra
a
una
determinada
distancia
del
guardia,
el
sale
del
de
modo
de
espera
y
anuncia
sus
intenciones,
girando
su
bastn
de
mando
de
una
"forma
amenazante".
Seek
&
Destroy
Una
vez activados,
los
guardias
robots
atacan
dentro
de
un
rango,
la Guardia
tratar
de
golpear
con
su
bastn
de
mando.
Struck
Si el
jugador
golpea
al
guardia
robot,
se
activa
esta
animacin.
(
"Gothit"
en
el modelo
y
script.)
Si
el
jugador
se
mueve
fuera
del
rango
de
exploracin
del
robot,
el
robot
se
volver al
modo
idle.
Los
estados
antes
mencionados
son
manejados
por
la
secuencia
de
comandos
EnemyPoliceGuy,
que
tambin
se
ocupa
del
cambio
entre
las
secuencias
de
animacin.
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
Nacimiento y optimizacin
El
nacimiento
de
enemigos
cuando
estn
dentro
de
una
distancia
determinada
del
jugador
es
un
viejo
truco que
data
de
los
primeros
juegos
de
vdeo,
asi,
se
elimina
la
necesidad
de almacenar
el
estado
de
cada
enemigo.
Tambin
podemos
usar
este
truco
para
reducir
la
carga
en
el
procesador. Simplemente
borrando
cada
robot
si
no
es
visible
para
el
jugador,
se
puede
evitar
la
utilizacin
de scripts
e
IA
innecesaria.
58
Empecemos:
crear
un
GameObject
vaco
en
el
nivel
superior
del
panel
de
la
Jerarqua.
Cambiarle
el
nombre
por
CopperSpawn.
Arrastre
el
script EnemyRespawn sobre
el
objeto.
Posicione
nuestro
objeto CopperSpawn en algn
lugar
donde
le
gustara
ver
a
un
robot
aparecer.
Ajustar
la
configuracin
del
objeto,
como
se
muestra.
Ajustes CopperSpawn.
Vamos
a
necesitar
varios
de
estos
Game
Objects,
as
que
vamos
a
crear
un
GameObject parent
Para
que
los
CopperSpawn
sean
sus
hijos
...
Cree
un
GameObject
vaco
en
el
nivel
superior
del
panel
de
la
Jerarqua.
Cambie
el
nombre
a Enemies.
Hacer
los GameObjects
CopperSpawn hijos
de
Enemies.
Ahora,
construya
un
prefab
con
nuestro
GameObject CopperSpawn.
Ponga
instancias
de
estos
en
todo
el
nivel.
Cmo
funciona.
Los
GameObjects
CopperSpawn
contienen
un
script
que
comprueba
si
el
jugador
ha
llegado
Al
rango
previsto
y,
si
es
as,
crea
una
instancia
del
Prefab
Copper.
Cuando
el
jugador
camina
fuera
de
este
rango,
nuestro
script
automaticamente
eliminara
el
robot
de
la
escena.
El
script
que
hace
esto
es
EnemyRespawn.
Las
dos
funciones
principales
son:
Start
()
slo guarda en cach
un
enlace
al
transform
del
Game
Object
del
jugador
veremos
ms
adelante.
Update
()
En
primer
lugar comprueba
si
el
jugador
esta
en
el
rea
y
crea
una
instancia
del
robot
si
es
as.
Si el
jugador
acaba
de
dejar
la
zona,
se
destruye
el
robot
prefabricado.
NOTA El
icono
de
imagen
se
encuentra
actualmente
almacenado
en
la
carpeta
[ProjectPath]
/
Assets
/
Gizmos
59
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.
60
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
Introduccin
Cuando
usted
compra
un
CD
o
ve
una
pelcula,
el
sonido
que
se
oye
siempre
ha
pasado a
travs
de
una
serie
de
etapas,
la
ltima
de
las
cuales
es
conocido
como
el
masterizado.
El
masterizado
es
el
arte
de
escuchar
el
audio
en
su
conjunto
y
ajustar
los
niveles
de
volumen,
filtrado
las
frecuencias
y
cualquier
nmero
de
otros
trucos
tcnicos
para
hacer
la
mezcla
final
de
sonido
suene
lo
mejor
posible.
A
veces
el
proceso
corrige
de
errores
evidentes
en
proceso
un
nmero
musical
o
banda
sonora,
como
un
instrumento
que
est
demasiado
alto
o
suena
demasiado
brusco.
En
otras
ocasiones,
el
proceso
slo
se
utiliza
para
garantizar
la
banda
sonora
suene
bien
atravez
de
el
altavoz
de
un
televisor
barato sin
comprometer
el
sonido
que
se
escucha
en
un
sistema
de
sonido
de
cine
en
casa
o
home
theater.
Los
juegos
no
son
diferentes:
una
vez
que
el
gameplay
basico
est
en
su
lugar,
tiene
sentido
gastar algo
de
tiempo
modificandolo
y
ajustandolo
hasta
que
sea
tan
bueno
como
sea
posible.
Audio
La
finalizacin
y
masterizada
de
audio
para
juegos
es
una
tarea
dificil.
Los
juegos
son
interactivos
a
diferencia
de
otras
formas
convencionales
de
entretenimiento
las
cuales
son
pasivas
y
lineales.
Esto
significa
que
usted
necesita considerar
cmo
los
assets
individuales
de
audio
en
el
proyecto
van
a
interactuar
entre
si,
y
si
es
necesario, realizar
algunas
tareas
de
masterizacin
y
mezcla
usted
mismo.
Esencialmente
el
masterizado
es
una tarea en tiempo real
que
debe
ser
manejada
dentro
de
la
lgica
del
juego
en
s.
En
un
mundo
ideal,
todos
los
desarrolladores
tendrian
acceso
a
su
propio
ingeniero
de
audio,
pero
este
es
el
mundo
real,
y
para
muchos
proyectos
de
pequea
escala esto seria simplemente
imposible.
La
consideracin
ms
importante
es
asegurar
cada
sonido
en
el
proyecto
sea
coherente
con
todos
sus
compaeros.
Este
es
un
proceso
subjetivo,
como
algunas
personas
les
gusta
mucho
el
bajo,
mientras
que
otros prefieren
sonidos
de
alta
frecuencia,
as
que
es
una
buena
idea
usar
la
retroalimentacion
de
testes para
obtener
una
mezcla
de
puntos
de
vista
objetivos
sobre
los
sonidos
de
su
proyecto.
Idealmente,
usted
necesita
utilizar
el
audio
de
una
sola
fuente,
mezclado
por
el
mismo
par
de
oidos,
por
lo
que usted
consigue
un
sonido
consistente.
En
el
caso
de
este
tutorial se deben
utilizar
un
montn
de
diferentes fuentes
de
audio,
hay
que
estar
preparado
para
una
gran
cantidad
de
retoques
en
la
configuracin
para
lograr
que
los
sonidos suenen bien dentro de la
mezcla.
Un
efecto
de
sonido
sobresaturado(muy
duro)
ser
muy
evidente para los
jugadores
y
62
podra
llegar
a
ser
irritante
si
se
escucha
con
frecuencia.
Pruebe el juego con frecuencia y este listo
para separar tiempo para realizar estos ajustes.
Notas
Unity
tiene
una
interfaz
bastante
simple
para
el
audio,
pero
hay
algunas
cosas
importantes
para
tener
en
cuenta:
Asegrese
de
que
los
efectos
de
audio
tengan
niveles
similares.
Esto
hace
que
los
niveles
de
volumen
y
la
atenuacin sean mucho
ms
consistentes.
La
normalizacin
puede
ayudar
aqu,
pero
tambin
debe
considerar
cmo sus
sonidos
se
mezclan.
Demasiados
efectos
de
sonido
ruidosos
confundiran
la jugador.
Utilice
efectos
de
sonido
mono
si
necesita
posicionar
el
sonido
de
forma
realista
en
un
mundo
3D.
Comprima
los
efectos
de
audio
utilizando
el
sistema
de
compresin
Ogg
Vorbis.
(Unity
puede
hacer
esto
por
usted.)
Si
el
juego
es
para
web,
siempre
se
debe
comprimir
tus
sonidos
usando
Ogg
Vorbis.
Marque
la
casilla
"Decompress
on
load"
para sonidos cortos que se usan frecuentemente.
Utilice sonidos en stereo solo para
larga
piezas
musicales
que
no
necesitan
ser
colocadas
espacialmente
dentro
de
la
escena.
Los
sonidos
de
esta
clase
siempre
se
reproducirn
tal
como
son,
en el
volumen
de
audio
predeterminado
de
el
Audio
Listener.
Ya
hemos
aadido
algunos
pocos
efectos
en
el
juego.
En
este
captulo
vamos
a
aadir un
poco
ms
de
audio
a
nuestro
juego
y
completar
el
proceso.
Para
muchos
gneros
de
juegos,
los
efectos
de
sonido
se
pueden
obtener
a
partir
de
fuentes
reales,
o
sacados
de
una
biblioteca
de
efectos
de
sonido.
Sin
embargo,
Lerpz
Escapes!
necesita
algunos
efectos
de
sonido
que
no
pueden
obtenerse
tan
fcilmente.
Apuntando
con
un
micrfono
en
una
nave
espacial
que
pasa
o
un
conveniente
guardia
robot
no
es
una
opcin,
as
que
tendremos
que
pensar
de
manera
creativa
acerca
de
estos.
No
vamos
a
agregar
todos
los
efectos
de
sonido
posibles
para
el
juego
en
este
captulo,
slo
lo
suficiente para
demostrar
las
caractersticas
de
audio
de
Unity.
Una
vez
que
haya
ledo
este
captulo,
usted ser
capaz
de
aadir
efectos
de
sonido
adicionales
por
su
cuenta.
La
lista
completa
de
efectos
de
sonido
que
necesita
el
juego
es:
El
jugador:
Sonidos
Caminar
/
Correr.
Sonido
de
ataque.
Sonido
de
golpe
recibido.
Sonido
de
muerte de personaje.
Sonido
de
propulsores
del
Jetpack.
La
Guardia
Robot:
Sonido de ocio.
Sonido
de ataque.
Sonido
de
golpe
recibido.
Sonidos
de
Muerte
/
Explocion;.
Items:
Sonido
de
cogida
de
pila
de
Combustible.
Sonido de cogida de item de salud.
Los
sonidos
ambientales:
Un
sonido
largo
en
loop
para
dar
una
sensacin
de
ambiente.
Un
sonido
de
zumbido
para
las
almohadillas
de
salto.
Cerca
de
la
nave
espacial:
Sonido de activacion.
63
Sonido de apagado.
La
nave
espacial:
Sonido de despegue para
reproducir
en
el
cinema.
Ya
hemos
agregado
algunos
efectos
de
sonido
a
nuestro
juego,
pero
todava
tenemos
que
aadir
ms
de quince
ms.
Algunos
de
estos
sonidos
fueron
tomados
de
el
mundo
real,
como
los
pasos
del
jugador y
los
propulsores
del
jetpack.
Algunos
de
los
sonidos
de
otros
son
tambien
sacados
del
mundo
real
pero
reacondicionados
para
nuestras
necesidades.
(El
sonido
pickupFuel,
por
ejemplo,
es
slo
el
sonido
de
una
pelota
de
golf
al ser golpeada por el
palo.)
Estos
sonidos
pueden
encontrarsen
en
casi
cualquier
biblioteca
de
efectos
de
sonido.
GarageBand
de
Apple, Logic
Studio
8
y
Soundtrack
/
Soundtrack
Pro
incluyen
este
tipo
de
sonidos y
estas
bibliotecas
fueron
la
fuente
de
la
mayora
de
los
efectos
de
sonido
en
este
tutorial.
Muchos de
estos
sonidos
estan
disponibles
en
linea,
muchas
veces
gratis!
Sonidos
de
Ambiente
Nuestro
juego
se
desarrolla
en
un
medio
ambiente
por
encima
de
las
nubes
con
una
impresionante
vista
de los
planetas
cercanos.
Este
lugar
fuera
de
este
mundo
necesita
una
adecuada
ambientacion
sonora para
mejorar
la
sensacin
de
inmersin
en
el
juego.
El
proyecto
incluye
un
loop
de
sonido
ambiental
llamado
sceneAtmosphere.
La
muestra
se
agrega
al
objeto
Near
Camera
en
el
panel
de
la
Jerarqua.
Arrastre y suelte el efecto de sonido dentro de el objeto Near Camera. Unity creara
automaticamente un componenet Audio Source.
Ajuste
su
configuracin
como
se
muestra
a
continuacin:
64
El
componente
Audio
Source
incluye
los
controles
bsicos
que
nos
permiten
decir
cmo
Unity
maneja
el
efecto
de
sonido
ya
sea
a
travs
de
el
Inspector
o
a
travs
de
scripting.
En
este
caso,
activamos
la
opcion
Play
On
Awake
para
que
el
sonido
empieze
a
reproducirse
automticamente. El
nivel
de
volumen
es
deliberadamente
bajo
ya
que
es
un
sonido
de
ambiente
de
fondo
y
no
queremos
distraer
la
atencin
de
los
otros
sonidos
en
el
juego.
Echemos
un
rpido
vistazo
a
lo
que
los
valores
restantes
significan:
El
Pitch
define
la
rapidez
con
la
que
el
sonido
se
reproduce
,
siendo
1
la
velocidad
normal.
El
algoritmo
usado
es
basico,
similar
a
una
grabadora;
un
valor
de
2
aqu
reproduciria
la
muestra
a
el
doble
de
su
velocidad
normal.
SUGERENCIA El
ajuste
de
Pitch
es
til
para
efectos
de
sonido
cortos
ya
que
usted
puede
ajustar
el
valor
ligeramente
con
cada
reproduccin
para
aadir
variedad
a
los
sonidos.
Es
ideal
para
disparos,
los
lseres
y
los
pasos
y
evita
as
la
necesidad
de
tener
que
crear mltiples
efectos
de
sonido.
Despues
estan
los
valores
que
definen
el
rango
de
volumen
de
el
sonido.
Si
quisiramos
que
el
clip
fuera
inaudible
cuando
estamos
muy
lejos
de
su
fuente,
Min
Volume
se
establece
en cero.
Como
su
nombre
indica,
Max
Volume
es
el
mximo
volumen
del
sonido.
Podramos pararnos
sobre
la
fuente
de
sonido
y
no
se
escucharia
mas
duro
que
este
valor.
Luego
viene
el
Rolloff
factor,
que
determina
lo
rpido
que
el
volumen
del
sonido cambia
relativo
a
la
distancia
del
oyente.
Un
valor
ms
pequeo
significa
que
el
sonido
sera audible
sobre
una
distancia
mayor.
Esta
configuracin
es
clave
para
asegurar
un
comportamiento
foneticamente
realista
en
el
juego.
NOTA Es
importante
asegurarse
de
sonidos
en
loop
esten
diseados
para
un
loopeo
limpio,
de
lo
contrario
lo
ms
probable
es
que
escuche
un
clic
o
pop
cada
vez
que
se
reinicia
la
reproduccin
desde
el
comienzo
de
la
muestra.
La
mayora
de
los
editores
de
audio
incluyen
una
funcion
llamada
"Find zero crossings
"
para
este
fin.
Plataformas
de
salto
Cuando
se
construy
el
Prefab
JumpPad,
ignoramos
su
efecto
de
sonido.
Ahora
vamos
a agregar
uno.
Pero,
cmo
vamos
a
reproducirlo?
Por
suerte,
el
script
del
JumpPad
ya
tiene
soporte
para
un
efecto
de
sonido.
Si
abre
el script
en
el
editor,
ver
el
cdigo
de
reproduccin
de
aqu:
...
if (audio)
{
audio.Play();
}
...
La
variable
de
audio
no
parece
estar
definida
en
el
script,
as
que
dnde
viene esta?
Viene
de
el
mismo
Unity.
Esta
es
una
variable
de conveniencia, una entre
un
nmero
de
tales
variables,
que simplemente
apunta
hacia
el
componente
de
Audio
Source
conectado
a el
GameObject
en
el
cual
se
encuentra
el
script.
Como
no
hemos
aadido
uno
de
estos
Componentes,
la
variable
audio
ser
nula,
por
lo
que
el
script
se
salta
la
reproduccin.
65
Haga
clic
en
una
de
las
instanias
de
plataformas
de
salto
en
al
escena
para desplegar el
inspector de este GameObject.
Arrastre
el
efecto
de
sonido
jumpPad
hacia
el
inspector.
(Esto
crear
automticamente
un
componente
de
Audio
Source.)
Aplicar
el
cambio
a
la
Prefab
original,
as
que
todas
nuestras
plataformas
de
salto
puedan
compartir
el
mismo
efecto
de
sonido.
Experimente
y
ajuste
la
configuracin
de
la
fuente
de
audio
hasta
que
est
satisfecho
con
el
efecto
de
sonido.
Items
Los
items
son
los
ms
fciles
de
tratar.
Estos
efectos
de
sonido
son
pickupFuel y
pickupHealth
para
las
cldas
de
combustible
y
items
de
la
salud,
respectivamente.
La
incorporacin
de
estos
efectos
es
la
simplicidad
misma:
el
script
de
recogida
ya
tiene
soporte
para
audio,
slo
necesitamos arrastrar el efecto de sonido relevante
hacia
el
espacio
correspondiente
para cada tipo
de item.
La
imagen
de
abajo
muestra
los
detalles
del
Inspector
para
FuelCellPrefab
de una de las
instancias en el nivel,
con
el
efecto
de
sonido
pickupFuel
aadido
a
la
variable
de
sonido
de
recogida
de
el
script:
Agregue
el
audio
ya
sea
arrastrando
el
efecto
de
sonido pickupFuel hacia
la
variable sound,
o
seleccionando
el
efecto
de
sonido
directamente
desde
la
lista
de
disponibles efectos
de
sonido
que
se
puede
abrir
haciendo
clic
en
el
pequeo
tringulo
a
la
derecha
de
la variable.
Establecer
el sound
volume a
2,
para
hacer
que
el
efecto
de
sonido
se
destaque.
Aplicar
el
mismo
proceso
para
el
item
de
la
Salud,
utilizando
el
ejemplo
de pickupHealth.
66
Sugerencia Puede agregar el efecto de sonido directamente a el prefab para ahorrar tiempo.
Si
usted
juega
el
juego
ahora,
cada
item
debera
reproducir
el
sonido
apropiado cuando
este
se
recoja.
La
cerca
El
campo
de
fuerza
que
rodea
la
nave
espacial
debera
hacer
un
zumbido,
ruido
de
efervescencia
mientras
est
activo.
El
efecto
de
sonido
se
llama
activeFence.
vaya
al
panel
de
jerarqua,
despliegue levelGeometry
y
encontrara
el
objeto
impoundFence.
Arrastre
el
sonido activeFence directamente
a
este
objeto.
Esto
aadir
un
componente
de
Audio
Source
a
el
objeto
impoundFence.
Por
ltimo,
cambie
la configuracin
de
Audio
Source
de
la
siguiente
manera:
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
Este
fragmento
de
codigo
comprueba
si
un
efecto
de
sonido
para
el
puetazo
se
ha
facilitado
a
el
script.
Si
es
as,
que
usa la funcion
PlayOneShot
()
para
reproducir
el
sonido.
Esta
funcin
crea
un
GameObject
temporal
con
un
componente
de
fuente
de
audio,
lo
agrega
a
la
escena
y
lo
reproduce.
Cundo
el
efecto
de
sonido
se
termina,
el
GameObject
es
retirado
de
la
escena.
NOTA Mientras
que
el
juego
se
est
ejecutando,
ver
estos
sonidos
aparecer
brevemente
en
el
panel
de
la
Jerarqua.
Este
comportamiento
es
normal.
Sonidos
de
golpeado
y
grito
El
script
Third
Person
Status
maneja
dos
efectos
de
sonido:
el
que
reproduce
cuando Lerpz
es
golpeado
por
un
enemigo,
y
el
que
reproduce
cuando
Lerpz
muere
(justo
antes
de
que
renasca
o
el
juego
termine).
Ambos
efectos
de
sonido
son
manejados
de
la
misma
manera
como
el efecto
de
sonido
"lerpzPunch
que
agregamos
anteriormente.
Aada
los
sonidos
LerpzStruck
y
LerpzScreamSFX
como
se
muestra
a
continuacin:
68
Agregar los efectos de sonido a las variables Struck sound y Deatrh Sound.
El
Jetpack
El
jetpack usa un efecto
de
sonido
en
loop,
en
lugar
de
un
oneshot,
as
que
vamos
a
aadir
el
efecto
de
sonido
a
el
GameObject
del
Player
directamente
como
un
componente
de
fuente
de
audio.
El
controlador
de
partculas
de
el
Jetpack
crear
automticamente
un
componente
de
fuente
de
audio
vaco, pero
tenemos
que
agregar
el
archivo
de
audio
a
el
mismo:
Arrastre
el
archivo
de
audio thrusterSound hacia el
componente
de
fuente
de
audio
dentro
de
el GameObject
del
Player.
Asegrese
de
que
la
configuracin
de
fuente
de
audio
sea
como
se
muestra:
69
Hay
dos
secciones
de
script
para
controlar
este
efecto
de
sonido,
los
cuales
estn
en
el script
Jet
Pack
Particle
Controller.
La
primera
seccin
va
en
la
funcin
start
()
e inicializa
el
componente
fuente
de
audio:
audio.loop = false;
audio.Stop();
El
segundo
bloque
est
ms
abajo
en
la
misma
funcin:
if (isFlying)
{
if (!audio.isPlaying)
{
audio.Play();
}
}
else
{
audio.Stop();
}
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
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
Cut
Scenes
Los
cutscenes o cinemas proporcionan
un
medio
til
para
tener
al
tanto
al
jugador
de
un
evento
en
la
historia.
En este tutorial tenemos 2 cutscenes.
La
primera
ocurre
cuando
el
jugador
se
las
arregla
para
recoger
todas
las
pilas
de
combustible
necesarias
para
el
nivel,
lo
cual
desbloquea
la
nave
espacial.
Esta
escena aparece
en
un
picture-
in-picture
o
recuadro,
de
modo
que
el
jugador
puede
continuar
jugando
mientras
la
secuencia
se
reproduce.
Una
de
las
razones
muy
pragmticas
para
no
usar
toda
la
pantalla
para
esta
escena es
que
de
otro
modo
tendra
que
congelar
todos
los
elementos
de
juego
de
los
robots, el jugador, controles,
etc,
mientras la
escena se reproduce,
porque
el
jugador
quedaria
ciego hasta
que
la
escena
termine.
La
segunda
escena se
produce
cuando
el
jugador
toca
la
nave
espacial
despus
que
la
cerca
ha
sido
desactivada.
Esta
escena
se
reproduce
en
pantalla
completa, vemos
la
nave
espacial
despegando
y
volando
hacia
la
libertad
antes
de
pasar
a
la
secuencia
de
Game
Over.
Echemos
un
vistazo
a
la
primera
escena
en
detalle
...
72
Desbloqueo
de
la
cerca
Nos
topamos
con
la
cerca
por
primera
vez
cuando
agregamos
animaciones
a
esta
misma
,
en
este
capitulo
le
agregamos
sonidos,
ahora
vamos
a
animarla.
Pero
primero,
tenemos
que
asegurarnos
de
hacer
esto
cuando
hemos
recogido
todas
nuestras
latas
de
combustible
(Usted
puede
encontrar
el
cdigo
de
script
completo
en
la
seccin
de
apndice):
Abra
el
script ThirdPersonStatus y
busque
dentro
de
el
la
funcion
FoundItem
().
Despus
de
el
bloque
de
comentarios,
agregue
las
siguientes
lneas
de
cdigo.
(Asegrese
de
que insertar
antes
de
la
llave
de
cierre
de
la
funcin
'}' o
no
funciona!)
if (remainingItems == 0)
{
levelStateMachine.UnlockLevelExit(); // ...and let our player out of the level.
}
Guardar
el
script.
Abrael
script
LevelStatus.
Aqu
es
donde
tanto
las
escenas se
controlan
(Usted puede
encontrar
el
cdigo
de
script
completo
de
apndice).
En
la
parte
superior
de
el
script,
agregue
el
siguiente
cdigo:
var
var
var
var
var
var
var
exitGateway: GameObject;
levelGoal: GameObject;
unlockedSound: AudioClip;
levelCompleteSound: AudioClip;
mainCamera: GameObject;
unlockedCamera: GameObject;
levelCompletedCamera: GameObject;
NOTA El
cdigo
anterior
incluye
variables
que
necesitaremos
para
la
segunda
escena tambin.
A
continuacin,
aada
la
siguiente
lnea
de
cdigo
de
script
a
la
funcion
Awake
():
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
La
cerca
tiene
un
efecto
de
sonido
en
loop
asignado
a
ella.
Tenemos
que
detener
la
reproduccion
de
el
sonido ahora:
exitGateway.GetComponent(AudioSource).Stop();
Ahora
podemos
empezar
a
reproducir
nuestro
sonido
de
"cerca
desactivada"
:
if (unlockedSound)
{
AudioSource.PlayClipAtPoint(unlockedSound,
unlockedCamera.GetComponent(Transform).position, 2.0);
}
Con
nuestro
efecto
de
sonido
reproducioendose,
podemos
iniciar
la
secuencia
de
animacin.
Haremos
esto
de
proceduralmente
mediante
el
uso
de
cdigo
de
script
para
lograr
la
animacin.
Las
siguientes
lneas
realizan esta
secuencia.
La
primera
lnea
aade
un
retraso
antes
de
el
comienzo
de
la
secuencia
para darle tiempo a el jugador de fijar su atencin a la secuancia..
(He
dejado
los comentarios
en
su
lugar
para
que
pueda
seguir
la
secuencia
de
animacin):
yield WaitForSeconds(1);
exitGateway.active = false; // ... the fence goes down briefly...
yield WaitForSeconds(0.2); //... pause for a fraction of a second...
exitGateway.active = true; //... now the fence flashes back on again...
yield WaitForSeconds(0.2); //... another brief pause before...
exitGateway.active = false; //... the fence finally goes down forever!
Ahora
tenemos
acceso
a
la
nave!
Todo
lo
que
necesitamos
hacer
ahora
es
convertir el componente
Mesh Collider de la nave en un trigger envez de un collider convencional.
levelGoal.GetComponent(MeshCollider).isTrigger = true;
74
Por
ltimo,
hacemos
una
pausa
de
unos
segundos
para
que
el
jugador
tenga
tiempo
para
ver
los
resultados,
antes
de
apagar
la
cmara
de
nuestra
escena
y
restaurar
el
componente
de
escucha
de
audio
a
nuestra
NearCamera:
yield WaitForSeconds(4); // give the player time to see the result.
// swap the cameras back.
unlockedCamera.active = false; // this lets the NearCamera get the screen all to
itself.
unlockedCamera.GetComponent(AudioListener).enabled = false;
mainCamera.GetComponent(AudioListener).enabled = true;
}
La
creacin
cmara
para
el
cutscene
es
nuestra
prxima
tarea.
Esto
es
slo
otro
Camera
GameObject,
exactamente
como
la
que
hemos
estado
utilizando
en
el
juego
en
s.
Vamos
a
configurarlo:
Aadir
una
nueva
cmara
a
la
escena.
Cambiarle
el
nombre a CutSceneCamera1
Aadir
el
script SmoothLookAt a
la
cmara.
Asignarle spaceShip
en
a
el
script
SmoothLookAt para que el script sepa para donde necesita
apuntar la camara.
Establezca
las
propiedades
restantes
como
se
muestra:
CutScenCamera1 propiedades.
75
Esta
cmara
debe
ser
configurada
para
mirar
hacia
la
plataforma
donde
se
encuentra
encerrada
la
nave,
mostrando
claramente
la cerca.
La
configuracin
que
se
muestra
arriba
debera
ser
una
buena
aproximacin,
pero
no
dude
en modificarla
a
su
gusto:
Posicionamiento de CutsceneCamera1.
La
cmara
debe
ser
desactivada
por
defecto.
Ser
activada
por
nuestros
scripts,
pero no
queremos
que
renderize
nada
hasta
que
el
script
no
le
indique
lo
contrario.
La
descativacin
de
la
cmara
es
muy
sencilla:
76
Descative
la
casilla
situada
junto
a
Cut
Scene
Camera
1,
a
la
derecha
en
la
parte
superior
de
el
inspector.
Adems,
ajuste
la
configuracin
de
Normalized
View
Port
Rect
como
se
muestra
arriba.
Estos
definen
la
posicin
en
la
cual
se
dibujara
la
camara
para
que
aparezca
en
la
parte
superior
derecha
de
la
pantalla.
El
parametro
Depth
tambien
se
establece
a
10,
que
es
mayor
que
el
Depth
de
Near
Camera para
que
la
camara
se
dibuje
sobre el resto de las camaras.
Necesitamos
poner
a
prueba
la
secuencia,
por
lo
que
debemos
establecer
las
propiedades
de
el
script
LevelStatus
como
se
muestra
a
continuacin:
NOTA El
contador
de
cuadros
por
segundo
esta
visible
tanto
en
la
camara
principal
como
en
la
del
cinema,
su
funcionamiento
e
implementacion
esta
cubierto
en
el
captulo
sobre
la
optimizacin.
El
ltimo
cinema
es
un
poco
ms
complejo.
Necesitamos
que
la
nave
espacial
despegue
y
salga
77
volando.
Podemos
hacer
esto
utilizando
scripting,
pero
es
mucho
ms
fcil
utilizar
un
AnimationClip para algo asi:
Haga
clic
en
el
modelo
de
nave
espacial
dentro
de
la
cerca.
(O
haga
clic
en
l en
el
panel
de
jerarqua)
Agregar
el
AnimationClip
ShipAnimation
de
la
carpeta
de
Animations
en
el
panel
del
proyecto
y
aadirlo
al
objeto
spaceShip
(nave
espacial).
Si
usted
a
juega
el
juego
ahora
vera
la
nave
despegar.
Sin
embargo,
slo
queremos
que
la
nave
despegue,
cuando el
nivel
este
completo.
Vamos
a
hacer
esto
con
un
script
en
un
minuto.
Sin
embargo
Unity,
por
defecto, supone
que
las
animaciones
se
reproducen
de
forma
automtica.
No
queremos
esto,
as
que, con
el
juego
en
Stop:
Deshabilitar
la
opcion
"Play
Automatically"
del
componente
de
Animacin
de
la
nave
espacial.
El
siguiente
paso
es
crear
la
camara
para
nuestro
segundo
cinema:
Crear
un
nuevo
objeto
de
tipo
camera.
Cambiarle
el
nombre
CutSceneCamera2.
Posicinela
en
la
parte
superior
del
edificio
donde
se
encuentra
la
nave,
como
se
muestra:
78
Posicionamiento CutSceneCamera2.
79
Ahora
para
la
el
cinema.
Esto
es
un
poco
ms
complicado
que
nuestro
primer
cinema porque
el
mensajes
utilizados
para
desencadenar
la
escena
deben
ser
transmitidos
a
lo
largo
de
una
cadena:
Todo
incia
cuando
el
jugador
toca
el
modelo
de
nave
espacial.
(Si
el
primer
cinema ha
transcurrido,
el
modelo
de
nave
espacial
est
actuando
como
un
Trigger
en
lugar
de
un
objeto
slido).
El
modelo
de
nave
espacial
por
lo
tanto
necesita
un
script
adjunto
a
la
misma
para
hacer
frente
a
este
evento:
Crear
un
nuevo
script
de
tipo
JavaScript.
Cambiarle
el
nombre
HandleSpaceshipCollision.
Agregue
el
cdigo
siguiente
a
el
script
(Usted puede
encontrar
el
cdigo
de
el
script
completo
en
la
seccin
de
apndice):
private var playerLink : ThirdPersonStatus;
function OnTriggerEnter (col : Collider)
{
playerLink=col.GetComponent(ThirdPersonStatus);
if (!playerLink) // not the player.
{
return;
}
else
{
playerLink.LevelCompleted();
}
}
Todo
el
cdigo
de
arriba
es
para
probar
si
el
jugador
ha
tocado
la
nave
espacial
y,
de
ser
as,
llame
al la funcion
LevelCompleted
()
en
el
script
ThirdPersonStatus
del
Jugador.
Aadir
el
script
al
objeto
spaceShip.
Agregue
la
siguiente
funcin
a
el
script
ThirdPersonStatus:
function LevelCompleted()
{
levelStateMachine.LevelCompleted();
}
80
function LevelCompleted()
{
En
primer
lugar,
tenemos
que
hacer
el
mismo
intercambio
de
Audio
Listener
que
hicimos
para
nuestro
primer
cinema:
mainCamera.GetComponent(AudioListener).enabled = false;
levelCompletedCamera.active = true;
levelCompletedCamera.GetComponent(AudioListener).enabled = true;
A
continuacin,
queremos
dar
la
ilusin
de
que
el
jugador
est
dentro
de
la
nave
espacial,
por
lo
que
vamos
a
esconderlo.
Para
ello,
vamos
a
enviar
un
mensaje
de
"HidePlayer"
a
el
script
ThirdPersonController
del
jugador.
La
funcin
desactiva
el
renderizado
de
que
el
jugador
para
que
se
haga
invisible:
playerLink.GetComponent(ThirdPersonController).SendMessage("HidePlayer");
Slo
para
estar
en
el
lado
seguro,
tambin
trasladaremos
fsicamente
al
jugador
a
una
posicin
que sabermos
debe
ser
segura.
(Los
robots
no
comprueban
si
el
jugador
es
visible
o
no,
y
estn
an
en
funcionamiento.)
En
este
caso,
slo
tendremos
que
mover
el
jugador
500
unidades
hacia
arriba,
lo
cual debe
ser
lo
suficientemente
lejos
de
cualquier
peligro
inmediato.
playerLink.transform.position+=Vector3.up*500.0; // just move him 500 units
A
continuacin,
vamos
a
reproducir
el
sonido
de
nivel
completado.
En
este
caso,
es
el
sonido
de
la
nave
espacial
que
despega:
if (levelCompleteSound)
{
AudioSource.PlayClipAtPoint(levelCompleteSound, levelGoal.transform.position,
2.0);
}
Ahora
empezamos
a
reproducir la animacion de la nave
y
esperamos
a
que
termine:
levelGoal.animation.Play();
yield WaitForSeconds (levelGoal.animation.clip.length);
Y,
por
ltimo,
cargamos
la
escena
"Game
Over":
81
Application.LoadLevel("GameOver"); //...just show the Game Over
sequence.
}
Ahora
debemos
asegurar
que
el
modelo
de
nave
espacial
no
este
configurado
como
un
trigger
cuando
nuestro
nivel
inicia,
y
tambin
asegurar
playerLink
est
apuntando
a
el
GameObject
Player.
Vamos
a
definir
la
variable
dentro
de
una
funcin
Awake
()
en
playerLink,
que
ser
llamada
automticamente por
Unity
cuando
se
carga
el
script.
Cambiar
el
Awake
()
para
como
vemos
en
el
script
de
abajo
.
Debera
estar
ubicado justo
encima
de
la
primera
funcin
en
LevelStatus.
private var playerLink: GameObject;
function Awake()
{
playerLink = GameObject.Find("Player");
if (!playerLink)
Debug.Log("Could not get link to Lerpz");
levelGoal.GetComponent(MeshCollider).isTrigger = false; // make very sure of this!
}
Finalmente,
debemos
establecer
las
propiedades
de
nuestro
script,
como
se
muestra:
El
resultado,
al
recoger
todas
las
latas
de
combustible
y
saltar
a
la
nave
espacial,
debe
verse
como
esto:
82
El
siguiente
captulo
se
cubre
tcnicas
de
optimizacin
que
podemos
usar
para
mejorar
el
rendimiento
de
nuestro
juego.
83
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
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
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.
86
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
Sugerencias
para
mejorar
Este
juego
se
ha
dejado
deliberadamente
sin
terminar.
Tenemos
un
men
muy
bsico
de
inicio,
una
pantalla
de
game
over
y
el
ultimo
nivel
del
juego,
podria
tener
mas
niveles.
Cmo
podra
ser
mejorado?
Arreglando
los
errores
dejados
deliberadamente
S,
hay
algunos
problemas
menores
con
el
juego
tal
como
est.
Estos
han
sido
deliberadamente
dejados
en
su
lugar
para
darle
al
usuario
oportunidad
de
perfeccionar
sus
habilidades.
Ellos
son:
Si
usted
mata
a
un
robot,
pero
renace
cerca
antes
que
el
jugador
se
haya
movido
fuera
de
rango,
un nuevo
robot
aparecer,
pero
el
viejo
se
mantendr.
Las
Trampas
de
lser
no
empujan
a
el
jugador,
por
lo
que
es
posible
perder
toda
la
vida con
bastante
rapidez.
Ambos
pueden
ser
resueltos
mediante
la
aplicacin
de
lo
que
has
aprendido
en
este
tutorial.
Ms
niveles
El
panel
de
proyecto
incluye
una
carpeta
"Build
your
own"
que
contiene
todos
los
assets
individuales utilizados
para
construir
el
nivel,
por
lo
que
aadir
nuevos
niveles
no
debera
ser
difcil.
Usted
tendr
que
utilizar
DontDestroyOnLoad
()
de
modo
que
pueda
llevar
la informacin
de
estado
del
juego
entre
los
niveles
como
la
puntuacin
actual,
la
vida
restante, etc.
Ms
enemigos
El
juego
slo
tiene
un
enemigo,
los
guardias
robot.
Por
qu no
aadir
un
poco
ms?
Esta
es
una
buena
manera
de
asegurarse
de
que
han
entendido
la
animacin y
los
aspectos
de
la
IA.
Tambin
le
ayudar
a
obtener
una
slida
comprensin
de
la
construccin
de
modelos
y
la
importacin
de
ellos
en
Unity.
Aadir
marcador
El
juego
carece
de
un
sistema
de
puntuacin.
Aadir
uno
no
es
difcil,
pero
aadiendo
efectos
visuales cuando
el
jugador
hace
algo
digno
de
aumentar
su
puntuacin
puede
ser
tan
difcil como
usted
quiera.
(Y,
por
supuesto,
usted
desea
hacer
un
seguimiento
de
los
puntajes
entre
escenas.)
Aadir
un
sistema
de
puntaje
en
red
Qu
mejor
manera
de
presumir
que
subir
tu
mejor
puntuacin
a
una
central
de servidor
para
que
todos
puedan
ver
tu
grandeza?
Esta
es
una
buena
manera
de
envolver
su
cabeza
en
torno
a
conceptos
bsicos
de
redes.
Aadir
soporte
multijugador
88
Aadiendo
soporte
para
juegos
en
red
multijugador
es
probablemente
una
de
las
cosas
ms
difciles
que
usted
puede hacerle a
cualquier
juego.
Naturalmente,
Unity
puede
servir
tambin
de
ayuda,
pero
usted
tendr
que
familiarizarse
mucho
con
scripting.
Esta
es
una
buena
mejora
para
un
nivel avanzado.
Para leer ms
El
primer
lugar
para
buscar
ms
informacin
es,
como
siempre,
la
propia
documentacin
de
Unity.
Tambin
hay
muchos
tutoriales
en
el
sitio
web
de
Unity:
http://unity3d.com/support/documentation/
Adems,
el
Unify
Wiki
es
una
fuente
excelente
de
informacin
contribuida
por
los
usuarios:
http://www.unifycommunity.com
Y,
por
ltimo,
usted
puede
hablar
con
expertos
y
recin
llegados
en
los
foros
de
Unity:
http://forum.unity3d.com /
89
Apndice
de
Scripts
Aqu
se
congregan
todos
los
scripts
Script
StartMenuGUI
Aqu
est
el
cdigo
para
el
script
StartMenuGUI.
//@script ExecuteInEditMode()
var gSkin : GUISkin;
var backdrop : Texture2D;
private var isLoading = false;
function OnGUI()
{
if(gSkin)
GUI.skin = gSkin;
else
Debug.Log("StartMenuGUI: GUI Skin object missing!");
var backgroundStyle : GUIStyle = new GUIStyle();
backgroundStyle.normal.background = backdrop;
GUI.Label ( Rect( (Screen.width - (Screen.height * 2)) * 0.75, 0, Screen.height * 2, Screen.height), "", backgroundStyle);
GUI.Label ( Rect( (Screen.width/2)-197, 50, 400, 100), "Lerpz Escapes", "mainMenuTitle");
if (GUI.Button( Rect( (Screen.width/2)-70, Screen.height -160, 140, 70), "Play"))
{
isLoading = true;
Application.LoadLevel("TheGame");
}
var isWebPlayer = (Application.platform == RuntimePlatform.OSXWebPlayer ||
Application.platform == RuntimePlatform.WindowsWebPlayer);
if (!isWebPlayer)
{
if (GUI.Button( Rect( (Screen.width/2)-70, Screen.height - 80, 140, 70), "Quit"))
Application.Quit();
}
if (isLoading)
GUI.Label ( Rect( (Screen.width/2)-110, (Screen.height / 2) - 60, 400, 70), "Loading...", "mainMenuTitle");
}
GameOverGUI
Aqu
est
el
cdigo
para
el
script
GameOverGUI:
@script ExecuteInEditMode()
var background : GUIStyle;
var gameOverText : GUIStyle;
var gameOverShadow : GUIStyle;
var gameOverScale = 1.5;
var gameOverShadowScale = 1.5;
function OnGUI()
{
GUI.Label ( Rect( (Screen.width - (Screen.height * 2)) * 0.75, 0, Screen.height * 2, Screen.height), "", background);
90
GameOverScript
Aqu
est
el
cdigo
para
el
script
GameOverScript:
function LateUpdate ()
{
if (!audio.isPlaying || Input.anyKeyDown)
Application.LoadLevel("StartMenu");
}
ThirdPersonStatus
Aqu
est
el
cdigo
para
el
script
ThirdPersonStatus:
// ThirdPersonStatus: Handles the player's state machine.
// Keeps track of inventory, health, lives, etc.
var health : int = 6;
var maxHealth : int = 6;
var lives = 4;
// sound effects.
var struckSound: AudioClip;
var deathSound: AudioClip;
private var levelStateMachine : LevelStatus; // link to script that handles the level-complete sequence.
private var remainingItems : int; // total number to pick up on this level. Grabbed from LevelStatus.
function Awake()
{
levelStateMachine = FindObjectOfType(LevelStatus);
if (!levelStateMachine)
Debug.Log("No link to Level Status");
}
remainingItems = levelStateMachine.itemsNeeded;
health -= damage;
if (health <= 0)
{
SendMessage("Die");
}
91
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);
92
LevelStatus
Aqu
est
el
cdigo
para
el
script
LevelStatus:
// LevelStatus: Master level state machine script.
var exitGateway: GameObject;
var levelGoal: GameObject;
var unlockedSound: AudioClip;
var levelCompleteSound: AudioClip;
var mainCamera: GameObject;
var unlockedCamera: GameObject;
var levelCompletedCamera: GameObject;
// This is where info like the number of items the player must collect
// in order to complete the level lives.
var itemsNeeded: int = 20;
function LevelCompleted()
{
mainCamera.GetComponent(AudioListener).enabled = false;
levelCompletedCamera.active = true;
levelCompletedCamera.GetComponent(AudioListener).enabled = true;
playerLink.GetComponent(ThirdPersonController).SendMessage("HidePlayer");
playerLink.transform.position+=Vector3.up*500.0; // just move him 500 units
if (levelCompleteSound)
{
AudioSource.PlayClipAtPoint(levelCompleteSound, levelGoal.transform.position, 2.0);
}
levelGoal.animation.Play();
yield WaitForSeconds (levelGoal.animation.clip.length);
Application.LoadLevel("GameOver"); //...just show the Game Over sequence.
}
93
HandleSpaceshipCollision
Aqu
est
el
cdigo
para
el
script
HandleSpaceshipCollision:
private var playerLink : ThirdPersonStatus;
function OnTriggerEnter (col : Collider)
{
playerLink=col.GetComponent(ThirdPersonStatus);
94