Realidad AumentadaRealidad VirtualVideojuegos

Tutorial Videojuego Unity: Coconut Runner

En este tutorial aprenderás a crear el videojuego que tiene como nombre “Coconut Runner”, fue creado en Unity, y consiste en un laberinto situado en una playa en el cual el jugador debe recorrer e ir recogiendo siete cocos que están esparcidos por el laberinto. El jugador cuenta con tres minutos para recoger todos los siete cocos. Si recoge todos los cocos antes de que el tiempo termine, recibirá un mensaje de felicitación, pero si no recogió los cocos antes de que se terminara el tiempo, se mostrará un mensaje de que perdió el juego, y este a su vez se reiniciará para que el usuario pueda intentarlo de nuevo. 

El proyecto fue creado en el motor de videojuegos multiplataforma llamado Unity, el cual brinda todas las herramientas necesarias para elaborar un videojuego, contemplando todos los aspectos y características que debe contener un videojuego. La versión utilizada de este motor fue la 2019.4.13f1.

Hierarchy en Unity:

La jerarquía utilizada para este proyecto se basa en una escena la cual contiene todos los elementos del juego, es decir, el escenario, que en este caso es una playa, las vallas que componen el laberinto y los cocos. Además de contener elementos básicos como son la iluminación, la cámara y el First Person controller (personaje que se mueve por el mapa controlado por el usuario).  Ya que en los requerimientos del videojuego se pedían mínimo dos plataformas, se situaron dos prefabs de una playa, y para realizar el laberinto, se utilizaron aproximadamente 155 vallas. Además, por problemas de colisiones con las vallas, se utilizaron cubos transparentes que contienen un box collider aplicando una hitbox a cada “pared” del laberinto. Además, para ambientar mejor el juego, se puso el prefab que brinda Unity de agua, y se le aplicó un box collider de igual forma para que el usuario no se caiga y pueda caminar sobre el agua. 

También se manejaron objetos de Unity que permiten mejorar la jugabilidad y la ambientación, como son audio sources para colocar música de fondo y sonidos a los cocos cuando son recogidos. Igualmente, se agregaron objetos de tipo texto, que se activan en la interfaz del usuario en 2D para mostrar el tiempo que le queda al usuario, la cantidad de cocos recogidos y los mensajes de victoria y derrota, estos se encuentran en objeto “canvas” que se encarga de controlar todos los objetos que se muestran en la interfaz del usuario.  En la siguiente imagen se muestra toda la jerarquía del juego. 

Assets en Unity:

Como se mencionó en la jerarquía, se manejaron múltiples assets en este proyecto, muchos de ellos sacados de la Asset store como el paquete de Standard Assets que brinda Unity gratuitamente, del cual se tomaron elementos como el agua, y figuras primitivas para realizar las colisiones y los cocos. 

Pasando a revisar los assets como tal, se debe revisar primeramente la jerarquía de estos, en la cual se puede observar múltiples carpetas, en las cuales destacan la carpeta de los standard assets y la carpeta de los assets del proyecto como tal. 

De las carpeta de Standard Assets se utilizó el prefab del agua para simular el océano, además del First Person Controller. 

Pasando a explorar a fondo el paquete de assets del proyecto se pueden encontrar cuatro carpetas: Materials, Prefabs, Scripts y Sounds, en las que se encuentran todos los archivos, modelos, sonidos y código que componen el juego como tal. 

Entrando en detalle a revisar cada una de las carpetas de los assets del proyecto, podemos encontrar la carpeta Materials, que contiene las texturas y materiales de los objetos utilizados en el juego, en ella encontramos la textura del coco, del puente y de las vallas.

Continuando con la carpeta de Prefabs, encontramos todos los objetos prefabricados encontrados en la página Sketchfab, en la que se tomaron los modelados de la playa, el puente que conecta las dos playas, la valla. Estos objetos fueron descargados algunos en formato fbx y otros en obj, teniendo así uno ya sus texturas incorporadas (como la playa) y otros a los que tocaba agregarle su textura al importarlos (valla y puente). 

En la siguiente carpeta de Scripts se encuentran todos los códigos realizados en C# que se utilizaron para las múltiples acciones y eventos que se implementaron en el videojuego, tales como el temporizador, el contador de cocos recogidos, los triggers de los mensajes de victoria y derrota y las acciones de recoger el coco como tal. 

Y finalmente, en la carpeta de Sounds, encontramos todos los sonidos que se incorporaron en el proyecto, tales como la música de fondo (karaoke de la canción “debajo del mar” utilizada en la película de la sirenita) y el sonido que hacen los cocos cuando son recogidos (efecto de sonido de mordisco caricaturesco en youtube).  La canción de fondo suena cada vez que se inicia el juego (esto se hizo con la función de play on awake) y el sonido de los cocos suena solo cuando estos son recogidos. 

Scripts

Se crearon tres clases de C# en las que se modelan ciertos comportamientos de los objetos encontrados en el videojuego. Estas clases se especifican a continuación: 

CoconutScript:

Esta clase abstrae y modela todo el funcionamiento del coco, es decir, la interacción que tiene el jugador con el objeto a recoger.  Esta clase maneja los dos métodos de Start() y Update() en donde se inicializan la cantidad de cocos en cero cada vez que se inicia el juego, además de controlar cuando se presiona la tecla ‘r’ para que se reinicie el juego. 

Además, cuenta con el método “OnTriggerEnter” que se encarga de validar cuando el jugador toque un coco,  y si es así, que el coco se destruya. Para esto último se utiliza el método Destroy, que a su vez llama al método “OnDestroy” encargado de aumentar un contador cada vez que se destruya un coco para que se lleve la cuenta de cuántos ha recogido el jugador, y cuando llegue a 7 recogidos, la velocidad para caminar y correr del personaje se pondrá en cero para que el jugador no pueda moverse, lo mismo pasa cuando el jugador pierde el juego. 

También está el método “TerminarJuego” que se encarga de iniciar una rutina en el método update cuando se termine el tiempo. Esta rutina hace que después de 4 segundos de terminado el juego, ya bien sea porque ganó o perdió, el juego se reinicie.  

Se importaron las librerías de UnityEngine, UnityEngine.SceneManagement, UnityEngine.UI y UnityStandardAssets.Characters.FirstPerson. 

Levitate:

Esta clase se creó para dar el efecto a los cocos de levitación, para que resalten más en el laberinto. Para hacer esto se crearon los métodos Start() y Update(), además de una variable de vector3 que se utiliza para guardar posiciones X,Y,Z, además de una variable flotante que valida la velocidad del coco. En el método start se toma la posición del coco y en el método update se indica que se mueva el coco en la posición Y aumentando 0.5f(valor de la variable de velocidad) cada segundo. Inicialmente  cada coco se encuentra en la posición Y=2, entonces se le indica en el código que cuando el coco se encuentre en la posición Y=2.5 empiece a moverse hacia abajo hasta que llegue a la posición 2, y que se repitan estas acciones infinitamente. 

Timer:

Para esta clase se utilizaron multples variables que representan los minutos, los segundos, el texto que aparece cuando se pierde y el personaje FPC. En el método Start() se hace que el texto de derrota se inicializa en falso para que no salga de una vez en pantalla, además se hace que el texto que se muestra tenga la estructura de “0 minutos, :0 segundos”, además de inicializar los minutos en 3 y los segundos en 60. En el método Update() se inicia la rutina para que se empiecen a descontar los minutos y los segundos, esto se hace en el método StartCoroutine.

El método TimerTake, al ser una rutina, debe ser de tipo IEnumerator para que funcione. Cuando este método inicia, pregunta si los segundos son iguales a cero, si lo son, entonces se crea una estructura anidada de condicionales en donde la primera condición es válida si los segundos y minutos son iguales a cero, entonces el texto que se muestra debe ser de la forma “0 minutos, :0 segundos”, indicando que el tiempo se acabó, por lo tanto el texto de derrota debe salir en pantalla y la velocidad para caminar y correr del jugador se coloca en cero para que no se pueda mover. En caso de que no se cumpla la condición, los minutos se disminuyen en uno y los segundos se colocan en 59, simulando el cambio de minuto. 

Hay otra condición que valida que cuando los segundos sean menos que diez entonces se valida si el tiempo se acabó, y si lo hizo, se carga de nuevo el juego luego de que pasen cuatro segundos se muestra el texto de la forma “0 minutos :0 segundos”. En caso de que los segundos sean mayores que diez, el texto se muestra de la forma “0 minutos : segundos”.

Fotos de los escenarios en Unity:

INSTRUCCIONES DENTRO DEL JUEGO

AutorJuan Sebastián Martínez Martínez

Editor: Carlos Iván Pinzón

Código: UCRV-8

Universidad: Universidad Central

Fuentes:

Hektor Profe. (2017, abril, 29). Reinicio de juego [#14 Tu primer videojuego 2D multiplataforma en Unity 5 [Archivo de video]. Recuperado de:

https://www.youtube.com/watch?v=7F3wEyhsUVY&list=PLZwTcAUvTX_GtzRMaH_dyVdkK7J7WgtvI&index=3&t=184s

playmedusa. (2016, septiembre, 12). Cómo añadir música y sonidos en Unity (Curso de Unity, 21/22) [Archivo de video]. Recuperado de:

https://www.youtube.com/watch?v=XthsOXzjmro&list=PLZwTcAUvTX_GtzRMaH_dyVdkK7J7WgtvI&index=1

Escuela de juegos. (2017, marzo, 29). [Unity][Capitulo 33] Interludios de Tiempo y Corutinas (Ienumerator, Coroutine, WaitForSeconds) [Archivo de video]. Recuperado de:

https://www.youtube.com/watch?v=b2V3zdsPQAc&list=PLZwTcAUvTX_GtzRMaH_dyVdkK7J7WgtvI&index=4

Rodriguez, M. (2014, noviembre, 14). Tutorial unity3d Juego recoleccion de monedas con sonido y particulas Parte 1 – 2. [Archivo de video]. Recuperado de:

https://www.youtube.com/watch?v=SZl2NmDDjWE&list=PLZwTcAUvTX_GtzRMaH_dyVdkK7J7WgtvI&index=11

Deja una respuesta