#1 Inicio del proyecto. [Laberinto en primera persona]

Por GameDevTraum

Introducción

Este es el comienzo de la serie del Laberinto, en la que crearemos un prototipo simple de juego en primera persona en el que el escenario será un laberinto, mientras vamos viendo todas las herramientas con las que cuenta Unity para crear juegos.

Esta serie es ideal para aquellos que no tienen experiencia con Unity ya que se muestra de todo un poco y sin entrar en detalles, el propósito es mas bien observar todo el proceso de desarrollo para tener una idea general.

Página principal del proyecto

Artículos de la Serie del Laberinto

Antes de comenzar te invito a ver este video de la serie Mi Primer Juego en Unity

Creación del proyecto

Al ejecutar Unity o Unity HUB, nos aparece una ventana en la que podemos crear nuevos proyectos, abrirlos y acceder a los tutoriales.

Vamos a crear un nuevo proyecto 3D, le damos un nombre y elegimos una ubicación en el disco. Todo lo demás es opcional. Cuando todo esté listo creamos el proyecto

Le damos un nombre y seleccionamos el template 3D.

Ventana de inicio de Unity. Crear o cargar un proyecto.
Fig. 1: Ventana de inicio de Unity. Crear o cargar un proyecto.

Lo primero que vamos a hacer es crear una nueva escena. En esta versión de Unity, por defecto se nos crea la escena “SampleScene.unity”, como se observa en la cabecera del programa en la figura 2.

Para crear una nueva escena hacemos clic en File > Save Scene As…

Menu file de unity3d
Fig. 2: Para guardar una nueva escena vamos a File > Save Scene As…

Le damos un nombre y la guardamos. Al hacerlo se observa en la cabecera el nombre de la nueva escena.

unity 3d ventana emergente para guardar una escena.
Fig. 3 Ventana emergente para guardar la escena.

Cada escena tiene su propio diseño independiente de las demás. Por ejemplo podemos usar una escena para el menú principal y otra para el juego.

Todo va a depender de cómo queramos estructurar el juego.

Creación de carpetas

Es importante establecer un sistema de organización para los archivos de nuestro juego en Unity desde el comienzo, porque a medida que avanzamos vamos creando más Scripts, importando más archivos y las cosas se desordenan fácilmente.

Todos los archivos del proyecto se encuentran en la ventana “Project”, dentro de una carpeta que se llama “Assets”. Esta carpeta se puede encontrar en el directorio que definimos para el proyecto.

programa unity3d menu para crear una nueva carpeta. crear una nueva carpeta en unity.
Fig. 4: Crear una nueva carpeta para el proyecto.

Como se observa en la figura 4, al hacer clic derecho se despliega un menú con distintas opciones, vamos a la opción “Create” y elegimos “Folder”.

Creamos tantas carpetas como sea necesario para organizarnos, esta parte es personal,

Importar paquetes

Para empezar a hacer un juego en Unity no es necesario crear todo desde cero, podemos valernos de las librerías existentes para comenzar a trabajar en una idea. A continuación vamos a importar Unity Packages (paquetes de Unity) de la librería Standard Assets y de la Asset Store.

Standard Assets – Unity

En la versión de Unity que tenía al momento de grabar el video, se podía importar los paquetes de Standard Assets, una librería que ofrece Unity que cuenta con distintos prefabricados, efectos y scripts que resultan útiles al empezar.

Haciendo clic derecho en la carpeta tenemos la opción “Import Package” donde podemos elegir un paquete que tengamos descargado usando la opción “Custom Package” o podemos elegir algún paquete de Standard Assets.

Si no les aparecen todos los paquetes como se ve en la figura 5, tienen la opción de descargarlos de Asset Store, pero deben tener una cuenta en Unity para poder hacerlo. Más adelante hablamos de eso.

programa unity3d menu para importar paquetes de la libreria standard assets.
Fig. 5: Importar paquetes de la librería Standard Assets.

En este caso voy a importar de Standard Assets los paquetes “Characters”, “ParticleSystems” y “Utility”.

Con el paquete “Characters” podremos colocar en el escenario un prefabricado que tiene implementado un control en primera persona.

