Tutorial Unity3D
Tutorial Unity3D
Tutorial Unity3D
Autor:
1
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Contenido
I. Introducción……………………………………………………………………………. 3
II. Interfaz Gráfica – Basics………………………………………………………...... 4
Project View……………………………………………………………………….. 4
Hierarchy………………………………………………………………………..…. 5
Toolbar………………………………………………………………………………. 5
Scene View…………………………………………………………………………. 5
Game View……………………………………………………………………....... 7
Inspector……………………………………………………………………………. 8
Otras vistas………………………………………………………………………... 8
III. Scripting en Unity – Basics……………………………………………………….. 9
Convenciones del Unity……………………………………………………….. 9
Scripts comunes…………………………………………………………………. 9
Operaciones comunes en el scripting……………………………………. 10
IV. Clases importantes………………………………………………………………….. 15
Clase Transform…………………………………………………………………. 15
Clase Rigidbody………………………………………………………………….. 17
V. Ejercicio 1: Aplicación de lo aprendido………………………………………. 19
VI. Ejercicio 2: Creación de un FPS…………………………………………………. 26
2
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
I. Introducción
Unity es una herramienta de programación integrada para la creación de video juegos 3D u
otros contenidos interactivos como visualizaciones arquitectónicas o animaciones 3D en
tiempo real.
Sistemas Operativos: Windows, Mac OS X, Wii, iPhone/iPad, Xbox 360, Android, PS3.
Website: www.unity3d.com
3
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
La ventana del editor principal (Main Editor Window) está compuesta de varias sub-
ventanas, llamadas vistas (views). Hay varios tipos de vistas en Unity, cada una con un
propósito específico.
Project View
4
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Hierarchy
Toolbar
El Toolbar consiste en cinco controles básicos; cada uno relacionado a diferentes partes del
Editor.
Scene View
5
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
El Scene View es una ventana interactiva. Éste se puede usar para seleccionar y posicionar
los ambientes, el jugador, la cámara, los enemigos, y otros GameObjects. Maniobrar y
manipular estos objetos dentro del Scene View es una de las funciones más importantes en
el Unity.
En ésta vista podemos usar el Hand Tool, especialmente aprovechar el mouse lo más
posible.
Posicionamiento de GameObjects
En el proceso de construir los juegos, se tendrá que ubicar varios objetos en el mundo del
videojuego. Para hacer esto, debemos usar las Transform Tools en el Toolbar para
trasladar, rotar y dar escalas a GameObjects. Cada uno tiene un correspondiente Gizmo
que aparece alrededor del GameObject seleccionado en el Scene View. Se puede usar el
mouse y manipular cualquier Gizmo axis para modificar el Transform component del
GameObject, o también se pueden introducir valores directamente al Transform
component que se encuentra en el Inspector.
La barra del control del Scene View nos permite ver la escena en varios modos de vista
como textured, wireframe, RGB, overdraw, y otros. Éste permitirá ver y oír iluminación
in-game, elementos de juego, y sonidos.
6
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Game View
El Game View es generado desde la(s) cámara(s) en el juego. Éste es representativo del
producto final. Se necesitará usar una o más cámaras para controlar lo que el jugador
observa realmente cuando están jugando el juego.
Modo Play
Los botones en el Toolbar se usan para controlar el editor Play Mode, así se observará
como funcionará el producto final. Durante el Play Mode se esté ejecutando, todos los
cambios que se realicen serán temporales, y serán inicializados de nuevo al salir del Play
Mode.
Maximize on Play: El Game View se maximizará al 100% (vista en toda la pantalla) una
vez en el Play Mode.
Stats: Muestra las estadísticas del renderizado, es útil para optimizar la performance de los
gráficos.
7
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Inspector
Otras Vistas
Las vistas previamente explicadas nos mostraron la interface básica en Unity. Hay otras
vistas que se pueden utilizar para tareas más específicas, tenemos las siguientes vistas:
8
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Consejo: cuando se lea un código en Unity, se debe prestar mucha atención a la primera
letra de las palabras. Esto ayudará a comprender mejor la relación entre los objetos.
Scripts comunes
Cuando se crea un nuevo JavaScript, por defecto éste contiene una función Update(). En esta
sección trataremos otras opciones comunes disponibles, simplemente reemplazando el
nombre de la función Update() con uno de la lista inferior.
FixedUpdate()
El código situado dentro de esta función se ejecuta en intervalos regulares (a un ritmo de
presentación de frames fijado). Es muy común usar este tipo de función cuando aplicamos
fuerzas a un “Rigidbody” (cuerpo rígido).
Awake()
El código dentro de esta función es llamado cuando se inicia el script.
Start()
Se llama antes de cualquier función Update, pero después de la función Awake(). La
diferencia entre las funciones Start() y Awake() es que la función Start() es llamada
únicamente si el script es habilitado (si su ʻcheckboxʼ está habilitada en la Vista de Inspector).
OnCollisionEnter()
El código dentro de esta función se ejecuta cuando el objeto de juego al que pertenece el
script colisiona con otro objeto de juego.
OnMouseDown()
El código se ejecuta cuando el ratón hace clic sobre un objeto de juego que contiene un
ʻGUIElementʼ (elemento GUI) o un ʻColliderʼ.
9
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
OnMouseOver()
El código aquí dentro se ejecuta cuando el ratón se coloca sobre un objeto de juego que
contiene un ʻGUIElementʼ (elemento GUI) o un ʻColliderʼ.
Posición y Rotación
La mayoría de las manipulaciones de GameObjects son hechas a través del componente
Transform y/o Rigidbody de estos. Estos son accesibles dentro de los behaviour scripts a
través de las variables miembro transform y rigidbody respectivamente.
Si se quiere rotar un objeto 5 grados alrededor del eje Y cada frame se podría hacer
escribiendo el siguiente código:
function Update() {
transform.Rotate(0, 5, 0);
}
Si se quiere mover un objeto hacia otro punto se podría escribir el siguiente código:
function Update() {
transform.Translate(0, 0, 2);
}
Tiempo
La clase tiempo contiene una importante variable de clase llamada deltaTime. Ésta variable
contiene la cantidad de tiempo desde la última llamada hasta un Update o FixedUpdate (si
es que hay alguna de éstas funciones dentro).
Rotando un objeto:
function Update() {
transform.Rotate(0, 5 * Time.deltaTime, 0);
}
Moviendo un objeto:
function Update() {
transform.Translate(0, 0, 2 * Time.deltaTime);
}
Cuando se multiplica por Time.deltaTime se está expresando que por ejemplo se quiere
mover un objeto 10m/s en lugar de 10m/frame. Esto es no es sólo fácil porque el juego
correrá independientemente del frame rate sino también porque más unidades de
movimiento son fáciles de entender (10 metros por segundo).
function Update() {
light.range += 2.0 * Time.deltaTime;
}
10
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
transform.Translate(0, 1, 0);
// es equivalente a
GetComponent(Transform).Translate(0, 1, 0);
Note la diferencia entre transform y Transform. La primera es una variable (minúscula), la
segunda es una clase o script name (mayúscula).
Aplicando esto, se puede encontrar cualquier script o componente incorporado el cual es
vinculado al mismo objeto usando GetComponent. Note que para hacer el siguiente ejemplo
se necesita tener un script llamado OtherScript conteniendo una función DoSomething. El
script OtherScript debe ser vinculado al mismo GameObject como en el siguiente script.
11
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
También se puede exponer referencias a otros objetos al Inspector. Debajo se puede arrastar
un GameObject que contiene el OtherScript en target slot en el Inspector.
function Update () {
// Setea la variable foo del target object.
target.foo = 2;
// Llama a DoSomething en el target.
target.DoSomething("Hello");
}
function Start () {
// Por nombre.
var go = GameObject.Find("SomeGuy");
go.transform.Translate(0, 1, 0);
// Por tag.
var player = GameObject.FindWithTag("Player");
player.transform.Translate(0, 1, 0);
}
12
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
function Start () {
// Por nombre.
var go = GameObject.Find("SomeGuy");
go.GetComponent(OtherScript).DoSomething();
// Por tag.
var player = GameObject.FindWithTag("Player");
player.GetComponent(OtherScript).DoSomething();
}
Vectores
Unity usa la clase Vector3 en todo para representar vectores en 3D. Los componentes
individuales de un vector 3D pueden ser accedidos a través de sus variables miembro x, y, z.
También se puede usar el constructor Vector3 para inicializar todos los componentes a la
vez.
SomeVector.Normalize();
Y operaciones usando múltiples vectores son hechas usando funciones de la clase Vector3.
Variables
Member variables
Cualquier variable definida fuera de cualquier función define una variable miembro. Las
variables son accesibles a través del Inspector dentro del Unity. Cualquier valor guardado en
una variable miembro es también automáticamente guardado con el proyecto.
13
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
function Update()
{
if ( Vector3.Distance( enemy.position, transform.position ) < 10 )
print("Creo que el enemigo está cerca!");
}
También se pueden crear private member variables. Estas son útiles para guardar estatus
que no deberían ser visibles fuera del script. Variables miembro privadas no son guardadas
en el disco y no son editables en el Inspector. Estos son visibles en el Inspector cuando
estén en el debug mode. Esto permite usar variables privadas como updating debuggers
en tiempo real.
function
OnCollisionEnter(collisionInfo : Collision ) {
lastCollider = collisionInfo.collider;
}
Global variables
También se puede crear variables globales usando el static keyword.
Este crea una variable global llamada someGlobal.
Para acceder a éste desde otro script se debe usar el nombre del script seguido por un punto
y la variable global.
name.print(TheScriptName.someGlobal);
TheScriptName.someGlobal = 10;
Instantiate
Instantiate duplica un objeto. Incluyendo todo los scripts vinculados y todo el hierarchy.
Este mantiene referencias en la manera que se espera: Referencias a objetos que están fuera
de la jerarquía clonada serán dejadas sin contacto, Referencias a objetos en la jerarquía
clonada serán mapeadas en el objeto clonado.
Instantiate es increíblemente rápido y versátil. Por ejemplo aquí está un pequeño script que
cuando se vincula a un rigidbody con collider se destruirá así mismo y pondrá en su lugar un
explosion object.
14
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Functions
15
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Inherited Variables
transform The Transform attached to this GameObject (null if there is none attached).
rigidbody The Rigidbody attached to this GameObject (null if there is none attached).
camera The Camera attached to this GameObject (null if there is none attached).
light The Light attached to this GameObject (null if there is none attached).
animation The Animation attached to this GameObject (null if there is none attached).
constantForce The ConstantForce attached to this GameObject (null if there is none attached).
renderer The Renderer attached to this GameObject (null if there is none attached).
audio The AudioSource attached to this GameObject (null if there is none attached).
guiText The GUIText attached to this GameObject (null if there is none attached).
networkView The NetworkView attached to this GameObject (Read Only). (null if there is none
attached)
guiTexture The GUITexture attached to this GameObject (Read Only). (null if there is none attached)
collider The Collider attached to this GameObject (null if there is none attached).
hingeJoint The HingeJoint attached to this GameObject (null if there is none attached).
particleEmitter The ParticleEmitter attached to this GameObject (null if there is none attached).
gameObject The game object this component is attached to. A component is always attached to a
game object.
tag The tag of this game object.
name The name of the object.
hideFlags Should the object be hidden, saved with the scene or modifiable by the user?
Inherited Functions
GetComponent Returns the component of Type type if the game object has one attached, null if
it doesn't.
GetComponentInChildren Returns the component of Type type in the GameObject or any of its children
using depth first search.
GetComponentsInChildren Returns all components of Type type in the GameObject or any of its children.
GetComponents Returns all components of Type type in the GameObject.
CompareTag Is this game object tagged tag?
SendMessageUpwards Calls the method named methodName on every MonoBehaviour in this game
object and on every ancestor of the behaviour
SendMessage Calls the method named methodName on every MonoBehaviour in this game
object.
BroadcastMessage Calls the method named methodName on every MonoBehaviour in this game
object or any of its children.
GetInstanceID Returns the instance id of the object.
16
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Clase Rigidbody
Variables
Functions
SetDensity Sets the mass based on the attached colliders assuming a constant density.
AddForce Adds a force to the rigidbody. As a result the rigidbody will start moving.
AddRelativeForce Adds a force to the rigidbody relative to its coordinate system.
AddTorque Adds a torque to the rigidbody.
AddRelativeTorque Adds a torque to the rigidbody relative to the rigidbodie's own coordinate system.
AddForceAtPosition Applies force at position. As a result this will apply a torque and force on the
object.
AddExplosionForce Applies a force to the rigidbody that simulates explosion effects. The explosion
force will fall off linearly with distance to the rigidbody.
ClosestPointOnBounds The closest point to the bounding box of the attached colliders.
GetRelativePointVelocity The velocity relative to the rigidbody at the point relativePoint.
GetPointVelocity The velocity of the rigidbody at the point worldPoint in global space.
MovePosition Moves the rigidbody to position.
MoveRotation Rotates the rigidbody to rotation.
Sleep Forces a rigidbody to sleep at least one frame.
IsSleeping Is the rigidbody sleeping?
WakeUp Forces a rigidbody to wake up.
SweepTest Tests if a rigidbody would collide with anything, if it was moved through the scene.
SweepTestAll Like Rigidbody.SweepTest, but returns all hits.
17
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Messages Sent
OnCollisionEnter OnCollisionEnter is called when this collider/rigidbody has begun touching another
rigidbody/collider.
OnCollisionExit OnCollisionEnter is called when this collider/rigidbody has stopped touching
another rigidbody/collider.
OnCollisionStay OnCollisionStay is called once per frame for every collider/rigidbody that is
touching rigidbody/collider.
Inherited Variables
transform The Transform attached to this GameObject (null if there is none attached).
rigidbody The Rigidbody attached to this GameObject (null if there is none attached).
camera The Camera attached to this GameObject (null if there is none attached).
light The Light attached to this GameObject (null if there is none attached).
animation The Animation attached to this GameObject (null if there is none attached).
constantForce The ConstantForce attached to this GameObject (null if there is none attached).
renderer The Renderer attached to this GameObject (null if there is none attached).
audio The AudioSource attached to this GameObject (null if there is none attached).
guiText The GUIText attached to this GameObject (null if there is none attached).
networkView The NetworkView attached to this GameObject (Read Only). (null if there is none attached)
guiTexture The GUITexture attached to this GameObject (Read Only). (null if there is none attached)
collider The Collider attached to this GameObject (null if there is none attached).
hingeJoint The HingeJoint attached to this GameObject (null if there is none attached).
particleEmitter The ParticleEmitter attached to this GameObject (null if there is none attached).
gameObject The game object this component is attached to. A component is always attached to a game
object.
tag The tag of this game object.
name The name of the object.
hideFlags Should the object be hidden, saved with the scene or modifiable by the user?
Inherited Functions
GetComponent Returns the component of Type type if the game object has one attached, null if it
doesn't.
GetComponentInCh Returns the component of Type type in the GameObject or any of its children using
ildren depth first search.
GetComponentsInC Returns all components of Type type in the GameObject or any of its children.
hildren
GetComponents Returns all components of Type type in the GameObject.
CompareTag Is this game object tagged tag?
SendMessageUpwar Calls the method named methodName on every MonoBehaviour in this game object and
ds on every ancestor of the behaviour
SendMessage Calls the method named methodName on every MonoBehaviour in this game object.
BroadcastMessage Calls the method named methodName on every MonoBehaviour in this game object or
any of its children.
GetInstanceID Returns the instance id of the object.
18
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
19
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Para nuestro primer programa vamos a permitir que el jugador se mueva en un mundo de
juego sencillo.
Primero vamos a crear una superficie en la que camine el usuario. La superficie que vamos a
usar es la forma de un cubo aplastado.
- Crea un cubo y escala las dimensiones x,y,z a 5, 0.1, y 5 respectivamente, ahora debería
parecerse a un amplio y llano plano. Renombra este objeto como ʻPlaneʼ en la Vista de
Jerarquía (Hierarchy View).
- Crea un segundo cubo y colócalo en el centro del plano. Si no puedes ver los objetos en la
Vista de Juego (Game View), altera la cámara principal para que estén visibles. Renombra el
objeto como Cubo1 (Cube1).
-También deberías crear un punto de luz y colocarlo encima de los cubos de forma que sean
visibles más fácilmente.
Ahora estamos listos para empezar a programar juegos. Vamos a permitir que el jugador
camine por el mundo de juego controlando la posición de la cámara principal. Para esto
vamos a escribir un script que leerá la entrada desde el teclado, luego adjuntamos
(asociamos) el script con la cámara principal (más en la próxima sección).
- Comenzar creando un script vacío. Selecciona Assets->Create->JavaScript y renombra
este script como Movimiento1 (Move1) en el Panel del Proyecto (Project Panel).
- Haz doble click en el script Move1 y se ya abrirá con la función Update() insertada (es un
comportamiento por defecto), vamos a insertar nuestro código dentro de esta función.
Cualquiera código que insertes dentro de la función Update() ejecutará cada frame.
Para mover un objeto de juego en Unity necesitamos cambiar la propiedad de posición de su
transform, la función Translate perteneciente al transform nos permitirá hacerlo. La función
Translate toma 3 parámetros: los movimientos x, y, z. Si queremos controlar el objeto de
juego de la cámara principal con las teclas del cursor, simplemente asociamos código para
determinar si las teclas del cursor están siendo presionadas para los respectivos parámetros:
20
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
function Update () {
transform.Translate(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
}
Adjuntar el script
Ahora que nuestro primer script está escrito, ¿cómo le decimos a Unity qué objeto de juego
debería tener ese comportamiento? Todo lo que tenemos que hacer es adjuntar el script al
objeto de juego que queremos que muestre ese comportamiento.
- Para hacer esto, primero haz click en el objeto de juego que quieras que tenga el
comportamiento definido en el script. En nuestro caso, esta es la Cámara Principal, y tú
puedes seleccionarla desde la Vista de Jerarquía (Hierarchy View) o desde la Vista de
Escena (Scene View).
- Después selecciona Components->Scripts->Move1 desde el menú principal.
Así se adjunta el script a la cámara, deberías notar que el componente Move1 ahora aparece
en la Vista de Inspector (Inspector View) para la cámara principal.
Consejo: puedes también asignar un script a un objeto de juego arrastrando el script desde
la Vista de Proyecto (Project View) hasta el objeto en la Vista de Escena (View Scene).
-Pon en marcha el juego (presiona el icono ʻplayʼ en la parte superior), deberías ser capaz de
mover la cámara principal con las teclas del cursor o W, S, A, D.
Probablemente notaste que la cámara se movió un poco demasiado rápido, vamos a buscar
una mejor forma de controlar la velocidad de la cámara.
Tiempo Delta
Como el anterior código estaba dentro de la función Update(), la cámara se movía a la
velocidad medida en metros por frame. De todas formas es mejor asegurarse de que tus
objetos de juego se mueven al ritmo predecible de metros por segundo. Para conseguir esto
tenemos que multiplicar el valor dado desde la función Input.GetAxis() por el tiempo Delta
y también por la velocidad a la que queremos movernos por segundo:
Date cuenta aquí que la velocidad variable se declara fuera de la función Update(), esto es
llamado una variable expuesta (exponed variable), y aparecerá en la Vista de Inspector
(Inspector View) para cualquier objeto de juego al que esté adjunto el script (la variable
queda explicada en la Unity GUI).
Exponer variables es útil cuando el valor necesita ser modificado para conseguir el efecto
deseado, esto es mucho más fácil que cambiar códigos.
21
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Conectar variables
Conectar variables a través de GUI es una característica muy poderosa de Unity. Permite que
las variables que normalmente estarían asignadas en código puedan ser hechas mediante el
drag and drop (arrastrar y tirar) en la GUI de Unity.
Esto permite hacer rápidos y fáciles prototipos de ideas. Como las variables se conectan a
través de la GUI de Unity, sabemos que siempre necesitaremos exponer una variable en
nuestro código de script para poder asignar el parámetro en la Vista de Inspector (Inspector
View).
Vamos a demostrar el concepto de conectar variables creando un foco de luz que seguirá al
jugador (Cámara Principal) mientras se mueve.
- Añade un foco de luz (spotlight) a la Vista de Escena (Scene View). Muévelo si es
necesario para que esté cerca de los otros objetos de juego.
- Crea un nuevo JavaScript y nómbralo ʻFollowʼ (Seguir).
Pensemos en lo que queremos hacer. Queremos que nuestro nuevo foco de luz apunte a
cualquiera que sea la cámara principal. Para que esto ocurra, hay una función en Unity que lo
hace, transform.LookAt(). Si estabas empezando a pensar ʻ¿cómo lo hago?ʼ y te imaginabas
un montón de códigos, entonces merece la pena recordar siempre que puedes revisar la API
de Unity para usar una función que ya existe. También podríamos acertar mirando en la
sección “transform” de la API, ya que estamos interesados en alterar la posición o rotación
de un objeto de juego.
Ahora vamos a la sección de conectar variables; ¿qué usamos como un parámetro para
LookAt()? Podemos insertar un objeto de juego, no obstante sabemos que queremos
asignar la variable mediante la GUI, así que sólo tendremos que usar una variable expuesta
(del tipo Transform). Nuestro Follow.js script debería parecerse a esto:
- Adjunta el script al foco de luz y fijate que cuando el componente se añade, la variable
“target” (objetivo) está expuesta.
- Con el foco de luz aun seleccionado, arrastra la Cámara Principal desde la Vista de Jerarquía
(Hierarchy View) hasta la variable “target” en la Vista de Inspector (Inspector View). Así
se asigna la variable objetivo, esto es, el foco de luz no seguirá a la Cámara Principal. Si
queríamos el foco de luz para seguir a un objeto de juego diferente, podríamos simplemente
arrastrar hasta él un objeto diferente (mientras sea del tipo Transform, claro).
- Pon en marcha el juego. Si miras la Vista de Escena (Scene View) deberías ver el foco de
luz siguiendo a la Cámara Principal. Puede que quieras cambiar la posición del foco para
mejorar el efecto.
22
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
con código” más tarde), sin embargo sabemos que exponer la variable y asignarla mediante
la GUI es una mejor forma de hacerlo.
- Crea un nuevo JavaScript y llámalo “Switch” (Cambiar). Añade el siguiente código a
“Switch.js”:
23
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
function Update () {
if (Input.GetButtonDown("Jump")){
var newTarget = GameObject.Find("Cube").transform;
GetComponent(Follow).target = newTarget;
}
}
function Update () {
if (Input.GetButtonDown("Jump")){
var newTarget = GameObject.FindWithTag("Cube").transform;
GetComponent(Follow).target = newTarget;
}
}
Instantiate
A veces es conveniente crear objetos durante el tiempo de ejecución (mientras se está
jugando al juego). Para hacer esto usamos la función “Instantiate”.
Vamos a mostrar cómo funciona creando un nuevo objeto de juego cada vez que el usuario
presione la tecla fire (el botón izquierdo del ratón o el Ctrl izquierdo del teclado).
Entonces ¿qué queremos hacer? Queremos que el usuario se mueva normalmente, y cuando
presione la tecla fire, se cree un nuevo objeto. Varias cosas en las que pensar:
1. ¿Qué objeto creamos?
2. ¿Dónde lo creamos?
En cuanto al objeto a crear, la mejor forma de solventarlo es exponer una variable. Esto
significa que podemos establecer qué objeto crear mediante el uso del drag and drop para
asignar un objeto de juego a esta variable.
Para saber dónde crearlo, por ahora sólo crearemos el nuevo objeto de juego donde sea que
el usuario (Cámara Principal) está actualmente situado cuando quiera que la tecla – sea
presionada.
La función Instantiate toma 3 parámetros: (1) el objeto que queremos crear, (2) la posición
3D del objeto, y (3) la rotación del objeto.
El código completo para hacer esto es el siguiente (Create.js):
var newObject : Transform;
function Update () {
if (Input.GetButtonDown("Fire1")) {
Instantiate(newObject, transform.position, transform.rotation);
}
}
24
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Debugging
Depurar es la técnica para encontrar y solucionar errores humanos en tu código (vale,
llamémosles equivocaciones). Unity proporciona ayuda mediante la clase “Debug” (depurar),
vamos ahora a mirar la función Debug.Log().
Log
La función Log() permite al usuario mandar un mensaje a la Consola de Unity.
Algunas razones para hacer esto:
1. Para probar que una cierta parte del código está siendo alcanzada durante el tiempo de
ejecución.
2. Para informar del estado de una variable.
Vamos a usar ahora la función Log() para mandar un mensaje a la Consola de Unity cuando
el usuario pulse la tecla fire.
- Abre el script ʻCreateʼ y añade la siguiente línea tras el código ʻInstantiateʼ (instanciar)
dentro del bloque ʻifʼ: Debug.Log("Cube created");
- Pon en marcha el juego y pulsa la tecla ---. Deberías ver una línea que aparece al pie de la
GUI de Unity diciendo “cube created” (cubo creado), puedes hacer click en ella para examinar
la Consola de Unity.
Mirar
Otra característica útil para depurar es exponer una variable particular. Esto hace que la
variable sea visible en la Vista de Inspector (Inspector View) cuando se selecciona el modo
Debug (depurar), pero no puede ser editado.
Para demostrarlo, vamos a exponer una variable particular para contar el número de cubos
que creamos.
- Abre el script ʻCreateʼ otra vez y añade 2 líneas:
(1) Añade una variable particular llamada “cubeCount”.
(2) Incrementa esta variable cuando se cree un cubo.
El código completo es el siguiente (Create.js):
25
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
- Arranca el juego y pulsa la tecla fire (disparar) para crear algunos cubos. Date cuenta de
cómo se incrementa la variable ʻcubeCountʼ en la Vista de Inspector cada vez que se crea un
cubo. Nota además cómo el número aparece sombreado en gris, lo que indica que es una
variable únicamente de lectura (no se puede editar).
26
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Como se observará en la escena, el terreno está oscuro, para arreglar esto debemos agregar
un GameObject llamado Point Light que se encuentra en GameObject-> Create Other->
Point Light. Seleccionando este objeto, en el inspector le damos las coordenadas 256; 200;
256, con una intensidad de 5 y un rango de 500.
Ahora podemos modificar el terreno agregando elevaciones, depresiones, arboles, arbustos,
montañas, etc. Para esto seleccionamos el objeto Terrain, usamos cualquiera de los 7
bloques que se muestran en la figura anterior y seleccionamos el pincel que querramos.
Por simplicidad dejaremos nuestro ambiente de juego como se muestra en las imágenes de
arriba, tenga en cuenta que podemos agregar cualquier objeto en nuestro mapa.
27
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Nota: Se recomienda establecer la coordenada y con un valor mayor de 1 para que el objeto
no caiga por efecto de la gravedad; x, z pueden tomar cualquier valor de acuerdo al terreno.
28
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Luego agregamos una animación para el disparo de las balas del arma. Agregamos el
prefabricado Sparks al Scene View. Este se encuentra en Standard Assets-> Particles.
Ahora convertimos a Sparks en Child Object de machineGun.
Añadimos ahora otra arma mediante un GameObject que llamaremos Rocket Launcher y
lo convertimos en Child Object de Weapons. Arrastramos el prefabricado rocketLauncher
hacia el objeto Rocket Launcher que se encuentra Objects-> weapons. También
arrastramos el script “RocketLauncher.js” que se encuentra en WeaponScripts, lo
arrastramos hasta el objeto Rocket Launcher.
Como se trata de un lanza misiles, debemos agregar un prefabricado llamado rocket que se
encuentra en Objects-> weapons. Agregamos también el script “Rocket.js”. Por
comodidad y poder hacer uso de este después, debemos hacer de este un prefabricado
llamado Rocket_1. Finalmente agregamos el prefabricado Rocket_1 como variable del
script “Rocket Launcher.js” del objeto Rocket Launcher.
29
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Creando waypoints
Creamos un GameObject y lo nombramos Waypoints. Le agregamos el script
“AutoWayPoint.js” al objeto mencionado y creamos 3 ó más de estos Waypoints.
Nota: Colocar los Waypoints a 1 metro en el eje y. Colocarlos como se muestra en la figura
de abajo.
Agregando un robot AI
Arrastramos el prefabricado robot que se encuentra en Robot Artwork.
30
UNIVERSIDAD NACIONAL DE INGENIERÍA Unity3D
Facultad de Ingeniería Mecánica Tutorial Básico
Aquí hemos mostrado los primeros pasos de cómo realizar un FPS, hay muchas cosas que se
deben agregar como un interfase humano-maquina, más escenarios, menús, más armas,
más enemigos, niveles de dificultad, etc.
31