Videojuegos

Paso a paso videojuego en Unity Nexus Fear

Creación personajes

Para la creación de nuestro personaje en Unity con nuestro propio rostro, ingresamos a:

https://metaperson.avatarsdk.com

Figura 1: Selección de Personajes

Seleccionamos la opción take a selfie donde se abrirá un código qr  que deberá ser escaneado en nuestro celular, una vez tomada la foto

Figura 2: Codigo QR

Una vez tomada la foto en la página se nos dará la opción de generar  el avatar

Figura 3: Descarga del Avatar

Personaje 1:

Figura 4: Avatar Personaje 1

Personaje 2:

Figura 5: Avatar Personaje 2

Personaje 3:

Figura 6: Avatar Personaje 3

Una vez generados se pueden descargar en formato FBX

Posteriormente será importante generar una carpeta para poder aplicar las texturas cuando se importe el personaje en unity

Para realizar esto se importa el modelo en Blender

Figura 7: Texturización de personaje

Y en la parte superior nos vamos a la parte Editar UV

Figura 7: Editar UV

Ahora en el modelo seleccionamos por aparte todo lo que se va realizar la textura en este caso es la cabeza, el cuerpo y las manos

Cabeza:

Figura 8: Texturización Cabeza
Figura 9: Texturización piel

Cuerpo:

Figura 10: Texturización Cuerpo
Figura 11: Texturización Ojos

Para exportar cada textura nos dirigimos a donde dice imagen

Figura 12: Exportación Textura
Figura 13: Guardar Texturas

Para llevar un orden se crea una carpeta con todas las texturas generadas

Figura 14: Carpeta de Texturas

Se repite el mismo proceso con los 3 personajes que se van a utilizar


Importación y texturizado de los niveles en Unity

Nivel 1

La temática principal van a ser los backrooms, por lo tanto en sketchfab se buscan escenarios relacionados

Figura 15: Elección de Escenarios
Figura 16: Descarga de Escenario

Para abrirlo en Unity se arrastra la carpeta descargada y se ubica donde sea necesario, en este caso se guardó en la siguiente carpeta

Figura 17: Carpeta de Escenario

Posteriormente se arrastra a la jerarquía de la parte izquierda del editor

Figura 18: Jerarquía en Unity

Nivel 2

Para esto se hace una nueva escena y se abre en unity el nuevo modelo, en este caso se va a realizar un laberinto

Hay partes del modelo que se importan sin su textura, para ponerlas buscamos la carpeta con las texturas del modelo

Figura 20: Carpeta de texturas

Al abrirla aparecen todos los materiales existentes, para aplicarlos se arrastran según corresponda

Paredes y suelo texturizado

Nivel 3.

Para el nivel 3 vamos a tener un parkour, para esto seguimos el paso de los niveles anteriores de buscar un modelo y descargarlo de sketchfab

Al abrirlo en unity también aparecerá sin texturas por lo que volvemos a la carpera de texturas del modelo, por lo que seleccionamos los objetos uno por uno y arrastramos su textura correspondiente.

Escena para selección de personajes en Unity

Figura 24: Escena de Selección

Se crea un plano

Figura 25: Creación del Plano

Se crea una nueva escena

Figura 26: Escena Menú

Se crean los botones

Figura 27: Creación de Botones
Figura 28: Botón Comenzar

Para los otros botones se copia el primero y se le cambia el texto

Figura 29: Botones Integrados

Posteriormente se cambian los colores y se ajustan según la necesidad del juego en Unity

Figura 30: Cambio Color Botones

Ahora se le tendrá que dar la funcionalidad a los botones, para esto se crea un nuevo script, para llevar el orden creamos una carpeta de script para ir guardando lo que se vaya generando.

Figura 31: Funcionalidad Botones
Figura 32: Script Menú

Explicación del Script MenuInicial

Este script, llamado MenuInicial, está diseñado para manejar los botones del menú principal de nuestro videojuego en Unity. En particular, permite iniciar el juego cargando una escena específica y salir de la aplicación. Veamos qué hace cada parte:

Importación de espacios de nombres

Figura 34: Funcionalidades Menú

Estas líneas nos permiten acceder a las funcionalidades de Unity:

  • UnityEngine: nos da acceso a todas las funciones básicas del motor.
  • UnityEngine.SceneManagement: necesario para poder cambiar de escenas dentro del juego.