ParticleSystems trae algunos efectos interesantes para utilizar, como fuego y humo.

Utility trae algunos scripts útiles como un contador de frames por segundo (fps).

Asset Store – Unity

La tienda virtual de Unity contiene una infinidad de Assets, algunos de pago y otros gratuitos.

Para acceder a la tienda utilizamos la pestaña Asset Store de Unity, si no se encuentra abierta, vamos a Windows > Asset Store o usamos el acceso directo Ctrl+9. Como se observa en la figura 6.

programa unity3d, ventana windows, está seleccionada la opción asset store.
Fig. 6: Abrir la tienda de Assets desde la ventana Window.

Para utilizar la tienda debemos iniciar sesión en nuestra cuenta (podemos hacerlo desde Unity). Luego utilizando la pantalla de inicio o la barra de búsqueda podemos explorar el contenido.

Con el propósito de ver cómo se usa Asset Store vamos a descargar dos paquetes. El primero se llama “SkyBox” y el segundo “FastMobileBloom”, usamos la barra de búsqueda para encontrarlos, en las figuras 7 y 8 se observan las miniaturas de los paquetes.

miniatura del paquete skybox de la tienda asset store de unity3d. se observa un cielo de atardecer.
Fig. 7: Paquete Skybox de la tienda de assets.

miniatura del paquete fastmobilebloom de la tienda asset store de unity3d. se observa una ventana y un cartel de neón azul que dice hotel.
Fig. 8: Paquete FastMobileBloom de la tienda de assets.

Para agregarlos a nuestro proyecto entramos en el paquete y ponemos “Descargar”, al finalizar la descarga nos aparece la opción “Importar”.

unity3d proceso de descarga de la tienda asset store.
Fig. 9: Al entrar en un paquete podemos descargarlo e importarlo, leer comentarios y más.

Jerarquía del proyecto

Dentro de cada escena estarán definidos todos los elementos del juego, es decir un escenario, objetos que forman parte del mundo, objetos invisibles que sirven para la lógica del juego, interfaz gráfica, etc. Todos estos elementos son conocidos como GameObjects y estarán listados en la jerarquía de nuestro proyecto.

Como se observa en la figura 10, al crear una nueva escena, tenemos dos GameObjects que vienen por defecto. Una cámara y una luz direccional.

unity 3d jerarquía de una escena. dos gameobjects.
Fig. 10: Jerarquía del proyecto. Por defecto tenemos una cámara y una luz direccional.

Vamos a eliminar la cámara y empezar a agregar objetos al escenario.

Haciendo clic derecho en la jerarquía tenemos la opción de agregar distintos GameObjects, por ejemplo objetos vacíos, primitivas, luces, etc.

unity 3d jerarquía de una escena. creacion de primitivas. creacion de nuevos gameobjects.
Fig. 11: Haciendo clic derecho en la jerarquía podemos crear nuevos objetos.

Voy a armar un escenario simple con un plano para el suelo y algunos cubos y cilindros.

programa unity 3d se observa una escena con un plano.
Fig. 12: Plano creado desde la jerarquía.

A medida que vamos agregando más objetos al escenario la jerarquía va creciendo. También es recomendable tener una buena organización desde el principio, colocando nombres apropiados y usando Empty GameObjects para agrupar los objetos.

programa unity3d se observa una escena con un plano, un cubo y dos cilindros.
Fig. 13: Agregando objetos al mundo.

Observen las figuras 14 y 15. En la primera se ve que ambos cilindros están contenidos por el cubo, ya que están ligeramente más a la derecha y el cubo tiene una flecha para desplegar y colapsar el contenido. En la figura 15 en cambio se observa que están al mismo nivel por así decirlo.

unity 3d jerarquía de una escena. relacion de parentesco entre los gameobjects.
Fig. 14: El cubo es el padre de los cilindros.

unity 3d jerarquía de una escena. relacion de parentesco entre los gameobjects.
Fig. 15: El cubo y los cilindros están al mismo nivel jerárquico.

Esto representa la relación de parentesco que existe entre los GameObjects. En la figura 14 se dice que el cubo es el GameObject padre y ambos cilindros son hijos. Esto implica que los cilindros van a estar afectados por ciertos cambios que se apliquen al padre. Por ejemplo si desactivamos el cubo, ambos cilindros también se desactivarán.

