Manual Unity
Manual Unity
Conceptos básicos................................................................................................................................ 7
Escena............................................................................................................................................... 7
GameObjects ..................................................................................................................................... 7
Colisiones ..................................................................................................................................... 20
NavMesh Baking.............................................................................................................................. 29
Ejercicios............................................................................................................................................. 39
Para instalar Unity basta con ingresar a la siguiente liga: https://unity3d.com/es/get-unity, puesto que
este manual está pensado para el diseño básico, se utilizará la edición personal, la cual es gratuita.
Usuario: [email protected]
Pass: dafeAV137…
El espacio en disco necesario para instalar los paquetes por defecto es de 9.5 GB, Figura 1.
El proceso de instalación dura aproximadamente 2 horas, mientras tanto puede crear una cuenta en
Unity 3D mediante el siguiente enlace: https://accounts.unity3d.com/sign-up.
Para usar Unity 3D se debe ejecutar la primera vez como administrador, para configurar el perfil de
cuenta; en seguida puede crear un nuevo proyecto presionando el botón de New Project o el botón
New ubicado en la esquina superior derecha, Figura 2.
Ventana o panel
de jerarquía
Barra de menú
Barra de herramientas
Ventana o panel
de inspección
Vista de escena
Ventana o panel
Vista de juego de proyecto
GameObjects
Cada objeto en su juego es un GameObject. No obstante, los GameObjects no hacen nada por sí
mismos. Estos necesitan propiedades especiales antes de que puedan volverse un personaje, un
ambiente, o un efecto especial. Un GameObject siempre tiene el componente Transform adjunto (para
representar la posición y orientación). Los otros componentes que le dan al objeto su funcionalidad
pueden ser agregados en el menú Component del editor o desde un script.
Objetos primitivos
Unity puede trabajar con modelos 3D de cualquier forma, mientras sean creados con un software de
modelado. Sin embargo, hay un cierto número de tipos de objetos primitivos que pueden ser creados
directamente dentro de Unity, algunos de ellos son Cube, Sphere, Capsule, Cylinder, Plane and Quad.
Cualquiera de las primitivas puede agregarse a la escena desde el menú GameObject 3D Object.
Ahora se crea el tablero o campo de juego, para ello nos dirigimos a la pestaña GameObject3D
ObjectPlane o desde el panel de Jerarquía (Hierarchy), Figura 4.
Activación/Desactivación de rejilla.
En el panel de Escena, desplegamos el menú Gizmos y activamos o desactivamos la casilla “Show
Grid”, Figura 6.
Objeto jugador
Para ejemplificar esta parte usaremos una esfera, la cual controlará el jugador; de igual manera que
como se creó el plano, creamos la esfera (Sphere), la renombramos como Jugador y la reseteamos
para asegurar que este ubicada en el origen. Seleccionamos la esfera y presionamos la tecla F, para
enfocar dicho elemento. La esfera parece estar enterrada en el plano, esto es debido a que se
encuentra ubicado en el origen al igual que el plano. Inicialmente todos los objetos primitivos tienen
unidades 1 a 1 o 1 a 2, la esfera es 1 a 1, es decir, tiene un diámetro de 1 metro. Puesto que del origen
de la esfera a cualquier superficie de la ella hay 0.5 unidades, basta con mover en Y esa misma
cantidad de unidades.
Agregar color
Para agregar textura o color debemos usar un Material, primero, creamos una nueva carpeta en la
ventana proyecto presionando el botón Create New Folder, le asignamos el nombre Materiales, con
dicha carpeta seleccionada presionamos nuevamente la pestaña Create ubicada en la ventana del
Para aplicar el material o color a algún elemento, basta con seleccionar el material desde la ventana
proyecto y arrastrarlo hasta el elemento al cual se le desea asignar el color.
Para verificar que el componente de cuerpo rígido fue añadido correctamente selecciónalos la esfera,
y en la ventana Inspector deberá aparecer la sección RigidBody.
Ahora necesitamos que el usuario tenga el control del elemento, para ello necesitamos obtener las
señales de entrada, las cuales provendrán del teclado. Para realizar dicha tarea haremos uso de un
script utilizando el lenguaje C#.
Para editar dicho script nos dirigimos al panel correspondiente al script del objeto y presionamos el
botón con un engrane, finalmente seleccionamos Edit Script, Figura 11.
Otra forma es presionando doble clic sobre el script que se desea editar desde la ventana proyecto.
}
Ahora, ¿Qué es lo que necesitamos hacer? Primero debemos checar cada cuadro o fotograma (frame)
para una instrucción dada y aplicar esa instrucción al elemento seleccionado.
Para mover la esfera se debe aplicar una fuerza al cuerpo rígido. Usaremos la clase Input, para indicar
un movimiento sobre algún eje. Declaramos dos variables locales de tipo flotante los cuales contendrán
la coordenada asociada al objeto con respecto a cada eje. Entonces, agregamos las siguientes líneas
de código en el método correspondiente a la física.
float movimientoHorizontal = Input.GetAxis ("Horizontal");
float movimientoVertical = Input.GetAxis("Vertical");
Ahora crearemos el vector que representara el movimiento en tres dimensiones, para ello, utilizamos
la siguiente línea de código.
Vector3 movimiento = new Vector3(movimientoHorizontal, 0.0f, movimientoVertical);
Recordando sus clases de física, los vectores representan fuerza, entonces necesitamos indicar por
medio de alguna instrucción la fuerza aplicada por dicho vector el cual representará el movimiento del
objeto. Para ello declaramos la siguiente variable global.
private Rigidbody rb;
Finalmente usamos dicha variable para obtener el movimiento, mediante la siguiente línea de código,
la cual debe ser añadida en el método de los cálculos físicos.
rb.AddForce(movimiento);
Ahora podemos añadir movimiento a nuestra esfera, sin embargo, al hacerlo notaremos que la
velocidad del movimiento no es la adecuada. Para ello tendríamos que regresar a editar el código y
multiplicar el movimiento por algún número, esto lleva tiempo, entonces, crearemos variables públicas,
a las cuales tendremos acceso desde el panel Inspector de Unity. Agregamos una variable global de
tipo flotante llamada velocidad.
public float velocidad;
Finalmente modificamos la línea de código encargada del movimiento, dicha línea queda de la
siguiente manera.
rb.AddForce(movimiento * velocidad);
Para colocar la cámara en tercera persona, existen dos métodos, convertir a la cámara en un hijo del
elemento que tendrá el movimiento o con un Script, para fines didácticos utilizaremos el método
mediante script, sin embargo, mencionaremos ambos.
Parámetro X Y Z
Position 0 9.5 .10
Rotation 45 0 0
Scale 1 1 1
Ahora arrastramos el objeto Main Camera al objeto que representa la esfera para convertirlo en un hijo
(Child) de ella, de esta manera la cámara estará asociada al objeto esfera, sin embargo, al mover la
esfera, la cámara rotará junto con el movimiento de la esfera.
En seguida, en la ventana del proyecto aparecerá el nuevo script, lo arrastramos a la carpeta de scripts
y lo abrimos.
El script debe incluir dos elementos; un objeto para hacer referencia al jugador, en este caso, a la
esfera, para lo cual añadiremos un objeto de tipo GameObject…
public GameObject jugador;
…y un vector de tres dimensiones para el desfase (offset) de la cámara.
private Vector3 offset;
Dicha posición debe estar inicializada al iniciar el juego, por lo tanto colocaremos lo siguiente en el
método Start().
offset = transform.position - jugador.transform.position;
Ahora, por cada frame la cámara deberá moverse a una nueva posición, alineado al objeto jugador,
para ello colocaremos la siguiente línea de código dentro del método Update().
transform.position = jugador.transform.position + offset;
Solo resta cambiar el nombre del método Update por LateUpdate, este último método se invoca
después de que el método Update haya concluido.
void LateUpdate () {
transform.position = jugador.transform.position + offset;
}
}
Primero crearemos un GameObject vacío, para ello nos dirigimos al menú GameObject Create
Empty. Una vez creado le asignaremos el nombre Pared, dicho elemento será un elemento Padre de
los siguientes elementos correspondientes a cada una de las paredes, dichas paredes serán objetos
de tipo Cubo (Cube), al primer elemento lo renombramos como ParedOeste; cada elemento podrá
tener de alto 2 unidades, ancho 0.5 unidades y largo 20.5 unidades, finalmente asignamos el nuevo
elemento al elemento Pared, para ello, basta con arrastrarlo hasta dicho elemento.
Solo resta crear las paredes faltantes, para ello duplicamos el objeto ParedOeste, para ello
presionamos Ctrl + D o desde la pestaña Edit Duplicate. Lo mismo para la pared del norte y sur,
todas las paredes deberán estar contenidas en el elemento Padre llamado Pared, Figura 12.
Objetos coleccionables se refiere a aquellos elementos que un jugador puede recolectar a lo largo del
juego. Primero creamos un objeto Pick Up el cual será un objeto de tipo cubo, lo colocamos sobre el
tablero de la misma forma que la esfera y lo hacemos más pequeño, dicho elemento debe atraer la
atención del usuario, para ello, le daremos movimiento, esto lo realizaremos por medio de un script,
se lo añadimos por medio del botón Add Component y le asignamos el nombre de Rotación. En dicho
script añadimos la siguiente línea de código dentro del método Update:
transform.Rotate(new Vector3(15, 30, 45));
Hasta este punto, si ejecutamos el juego el objeto rotara muy rápido, para corregir este error, debemos
multiplicar el vector por un retardo de tiempo, entonces la línea queda de la siguiente manera.
transform.Rotate(new Vector3(15, 30, 45) *Time.deltaTime);
El código correspondiente a la rotación del elemento PickUp debe lucir similar al siguiente:
using UnityEngine;
using System.Collections;
Ahora crearemos un templete llamado Prefab el cual almacenará características que serán
compartidas por otros objetos. Primero, dentro del proyecto creamos una carpeta llamada Prefabs, en
seguida arrastramos el objeto Pick Up a dicha carpeta.
Ahora distribuimos los objetos PickUp en la superficie, para ubicar cada objeto lo podemos hacer de
la siguiente manera, primero presionamos el cono correspondiente al eje superior en Y, para que la
vista cambie a la mostrada en la Figura 16.
Para asignarle color a todos los objetos PickUp primero creamos el material con el color deseado,
ordenamos el material en su respectiva carpeta; en seguida arrastramos el material y se lo asignamos
al elemento almacenado en la carpeta Prefab.
Colisiones
Una colisión se da cuando dos o más objetos chocan o impactan. Para ser capaces de “recolectar” un
objeto, debemos detectar la colisión entre el objeto jugador y el objeto PickUp y asignar algún
comportamiento.
Debemos seleccionar el script asociado al jugador (el cual será el objeto encargado de recolectar a los
objetos PickUp), en este caso dicho script es ControlJugador, lo editamos y añadimos el método
OnTriggerEnter.
void OnTriggerEnter(Collider otro) {
}
Podemos añadir la siguiente línea de código para eliminar un objeto cuando ocurra la colisión
Destroy(otro.gameObject);
Con esa línea de código, cuando toquemos un elemento este será destruido, al destruir un elemento
todo lo asociado a él será eliminado de la escena.
Hasta este punto, el código correspondiente al control del jugador debe ser similar al siguiente.
using UnityEngine;
using System.Collections;
void FixedUpdate() {
float movimientoHorizontal = Input.GetAxis ("Horizontal");
float movimientoVertical = Input.GetAxis("Vertical");
Vector3 movimiento = new Vector3(movimientoHorizontal, 0.0f, movimientoVertical);
rb.AddForce(movimiento * velocidad);
}
En el panel de proyecto, seleccionamos el elemento prefab para los objetos PickUp, Figura 18.
En el panel Inspector desplegamos las opciones de Tag y seleccionamos Add Tag, Figura 19.
Solo resta indicarle al elemento Prefab que debe disparar un evento cuando ocurra una colisión, para
ello activamos la casilla is Trigger, Figura 22.
Necesitamos una herramienta para almacenar el valor de los elementos que se van recolectando, y
otra herramienta para agregar y acumular los elementos coleccionables, dichas herramientas serán
agregadas en el script asociado al control del jugador. Entonces editamos el código y agregamos una
variable privada de tipo entero, la cual llevará la cuenta.
private int cuenta;
Cada vez que el juego inicie la variable de conteo deberá iniciar en cero, dicha inicialización la
realizamos dentro del método Start.
cuenta = 0;
Ahora, necesitamos incrementar en una unidad la variable de conteo cada vez que un objeto sea
recolectado, inmediatamente después de desactivar un objeto PickUp debido a una colisión, debemos
contar dicho objeto, entonces, añadimos la siguiente línea debajo de la instrucción que desactiva
objetos.
Ahora debemos añadir un texto que nos indique cuantos elementos han sido recolectados, para
desplegar texto utilizaremos el conjunto de herramientas de interfaz de usuario (UI Toolset) para
desplegar texto y valores.
Primero creamos un nuevo elemento de texto desde Hierarchy Create UI Text, Figura 23.
Para mover el texto debemos dirigirnos a la sección Rect Transform, y presionar el botón
correspondiente al anclaje del texto, Figura 25, antes de seleccionar cualquiera de las opciones de
ubicación del texto, debemos mantener presionado la tecla Alt y Shift, y posteriormente seleccionar
cualquiera de las opciones.
Ahora creamos una variable pública de tipo texto, la nombramos textoConteo, dicha variable
mantendrá una referencia al componente de texto en Unity.
public Text textoConteo;
Ahora asignaremos el valor inicial de dicho elemento de texto, para ello escribimos la siguiente línea
en el método Start.
textoConteo.text = "Cuenta: " + cuenta.ToString();
Pero, también necesitamos que el elemento de texto se actualice por cada elemento recolectado, para
ello añadimos la misma línea en el método asociado a las colisiones.
Opcionalmente podemos crear una función que contenga la cuenta actualizada y sustituir las
instrucciones anteriores por la invocación del texto. Dicha función puede ser la siguiente.
void MensajeConteo() {
textoConteo.text = "Cuenta: " + cuenta.ToString();
}
Guardamos los cambios y regresamos a la interfaz de Unity, solo falta asociar el elemento referencia
a la variable pública, Figura 26.
Inicializamos el valor del texto como vacío, para ello, basta con abrir y cerrar comillas dobles, es decir,
dejar el texto sin contenido.
textoGana.text = "";
Ahora agregamos una condición, para cuando todos los elementos hayan sido recolectados, el límite
de la condición dependerá del número de objetos coleccionables colocados en la superficie del juego.
La condición deberá ser agregada en la función que despliega el texto de conteo o, en el método de
colisión, dicha condición debe ser la siguiente.
if(cuenta >= 8) {
textoGana.text = "¡Ganaste!";
}
Regresamos a la interfaz de Unity y asociamos el nuevo texto a la variable del script. Al iniciar el juego
y recolectar todos los objetos, en la vista juego deberá aparecer un mensaje indicando que ha ganado,
Figura 27.
Para asignar la fuente seleccionamos el texto al cual se le desea cambiar el tipo de fuente y en la
ventana Inspector nos dirigimos a la sección Text (Script) y modificamos la opción Font y
seleccionamos la nueva fuente.
NavMesh Baking
Para que un enemigo pueda determinar el área en el cual se va a mover, debemos indicárselo por
medio del sistema de navegación de Unity. Para ello utilizaremos un “NavMesh” y realizaremos un
bake. Para activar la ventana de navegación nos dirigimos a Window Navigation.
La ventana de navegación está compuesta de tres pestañas, Object, Mesh Renderers y Terrains.
Antes de realizar el bake debemos indicar a Unity que objetos son de navegación estática, es decir,
cuales son los objetos que no se moverán y puede ser utilizados para calcular las áreas caminables
(Walkable), generalmente pisos, paredes y obstáculos. Para ello, seleccionamos los objetos que serán
estáticos, y nos dirigimos a Navigation Object y activamos la casilla Navigation Static, Figura 30.
Otra forma de indicar que un objeto es de navegación estática es, seleccionando el objeto y en la
ventana Inspector, desplegar el menú Static y seleccionar Navigation Static.
Una vez configurada las opciones como lo muestra la Figura 32 debemos presionar el botón Bake
ubicado en la esquina inferior derecha de la ventana Navigation.
Agente NavMesh
Una vez creado el NavMesh Bake, podemos ubicar los objetos que representarán al enemigo. Para
ello crearemos cuatro esferas y las agruparemos en un objeto vacío llamado Enemigos en la ventana
Hierarchy, Figura 34.
Dicho script deberá estar asociado a cada uno de los enemigos existentes; el script mostrado
anteriormente incluye una variable pública llamada objetivo, a dicha variable se le asignará el elemento
al cual los enemigos se dirigirán, en este caso arrastramos el objeto Jugador y lo asignamos a dicha
variable.
Ahora seleccionamos uno de los objetos enemigo y le asignamos un NavMesh Agent, mediante
Inspector Add component Navigation NavMesh Agent. Mediante dicha sección podemos
configurar algunos parámetros útiles:
Radius. Representa el radio del agente, usado para detectar colisiones entre obstáculos y otros
agentes.
Speed. Máxima velocidad de movimiento.
Acceleration. Máxima aceleración.
NOTA. Recuerde asignar las etiquetas (tag) y activar la casilla Is Trigger del enemigo.
Para seleccionar las opciones primero creamos dos objetos de tipo texto las personalizamos y la
distribuimos en el plano, Figura 36.
Ahora, añadimos un objeto vacío al cual nombraremos Textos, a su vez creamos un script al cual
nombraremos OpcionesJuego, dicho script deberá contener las siguientes funciones.
public void IniciarJuego() {
SceneManager.LoadScene("Minijuego1");
}
public void TerminarJuego() {
SceneManager.UnloadScene(0);
}
Ahora, añadiremos al objeto Textos el script OpcionesJuego.
Ahora seleccionamos el texto para iniciar el juego y agregamos un componente de tipo Event Trigger
(Script), mediante Add Component Event Event Trigger.
Ahora añadimos un script en dicha sección, arrastramos el objeto Textos y lo colocamos en donde se
solicita el objeto y posteriormente añadimos la función para iniciar el juego.
Un Audio Source se encarga de reproducir el Audio Clip en la escena. Para crear un nuevo Audio
Source haremos lo siguiente.
1. Importar archivo de audio. Para ello basta con arrastrar el archivo a la ventana de proyecto.
2. En la ventana Hierarchy, creamos un objeto vacío (Create Empty).
3. Renombramos el objeto vacío a Audio.
4. Seleccionando el objeto vacío Audio, agregamos un Audio Source. Para ello nos dirigimos a
Inspector Add Component Audio Audio Source.
5. Asignamos el Audio Clip al Audio Source, Figura 40, arrastrándolo hasta Inspector Audio
Source AudioClip.
También podemos iniciar un sonido al desencadenarse un evento de colisión, para ello, agregamos
Antes de crear el juego debemos guardar la escena. Ahora nos dirigimos a File Build Settings o
presionando la combinación de teclas Ctrl + Shift + B, esto nos llevara a la ventana mostrada en la
Figura 41.
Dicha ventana muestra la plataforma a la cual estará dirigida el juego, a su vez en el costado derecho
se muestran algunas opciones asociadas a la plataforma seleccionada. En caso de tener varias
escenas en el juego, estas deberán ser colocadas en el panel superior (Scenes In Build), si omitimos
este paso, Unity solo seleccionara la escena actual.
Tras haber seleccionado la plataforma, así como la arquitectura y el sistema operativo, presionamos
el botón Build, esto nos llevará a una ventana en la cual seleccionaremos la ubicación, opcionalmente
Presionamos el botón guardar, y seleccionamos el archivo ejecutable del juego y presionamos doble
clic sobre él, presionamos el botón Play en la ventana que aparecerá, Figura 43, y el juego estará listo.
Añada más obstáculos para que su interfaz sea similar a la mostrada en la Figura 44.