Definición de la clase MenuInicial

Figura 35: Clase MenuInicial

Aquí definimos una clase pública llamada MenuInicial, que hereda de MonoBehaviour, lo cual le permite ser agregada como componente en un objeto de la escena (por ejemplo, el Canvas del menú).

Método Jugar (string Nivel1)

Figura 36: Método Jugar

Este método se activa cuando el jugador presiona el botón Jugar. A diferencia de la versión anterior del script, ahora se le pasa como parámetro el nombre de la escena que se quiere cargar.

  • string Nivel1: es el nombre de la escena que deseamos cargar. Este nombre debe coincidir exactamente con el que está registrado en el Build Settings de Unity.
  • SceneManager.LoadScene(Nivel1): se encarga de cargar la escena correspondiente.

Método salir()

Figura 37: Método Salir

Este método se ejecuta al presionar el botón Salir. Hace lo siguiente:

  • Application.Quit(): cierra la aplicación si está compilada (por ejemplo, en PC, Android, etc.).

Debug.Log(“Salir…”): imprime un mensaje en la consola. Es útil durante el desarrollo, ya que Application.Quit() no tiene efecto en el editor de Unity.

Ahora se arrastra el script al canvas en la jerarquía para que este se tenga como un nuevo componente

Figura 38: Script a Canvas

Ahora para asignar las funciones creadas nos vamos al inspector de los botones y en donde dice On Click añadimos uno nuevo

Figura 39: Añadir Funciones
Figura 40: Función Runtime

Se arrastra el canvas en donde dice None (Object) y en function se busca el script creado anteriormente

Figura 41: Búsqueda Script

Se repite el mismo proceso para el botón de salir

Figura 42: Búsqueda Botón Salir

De igual manera se crea un menú de opciones

Figura 43: Menú de Opciones

Luego se le añade una imagen para el fondo

Figura 44: Fondo Añadido

Para que los controles aparezcan cuando se presiona el botón y se quiten al dar regresar de deben configurar los eventos de los clics en el botón opciones

Figura 45: Configuración de Eventos

De igual manera en el botón regresar

Figura 46: Configuración Eventos Regresar

Selector de personajes en Unity

Para tener organizados los modelos se crea una nueva carpeta llamada personajes donde se tienen los modelos y sus texturas.

Figura 47: Carpeta Personajes

Se crea un plano

Figura 48: Plano en Unity

Se ponen los personajes

Figura 49: Ubicación de Personajes

Se crea un nuevo script para el objeto selección

Figura 50: Creación Script
Figura 51: Script Selección

Ahora se acomodan unos planos que servirán como paredes para darle un fondo al juego

Figura 52: Creación Paredes

Se crea un nuevo botón

Figura 53: Creación Botón

Se crea un nuevo objeto llamado GameManager y se le asigna el script SpawnPersonaje

Figura 54: Script SpawnPersonaje
Figura 55: Ventana Script

Y se crean los scripts de selección del personaje

Figura 56: Creación Script Selección

Para que el personaje seleccionado sea el que se tiene se crea un nuevo script llamado SpawnPersonaje

Nivel 1 en Unity

Se abre mixamo, se carga el personaje y se le da una animación, posteriormente se descarga y se abre en Unity

Figura 57: Pagina Mixamo
Figura 58: Animación Caminando

Se pone en la escena y se le aplican sus texturas

Figura 59: Personaje en Escena

Se crea el avatar a partir del modelo modificando los siguientes parámetros en el inspector

Figura 60: Modificación Parámetros

Ahora nos dirigimos al StarterAssets

Figura 61: Carpeta StarterAssets

Seguimos la siguiente ruta

Figura 62: Ruta a Seguir

Cargamos donde dice Nestedplayerarmature

Figura 63: Nestedplayerarmature

Arrastramos nuestro personaje en donde dice player armature

Figura 64: Implementación Personaje

Se ajustan a una altura similar y se ponen en la misma posición

Figura 65: Ajuste Personaje

Se desmarca donde dice geometry para que se quite el robot

Figura 66: Desmarcación Robot

Ahora seleccionamos PlayerArmature desde la jerarquía

Figura 67: Selección PlayerArmature