Lo mismo ocurre con la componente transformación por ejemplo. La posición de los cilindros se mide respecto de su padre, por lo tanto si movemos al padre, los cilindros se mueven en conjunto.

Materiales

Para aplicar colores y texturas sobre los objetos del mundo se utilizan los materiales. Vamos a crear algunos para ver cómo funcionan. Clic derecho en alguna carpeta del proyecto luego Create > Material, como se observa en la figura 16.

programa unity 3d, proceso de creacion de nuevos materiales. shaders.
Fig. 16: Proceso de creación de materiales.

El material se visualiza como una esfera en donde están aplicadas las propiedades del material debemos asignarle un nombre, como siempre mantener el orden desde el primer momento nos beneficia a largo plazo.

programa unity 3d, iconos de materiales.
Fig. 17: Visualización de los materiales en la ventana del proyecto.

Los materiales tienen varios parámetros que lo definen, en nuestro caso simplemente vamos a modificar el color haciendo clic en el recuadro a la derecha de “Albedo”. Al hacerlo aparece una paleta de colores donde podemos elegir el color o escribir su código hexadecimal.

programa unity 3d, visualizacion de las propiedades de un material en el inspector.
Fig. 18: Visualización de las propiedades de los materiales en el inspector.

Para aplicar un material simplemente lo arrastramos sobre el objeto deseado.

programa unity3d se observa una escena con un plano, un cubo y dos cilindros. El plano está pintado de marrón.
Fig. 19: Se ha aplicado un material al plano.

Iluminación

Vamos a seleccionar la luz direccional desde la jerarquía o en la ventana escena.

programa unity3d se observa una escena con un plano, un cubo y dos cilindros. El plano está pintado color marrón, hay dos cilindros azules, uno rojo y un cubo rojo, Además una fuente de luz direccional.
Fig. 20: Se ha aplicado materiales a todos los objetos de la escena.

Por luz direccional se entiende una fuente de luz como el sol, es decir situada en el infinito y que envía todos sus rayos paralelos. Por esta razón mover la fuente o hacerla más grande no afecta a la iluminación de la escena, pero cambiar la rotación si lo hace. Lo vemos en la dirección de las sombras.

programa unity3d se observa una escena con un plano, un cubo y dos cilindros. El plano está pintado color marrón, hay dos cilindros azules, uno rojo y un cubo rojo, Además una fuente de luz direccional.
Fig. 21: Rotación de la luz direccional, las sombras se proyectan en otra dirección si comparamos con la figura 20.

Crear una escalera con primitivas

Vamos a hacer este pequeño ejercicio para ver los elementos de la barra de herramientas que tiene Unity, en particular las herramientas que nos permitirán modificar la componente Transform de los GameObjects. Comenzamos creando un cubo en la jerarquía.

programa unity3d barra de herramientas.
Fig. 22: Barra de herramientas básicas de Unity.

Las herramientas mover, rotar y escalar se observan en la figura 22 en las posiciones 2, 3 y 4 respectivamente y se acceden rápidamente usando las teclas “W”, “E” y “R” (respectivamente).

Si apretamos la tecla R teniendo seleccionado el cubo, podremos escalarlo utilizando el “Gizmo” de los tres ejes, como se observa en la figura 23.

programa unity3d, escalar un cubo en una direccion.
Fig. 23: Escalamiento de un GameObject en una dirección.

Lo escalamos en dos direcciones para darle la apariencia de un escalón.

programa unity3d, escalar un cubo en una direccion.

Fig. 24: Escalamiento de un GameObject en una dirección.

Le aplicamos un material y con la tecla W podemos ubicar el escalón en el escenario.

programa unity3d, escalar un cubo en una direccion y moverlo en la escena.
Fig. 25: Posicionamiento del objeto en la escena.

Podemos duplicar fácilmente el objeto utilizando el acceso directo CTRL+D y con la tecla W elevarlo un poco y desplazarlo hacia atrás.

programa unity3d, duplicar un gameobject y desplazarlo.
Fig. 26: Duplicación de un GameObject.

Podemos repetir este proceso con varios escalones seleccionados.

programa unity3d, duplicar un conjunto de gameobjects y desplazarlos.
Fig. 27: Duplicación de un conjunto de GameObjects.

Vamos a crear un Empty GameObject y llamarlo “Escenario”.

unity 3d jerarquía de una escena. creación de empty gameobjects para organizar.
Fig. 28: Creación de un Empty GameObject para organizar elementos.

unity 3d jerarquía de una escena. creación de empty gameobjects para organizar.
Fig. 29: Al Empty GameObject se le da el nombre Escenario.

Luego seleccionamos todos los objetos y los arrastrámos hacia este nuevo objeto para agruparlos. De esta forma podemos colapsar todo el contenido y la jerarquía se ve más ordenada, como se observa en la figura 30.

unity 3d jerarquía de una escena. creación de empty gameobjects para organizar.
Fig. 30: Todos los GameObjects del escenario se arrastran dentro del Empty GameObject y se colapsa el contenido.

Controlador de primera persona

La razón por la que previamente eliminamos la cámara es porque vamos a colocar en la escena el prefabricado “FPSController” de Standard Assets y este ya trae una cámara incorporada. Este prefab se encuentra en el directorio Standard Assets > Characters > FirstPersonCharacter > Prefabs.

programa unity. prefabricado de un control primera persona.
Fig. 31: Prefab FPSController del paquete Characters de Standard Assets.

Lo llevamos a la escena y lo acomodamos donde nos guste.

programa unity3d. se observa una escena con suelo marrón, una escalera azul, dos cilindros rojos y dos cilindros azules.
Fig. 32: Se coloca el prefab FPSController en la escena.

Bugs

Ya estamos en condiciones de hacer algunas pruebas, en la parte superior al centro tenemos tres botones.

El botón Play se utiliza para empezar a correr el juego. El segundo botón pausa el juego pero no lo finaliza. El tercer botón sirve para avanzar un sólo frame en el juego.

Al pulsar el botón Play aparece un cartel de error que dice que todos los errores deben arregllarse antes de poder entrar en el modo juego.

programa unity3d. se observa una escena con suelo marrón, una escalera azul, dos cilindros rojos y dos cilindros azules. En el centro un cartel que dice: "All compiler errors have to be fixed before you can enter playmode".
Fig. 33: Al intentar entrar en el modo juego aparece un cartel de error.

Este es un problema con el que nos vamos a encontrar muy seguido, especialmente al principio y suele ser muy frustrante, más aún si estamos aprendiendo a programar.

Para obtener información sobre lo que está pasando tenemos la ventana “Console”. Si no se encuentra abierta, la encontramos en el menú “Window”.

programa unity3d, consola de unity mostrando advertencias en amarillo.
Fig. 34: En la consola se observan varias advertencias con un cartel amarillo.

En la figura 34 observamos una gran cantidad de advertencias pero esto no afecta el funcionamiento del juego, son sugerencias para optimizar el código, advertencias por uso de código obsoleto y demás. Si sólo tuviésemos advertencias podríamos entrar en el modo juego sin problema.

La figura 35 es una captura luego de hacer clic en el botón “Clear”, esto limpia las advertencias y deja ver los errores que no se pueden pasar por alto para poder entrar en el modo juego. Estos se muestran con un cartel Rojo.

programa unity3d, consola de unity mostrando errores en rojo.
Fig. 35: En la consola se observa un mensaje de error con un cartel rojo.

No hay mucha información sobre el error pero nos basta para entender que hay un archivo que no se encuentra. Si observamos la dirección vemos que está relacionada al paquete Standard Assets y vemos que su dirección comienza con “Assets > Standard Assets > …”. En el video hicimos una carpeta llamada “Paquetes Externos” y dentro de ella colocamos el paquete Standard Assets.

Todo parece indicar que hay algún proceso que está buscando archivos de Standard Assets pero dentro de la carpeta Assets, no la carpeta Paquetes Externos, así que muevo la carpeta Standard Assets a la carpeta Assets y el error se soluciona. Ahora si estamos en condiciones de entrar en el modo juego.