Y en Animator donde dice avatar arrastramos el avatar que tiene nuestra animación

Figura 68: Ventana Animator

Con esto nuestro personaje ya será jugable

Figura 69: Personaje Jugable

Implementación de un Temporizador (Timer) en la Escena del Juego

A continuación, se describen los pasos realizados para implementar un temporizador de cuenta regresiva dentro de una escena en Unity. Este temporizador se visualizará en pantalla y comenzará en 100 segundos, disminuyendo progresivamente hasta llegar a cero.

Primero, dentro de la escena del juego, creamos un nuevo objeto Canvas, el cual servirá como contenedor para los elementos de la interfaz gráfica (UI). Dentro de este Canvas, añadimos un objeto de tipo Texto (Text), que será el encargado de mostrar el valor del temporizador.

Figura 70: Creación Canvas

El componente de texto se ajusta visualmente para que se vea de forma clara durante la partida. Como configuración inicial, se define el contenido del texto como “00”, esto con el fin de mantener el formato visual adecuado para mostrar números con decimales.

Figura 71: Configuración Texto

Posteriormente, se crea un Empty Object (objeto vacío) dentro de la escena. Este objeto será utilizado para ejecutar la lógica del temporizador. A este objeto le asignamos el script llamado Timer, el cual se encargará de controlar el comportamiento del contador.

Figura 72: Asignación Script

En el objeto vacío al que se le asignó el script Timer, se deben realizar dos configuraciones importantes desde el Inspector:

  • En el campo Texto Timer, se arrastra y se asigna el objeto de texto previamente creado dentro del Canvas.
  • En el campo Timer, se define el valor inicial como 100, lo cual indica que la cuenta regresiva comenzará desde 100 segundos.
Figura 73: Configuración Timer

Para mantener el proyecto ordenado, dentro de la carpeta Assets se creó un nuevo folder llamado “Scripts”, y dentro de él se generó el script Timer.cs, que contiene la lógica de funcionamiento del contador.

Figura 74: Folder Scripts

El script Timer está programado en C# y tiene la función de reducir el tiempo, mostrarlo visualmente en pantalla y también reiniciar automáticamente el nivel cuando el temporizador llega a cero. A continuación, se explica en detalle su contenido:

Figura 75: Script Timer

Explicación del funcionamiento:

  • public float timer = 0;: Declara una variable pública que almacena el valor del temporizador. Este valor se puede establecer manualmente desde el Inspector de Unity (por ejemplo, iniciar desde 100 segundos).
  • public Text textoTimer;: Hace referencia al componente de texto en la UI donde se mostrará el valor actual del temporizador.
  • En el método Update(), que se ejecuta en cada frame del juego:
    • if (timer > 0): Comprueba si el temporizador aún tiene tiempo restante.
    • timer -= Time.deltaTime;: Resta al contador la cantidad de segundos que han transcurrido desde el último frame, lo que produce una cuenta regresiva.
    • timer = Mathf.Max(timer, 0);: Asegura que el valor nunca baje de cero, evitando números negativos.
    • textoTimer.text = timer.ToString(“f1”);: Actualiza el contenido del texto, mostrando el tiempo restante con un solo decimal (por ejemplo: 99.2, 88.7, etc.).
  • Cuando el tiempo llega a cero o menos:
    • SceneManager.LoadScene(SceneManager.GetActiveScene().name);: Esta línea reinicia la escena actual, permitiendo que el nivel vuelva a comenzar desde el inicio automáticamente.

Con esta mejora, al ejecutar la escena ya se puede observar el temporizador funcionando en tiempo real, contando regresivamente desde el valor inicial definido. Y ahora, una vez el tiempo llega a cero, el juego reinicia automáticamente el nivel, lo que agrega un nuevo nivel de dificultad y presión al jugador, ideal para desafíos contrarreloj o mecánicas de pérdida por tiempo agotado.

Figura 76: Funcionamiento Temporizador

Recolectables en Unity

Primero, se deben crear los objetos coleccionables (por ejemplo, gemas, monedas, esferas, etc.) dentro de la escena. A cada uno de estos objetos se le debe añadir el componente Box Collider (con la opción Is Trigger activada), y se les asigna el script ObjectInteract para que puedan detectar la interacción con el jugador y ser recogidos.