programa unity3d, cambio de lugar de las carpetas del proyecto.
Fig. 36: Se lleva el paquete Standard Assets a la carpeta Assets del proyecto.

Prueba del juego en Unity

El prefab FPS Controller funciona como un juego estándar en primera persona. Avance, retroceso, desplazamientos laterales con las teclas WASD o las flechas. Salto con barra espaciadora, con Shift se puede correr. Con el mouse se controla la vista y tiene sonido de pasos. Es un buen punto de partida para empezar a formar una idea.

programa unity3d, modo juego, prueba de una escena en la que se ve el suelo marrón, cielo celeste, una escalera azul, un cilindro azul y un cilindro rojo.
Fig. 37: Luego de corregir los errores se puede entrar en el modo juego.

Compilación

Ahora vamos a generar una versión standalone del proyecto, es decir un conjunto de carpetas y archivo ejecutable que puede funcionar en nuestro sistema operativo sin necesidad de tener el motor Unity abierto.

Vamos a la pestaña File y hacemos clic en Build Settings, para configurar los parámetros de compilación.

programa unity3d, ventana file con la opcion build settings seleccionada.
Fig. 38: Para hacer una compilación hacemos clic en File > Build Settings.

Nos sale la ventana que se ilustra en la figura 39, allí podemos seleccionar la plataforma objetivo.

Si observan en la parte superior es donde están listadas las escenas del juego. En ese momento no tenemos ninguna escena agregada a la compilación.

programa unity3d, ventana build settings. no hay ninguna escena agregada a la compilación.
Fig. 39: Ventana con parámetros de compilación. No se han agregado escenas.

Haciendo clic en el botón Add Open Scenes vamos a agregar la escena en la que estuvimos trabajando en todo el video. Como se observa en la figura 40.

programa unity3d, ventana build settings. hay unaescena agregada a la compilación.
Fig. 40: Ventana de compilación. Se ha agregado la escena en la que trabajamos.

Ahora solo resta hacer clic en Build And Run y elegir la carpeta donde colocar los archivos generados. Al finalizar el proceso de compilación el juego se ejecuta y nos aparece una ventana en la que podemos seleccionar la resolución y calidad. Le damos al botón Play! y el juego comienza.

ejecución de una versión standalone de un proyecto en unity. ventana para seleccionar resolución y calidad.
Fig. 41: Ventana de inicio del juego. Se puede elegir la resolución y la calidad.

Conclusión

En esta primera entrada vimos los primeros pasos al comenzar un juego en unity. Hicimos bastante énfasis en la organización, que nos beneficiará a largo plazo en el desarrollo.

Vimos las escenas de Unity, cada escena es un mundo aparte y contiene una determinada cantidad de elementos o GameObjects que se encuentran listados en la jerarquía del proyecto.

Importamos archivos tanto de la librería Standard Assets como de la tienda Asset Store. Al principio lo más importante es tratar de darle forma a las ideas que tenemos, para esto los assets de las librerías nos facilitan las cosas.

Vimos algo sobre la relación de parentesco que existe entre los GameObjects y cómo los cambios que se aplican sobre un objeto padre también impactan en sus objetos hijo.

Creamos materiales que sirven para dar color y textura a los objetos.

La fuente de luz direccional nos sirve para iluminar una escena como lo haría el sol, las sombras se proyectarán en función de la rotación que tenga esta fuente de luz.

Hicimos una escalera simple utilizando las primitivas que se pueden crear con Unity y aplicándoles transformaciones, es decir cambios de escala, rotación y posición.

Colocamos el prefabricado de Standard Assets “FPSController” que es un control en primera persona. Rápidamente ya tenemos un personaje que puede recorrer el escenario, correr y saltar.

En el proceso hubo errores que debimos solucionar para poder entrar en el modo juego. La depuración de errores es una tarea difícil cuando empezamos a programar, pero con la práctica se van cometiendo menos errores y resulta más fácil corregirlos.

Finalmente hicimos una compilación ejecutable desde el sistema operativo. Existe una gran cantidad de plataformas a las que podemos exportar nuestro juego en Unity. En principio vamos a exportar a Windows y Android.