Figura 77: Creación Coleccionables

Dentro del Canvas de la escena, se debe crear un nuevo objeto de tipo UI > Text (o TextMeshPro, si se está usando TMP). Este objeto será el encargado de mostrar el número de objetos atesorados.

Es importante dejar este campo sin valor visible al inicio (puede decir “0”, “Objetos: 0”, o simplemente estar vacío) porque su contenido será actualizado automáticamente por el script.

Figura 78: Creación UI

Se crea un Empty Object (objeto vacío) en la escena llamado, por ejemplo, ControladorInventario. A este objeto se le añade el script Inventario.

Luego, en el campo público Texto Inventario del script, se debe arrastrar el objeto de texto del Canvas creado anteriormente para establecer la conexión entre ambos.

Figura 79: Conexión Canvas

Para asegurar que el script ObjectInteract encuentre y acceda al sistema de inventario, también se debe asignar el script Inventario al jugador (el objeto que tenga el tag “Player”).

Además, en ese mismo script, también se debe arrastrar el objeto del texto en el Canvas al campo Texto Inventario, igual que en el paso anterior.

  • Solo una de las dos instancias del script Inventario será usada por el objeto acumulable, dependiendo de a cuál se acceda desde el tag “Player”. Es recomendable que el objeto “Player” tenga el control central del inventario para evitar conflictos.
Figura 80: Script Inventario

Explicación del código ObjectInteract

Figura 81: Código ObjectInteract

Este script se encarga de detectar cuando el jugador entra en contacto con el objeto. Al ocurrir la colisión:

  • Se incrementa la cantidad de objetos reunidos mediante el método AumentarCantidad().
  • El objeto se destruye con Destroy(gameObject) para simular su colección.

Explicación del código Inventario

Figura 82: Código Inventario

Este script lleva el control del número de objetos reunidos:

  • La variable Cantidad almacena el total.
  • AumentarCantidad() incrementa esa cantidad y actualiza el texto.
  • ActualizarTexto() se encarga de reflejar en la interfaz gráfica el nuevo valor.

También incluye una verificación que emite una advertencia si no se ha asignado el campo del texto en el Inspector.

Una vez completadas todas las configuraciones anteriores, al ejecutar el juego se puede observar el sistema de recopilación en funcionamiento de la siguiente manera:

  • Cuando el jugador se acerca y entra en contacto con un objeto coleccionable, este desaparece automáticamente al ser recogido.
  • Al mismo tiempo, el contador de objetos en el Canvas se actualiza en tiempo real, incrementando su valor y mostrando al jugador cuántos objetos ha recogido hasta el momento.
  • Esta interacción es fluida y visualmente clara, aportando una retroalimentación inmediata al jugador sobre su progreso en la colección.

Este sistema no solo mejora la experiencia de juego, sino que también permite implementar mecánicas adicionales como misiones, desbloqueo de niveles o recompensas basadas en la cantidad de objetos atesorados.

Figura 83: Sistema de Recolección

Exportación Android

El juego fue preparado para ejecutarse correctamente en dispositivos Android. Se configuraron los ajustes del proyecto para:

  • Plataforma Android (ARM64)
  • Orientación horizontal (landscape)
  • Scripting backend IL2CPP
  • API mínima Android 7.0 (API 24)

Esto permite compilar el juego como archivo .apk desde Build Settings, y probarlo en teléfonos o tablets.

Autores: Alexander Forero, Manuel Pinzón y Jean Carlo Plata

Editor:  Magister Ingeniero Carlos Iván Pinzón Romero

Codigo: UCMV-10

Universidad: Universidad Central

Referencias

Como hacer un Menú principal en Unity || Tutorial 2025. (2023, May 21). YouTube.de May 24, 2025, de https://www.youtube.com/watch?v=cuXoOKSZ00M
Caminiti, G. (2024, April 28). ¡Cómo Crear un Personaje en Unity 3D! (Fácil y Rápido). YouTube. de http://www.youtube.com/watch?v=FURegpjm9sY
LuisCanary [@LuisCanary]. (s.f.). Cómo hacer un TIMER en Unity 🕒💯 [Video]. YouTube. https://youtu.be/dgMImeoZG5w?si=nW4WF1f-DLBHDqO9