Videojuegos

Dark Age (Videojuego en Unity 3D)

Este articuló está diseñado para generar una ruta guía del desarrollo de un videojuego, con el fin de apoyar en algunos conceptos básicos utilizando como ejemplo el desarrollo del videojuego Dark Age.

Principalmente un GameDesing sirve para saber qué objetivo busca el Videojuego. En definitiva con esto podemos pasar a diseñar las partes de nuestro videojuego. Con lo anterior definido podemos realizar una búsqueda o diseño de diferentes partes del juego.

Para empezar con el Videojuego

Ahora bien para realizar el videojuego, necesitamos un motor de desarrollo de videojuego para ello utilizaremos Unity. Por lo tanto te recomiendo que al realizar la instalación de la versión de Unity selecciones la versión final, la identificas fácilmente con los números al final acompañados de la letra “F” indicando que es una versión final, en este momento se encuentra las Versiones Unity 2020.1.16f1, 2019.4.16f1, pero también se encuentran la Alpha 2021.1.0a7, de pronto cuando descargues Unity la versión 2021 se encuentre en la versión final, en concreto selecionar una versión en especial te abre la puerta a encontrar nuevas funcionalidades que en versiones anteriores no se encuentre o al revés, para mi caso voy a utilizar Unity 2019.4.16f1.

Les recomiendo que vean el siguiente video sobre Unity realizado por Juan Gabriel Gomila, en el cual pone en marcha un videojuego pequeño de un automóvil, pero resalta puntos importantes a tener en cuenta, como muestra el crear una cuenta y su importancia, la configuración del entorno de Unity (es importante que lo vean para configurar colores y también poder trabajar con Visual Studio), entre otros puntos como los Script que se trabajaran de manera diferente en cada videojuego, entre otros.

Juan Gabriel Gomila Salas.(14 de Agosto 2020).Tutorial completo de Unity 2020 gratis – Aprende a crear videojuegos desde cero [Video]. Youtube. https://www.youtube.com/watch?v=3ROXafxkd6E&t=14078s

Assets utilizados

Para poder empezar necesitamos saber como descargar los Assets desde Unity, para empezar en nuestro entorno se encuentra una ventana con el nombre de Asset Store, sino se encuentra puedes ir a la parte superior en Windows > Asset Store, cargando así la ventana de la Asset Store y la podemos maximizar dando clic derecho sobre el nombre y seleccionar la opcion.

Para buscar los Assets damos click en la barra de búsqueda con justo al lado de la lupa.

La búsqueda se puede filtrar en la parte derecha de la ventana en la cual seleccionamos categoría 3D y precio gratis, encontrando así el Asset que vamos a utilizar en el proyecto. Para ello damos click sobre la imagen y nos llevará al enlace del objeto en 3D, en la nueva ventana podemos ver el botón de descarga y al finalizar la descarga cambiará a la palabra del botón a importar.

Como paso final le damos click en el botón importar para poder llevar todos los objetos del asset al proyecto, la nueva ventana que aparece nos mostrará todos los objetos que vienen en el paquete al importar por defecto viene seleccionados todos solo le damos click en importar en la parte inferior derecha de la ventana.

Esta es la ventana que nos aparece al importar el objeto dependiendo del Asset que importemos, cada autor habrá diseñado diferentes carpetas en las cuales almacenan por defecto una escena de prueba para poder ver el Asset, animaciones algunos assets lo traen otros no, el material y las texturas las cuales le darán el color al personaje y la más importante los prefabs los cuales vienen con el objeto “armado” combinando el objeto, los materiales y texturas, en un solo objeto, el prefab es el que utilizaremos para nuestro proyecto. A continuación le damos en importar.

Ahora a buscar Assets para el Videojuego

finalmente les dejo un pantallaso de los Assets que implemente en el videojuego junto a ellos les dejare una pequeña descripción y un enlace para que los puedan revisar.

Stylized Dungeon – Free Pack

Son implementadas en los diferentes objetos como puertas, antorchas y paredes las cuales generan una mayor perspectiva visual les dejo imágenes de algunos objetos implementados en el juego. El autor de este asset es JoJo Studios.

Procedural fire

Se implementan diferentes estilos de llama los cuales darán un mejor aspecto visual al laberinto afuera y dentro del castillo. Dejo imágenes de algunos objetos implementados en el juego. El autor de este asset es Howl Studio.

Hand Painted Stone Texture

Este asset se ve reflejado en pisos, paredes y techos para dar la sensación de encontrarse dentro del castillo. El autor de este asset es LowlyPoly.

Low Poly Dungeons Lite

El asset se encuentra relacionado para el segundo nivel que es la escenografía dentro del castillo el cual trae diferentes objetos utilizados para dar un mejor acabado. los cuales son sillas, la mesa en el centro del salón, algunas paredes entre otros objetos incluidas las antorchas para iluminar. El autor de este asset es JustCreate.

Action RPG Music Free

Se encuentra implementado en todo el videojuego, lo cual genera una excelente ambientación generando un poco más de emoción dentro del videojuego. El autor de este asset es VGcomposer.

Yughues Free Wooden Floor Materials

Se utilizó para el piso, paredes y techo del tutorial, El autor de este asset es Nobiax / Yughues.

Para conclusion podemos obtener diferentes utilidades de los Assets desde objetos, hasta audios con lo que una buena búsqueda por la tienda es muy probable que encuentre lo que busca.

Diseño de Menú Principal y Niveles

Menú Principal

Scripts

El Script se utiliza para el menú de inicio del juego el cual tiene la opción de cargar la primera escena que en este caso es Tutorial o Tiene la opción de salir del Juego 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
 
public class Controller : MonoBehaviour
{
    
    public void Jugar()
    {
        SceneManager.LoadScene("Tutorial");
    }
 
 
    public void Salir()
    {
        Application.Quit();
    }
}
Creditos:

Para el mostrar los créditos utilizamos esta opción del botón volver en donde colocamos que si el menú principal está activado los créditos están desactivados, de esta manera podemos mostrar las dos interfaces conectadas.

Imagen de fondo:

Imagen propia creada en Photoshop, con alusión al videojuego con el fin de captar la atención del usuario y el diseño de la imagen para los créditos relacionado con el videojuego.

Menú Principal

Al menú principal se crea a 

Créditos

Este es el resultado final de los créditos, les recomendamos mencionar a los creadores como a las personas que les han colaborado directa o indirectamente en el desarrollo del videojuego, aportando claramente en el resultado final de su videojuego, como muestra la imagen siguiente mencionamos a los profesores y coordinadores si no hubiéramos tenido en cuenta sus opiniones, no podrían estar viendo este material, ademas de los Assets que hemos trabajado también cuenta el trabajo y tiempo dedicados por haber dejado a disposición su trabajo.

Tutorial

Script FPSController

Este script se utiliza para controlar nuestro personaje  y la cámara que cumple la función de vista para el jugador , se invoca el método   CharacterController  es principalmente utilizado para controles de jugador de tercera o primera persona que no hace uso de la física del Rigidbody.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class FPSController : MonoBehaviour    
{
    CharacterController characterController;
 
    [Header ("Opciones de Personaje")]
    public float walkSpeed = 6.0f;
    public float runSpeed = 10.0f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
 
    [Header ("Opciones de Camara")]
    public Camera cam;
    public float mouseHorizontal = 3.0f;
    public float mouseVertical = 2.0f;
    public float minRotation = -65.0f;
    public float maxRotation = 60.0f;
    float h_mouse, v_mouse;
 
 
    private Vector3 move = Vector3.zero;
   
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        characterController = GetComponent<CharacterController>();
    }
 
    // Update is called once per frame
    void Update()
    {
        h_mouse = mouseHorizontal * Input.GetAxis("Mouse X");
        v_mouse += mouseVertical * Input.GetAxis("Mouse Y");
        transform.Rotate(0,h_mouse,0);
        v_mouse = Mathf.Clamp(v_mouse,minRotation,maxRotation);
        cam.transform.localEulerAngles = new Vector3 (-v_mouse, 0, 0);
 
        if(characterController.isGrounded)
        {
            move = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
 
         if(Input.GetKey(KeyCode.LeftShift))     
              move = transform.TransformDirection(move) * runSpeed; 
        else 
              move = transform.TransformDirection(move) * walkSpeed; 
 
        if (Input.GetKey(KeyCode.Space))
            move.y = jumpSpeed;
        }
        move.y -= gravity * Time.deltaTime;
 
        characterController.Move(move * Time.deltaTime);
    }
}
Script Contador

Este script se utiliza para instanciar la variable cantidad, la cual hará el conteo de la cantidad de monedas recogida 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using  UnityEngine.UI;
 
public class Contador : MonoBehaviour
{
 
    public int Cantidad = 0;
 
}
Script Interaccion_Objeto :

Este script se utiliza para que al momento de que el jugador toque la moneda esta moneda desaparezca y el jugador gane un punto.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using  UnityEngine.UI;
 
public class Interaccion_Objeto : MonoBehaviour
{
    public Contador contador;
  
    void Start()
    {
        contador =  GameObject.FindGameObjectWithTag("Player").GetComponent<Contador>();
        
    }
 
    private void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Player")
        {
        contador.Cantidad = contador.Cantidad + 1;
 
  
        Destroy(gameObject);
        }
 
  
}
}

Primer Nivel

Script Respawn

Implementado para realizar la reaparición del jugador en un punto determinado, está diseñado para recibir dos objetos el primero será el jugador el segundo un objeto con las coordenadas de aparición. Después de todo se puede aplicar el script a las llaves y a las trampas dentro del videojuego.

public class Respawn : MonoBehaviour
{
    // Start is called before the first frame update

    [SerializeField] private Transform Player;
    [SerializeField] private Transform respawnPoint;

    private void OnTriggerEnter(Collider other)
    {
        Player.transform.position = respawnPoint.transform.position;
    }

}
Letrero Puerta Entrada

Se implementa para mostrar un texto apenas se acerque el jugador a la puerta mostrando el texto “presione E”.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class LetreroPuertaEntrada : MonoBehaviour
{
    Renderer rend;
    public static bool textoPuertaEn = false;
    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
    }
 
    // Update is called once per frame
    void Update()
    {
        if (textoPuertaEn)
        {
            rend.enabled = true;
        }
        if (!textoPuertaEn)
        {
            rend.enabled = false;
        }
    }
}
Cambio Scene

Este script se utiliza para pasar del nivel 1 al nivel 2

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
 
public class CambioEscene23 : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            SceneManager.LoadScene("Nivel02");
        }
    }
}
Control de las entradas 

Con este script lo que se busca hacer es que le aparezca al jugador el texto de ayuda indicando cómo abrir la puerta que desea.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Entrada : MonoBehaviour
{
    Animator anim;
    public bool Dentro = false;
    public bool abierta = false;
 
    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }
 
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player" && !abierta)
        {
            Dentro = true;
            LetreroPuertaEntrada.textoPuertaEn = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            LetreroPuertaEntrada.textoPuertaEn = false;
 
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
 
        {
            anim.SetBool("EntradaAbierta", true);
            LetreroPuertaEntrada.textoPuertaEn = false;
            abierta = true;
        }
    }
}
Llave Amarilla Puerta

Script utilizado en la llave amarilla la cual se utilizara para  poder interactuar con la puerta.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Llave_Amarilla_Puerta2 : MonoBehaviour
{
    Renderer rend;
    public static bool textoPuerta22 = false;
    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
    }
 
    // Update is called once per frame
    void Update()
    {
        if (textoPuerta22)
        {
            rend.enabled = true;
        }
        if (!textoPuerta22)
        {
            rend.enabled = false;
        }
    }
Llave amarilla puerta 2

Este código se utiliza para abrir la puerta de entrada, para abrirla y ahí  le aparecerá un letrero para al jugador como abrirla

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Llave_Amarilla_Puerta2 : MonoBehaviour
{
    Renderer rend;
    public static bool textoPuerta22 = false;
    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
    }
 
    // Update is called once per frame
    void Update()
    {
        if (textoPuerta22)
        {
            rend.enabled = true;
        }
        if (!textoPuerta22)
        {
            rend.enabled = false;
        }
    }
}

Generando un Terreno

A continuación para el nivel se ve reflejado en el terreno, los árboles, las montañas y el pasto que se encuentra en el entorno, a esto se le pueden agregar efectos de viento en el entorno para el movimiento de los árboles y el pasto.

Primero, generar un Terreno: Dentro de la escena podemos agregar en la ventana de Hiterarchy la opción de terreno, realizando clic derecho sobre objetos en 3D se encuentra el objeto Terreno (Terrain).

Como muestra revisaremos las opciones que nos ofrece el objeto en la ventana Inspector en la opción Terrain en el botón en forma de engranaje Terrain Settings(1), con el fin de definir el tamaño que tendrá nuestro terreno (2) en la opción Mesh Resolution en el cual determinaremos largo, ancho y altura de nuestro Terrain.

(1)

Para este caso deje un cubo imaginario de 20x20x20, el cual delimitará el Terrain generado, recuerda revisar las demás opciones dentro de Terrain Settings, ahí se encuentra las opciones para el viento en el pasto y detalle de dibujado para los árboles.

      (2)

Segundo, deformar el Terreno: Ya vimos las opciones de Terrain Settings, ahora vamos a escoger la imagen en forma de pincel y dentro seleccionamos de la pestaña desplegable Raise or Lower Terrain el cual permite deformar el terreno que hemos creado.

A Partir de esta opción podemos escoger diferentes formas de pincel en la opción Brushes, cambiarle el tamaño y también la intensidad a nuestro pincel para comenzar a deformar el terreno.

Para ver nuestro pincel solamente es pasar el cursor sobre el terreno y veremos la figura, al realizar click en él podemos dar aumento al terreno pero si le damos shift+click veremos que se aplanara deshaciendo lo que hayamos realizado.

Agregar Color

3. Agregar Color: Sin salir de la opción de pincel desde la pestaña desplegable anterior seleccionamos la opción Paint Texture, la cual nos servirá para pintar el terreno que ya hemos deformado.

Nos mostrará una serie de opciones similares al de deformar, pero con una funcionalidad adicional que es el Layer el cual nos sirve para pintar el terreno.

Seleccionamos el botón Edit Terrain Layers y creamos uno nuevo, previamente les recomiendo tener los Standard Assets de Unity de los cuales vamos a obtener nuestros Layers. Para nuestro ejemplo busqué GrassRockyAlbedo el cual podemos seleccionar para pintar nuestro terreno por completo, si deseamos pintar diferentes partes con algún otro color repetimos nuevamente los pasos y utilizamos el pincel para pintar los sitios deseados en nuestro terreno.

Si no pinta, selecciona la textura en Terrain Layers saldrá subrayado en azul, la textura.

Les recomiendo revisar la opción de pincel tiene mas herramientas que les pueden ser útiles para el diseño de su videojuego.

Agregar árboles

4. Agregar árboles: Pasamos a la siguiente opción justo al lado de la imagen de pincel se llama Paint Trees, después podemos ver opciones similares al pincel pero vamos agregar árboles desde la opción Trees, en el botón con la imagen de engranaje Edit Trees. Así agregamos un nuevo árbol, les recomiendo tener los standard assets para obtener los árboles de ahí.

Lo que realizamos es buscar el objeto con forma de árbol y agregarlo a nuestro terreno, ahora aparece nuestro árbol justo abajo de Trees.

Recuerde si desea agregar más cantidad de árboles solo es aumentar el tamaño del pincel y como puede ver ya agregamos un árbol a nuestro terreno.

5. Agregar Pasto: Pasamos a la siguiente opción justo al lado del árbol se llama Paint Details, similar al paso anterior buscamos la opción de Edit Details. para luego buscar nuestro objeto 2D en forma de pasto o Grass, que se utilizara con el pincel para pintar donde deseemos agregar pasto.

Por último, similar a los árboles le damos en Add y ponemos el pasto que deseemos a nuestro gusto les recomiendo retirar un poco a causa de que por la cantidad de objetos que agrega puede llegar a caer el rendimiento en el videojuego, puede quitarlo con shift+click.

6. Efecto de Viento: Como lo mencionamos en el primer paso hay configuraciones para el viento sobre el pasto, faltando los árboles. así pues agregamos un nuevo objeto en la ventana de Hierarchy, con click derecho en 3D objects se encuentra WindZone. Generando una flecha con un dibujo de un ventilador en el centro, podemos revisar sus opciones para configurar tanto la fuerza como el tipo de dirección del viento que acabamos de crear.

Mapas con RenderTexture

El RenderTexture permite pasar a un material lo que puede captar una cámara y plasmarlo en un plano para que en tiempo real se visualice en el plano, se implementa en el nivel para realizar mapas:

Primero generar un RenderTexture: Crear una carpeta con el nombre de RenderTexture y dentro de la carpeta generamos un RenderTexture con clic derecho crear.

lo he dejado con el nombre de MapaNivel.

Segundo, aplicarlo a un Material: En la misma carpeta se puede generar un material, damos clic derecho dentro de la carpeta y generamos un Material lo llamaré MaterialMapa:

Como es de esperar ingresamos a las propiedades del material para agregar nuestro RenderTexture al material en el apartado de Main Maps, en la primera opción de Albedo podemos aplicar nuestro RenderTexture, podemos arrastrarlo hasta allí o buscarlo, en esté caso lo buscare.

Tercero, asignarle una Cámara: Para ello creamos una cámara dentro de la escena y con la cual se la asignaremos dentro de las opciones de la cámara en la opción de Target Texture nuestro RenderTexture, podemos arrastrar el RenderTexture o buscarlo similar al Material.

Cuarto Aplicar el material a una superficie u objeto: Ya con el material que hemos creado se lo podemos asignar a una superficie en la cual mostrará lo que puede ver la cámara, he generado un plano para el mapa y lo situará cerca al personaje para poderlo ver.

pueden ver la el plano a la izquierda del personaje y la cámara con el RenderTexture a su derecha. Ahora le asignamos el material creado con el RenderTexture.

Como resultado podemos ver como se ve nuestro personaje a través de un RenderTexture sobre un plano tengan en cuenta el campo de visión de la cámara y la resolución que tiene el RenderTexture para tener una imagen más definida.

Segundo Nivel  

Script abrirPuerta

Este script se utiliza para abrir las puertas del juego cada puerta tiene su propio script igual, lo que cambia es la puerta a la que se le hará la acción. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class abrirPuerta11 : MonoBehaviour
{
    Animator anim;
    public bool Dentro = false;
    public bool abierta = false;
    public static bool tomadaVerde = false;
    public static bool tomadaRosa = false;
    public static bool tomadaNaranja = false;
 
    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }
 
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player" && !abierta)
        {
            Dentro = true;
            LetreroPuerta1.textoPuertan1 = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            LetreroPuerta1.textoPuertan1 = false;
            NoLlaves.textoNoLlaves = false;
 
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E)&& tomadaNaranja && tomadaRosa && tomadaVerde)
 
        {
            anim.SetBool("abierta1", true);
            LetreroPuerta1.textoPuertan1 = false;
            abierta = true;
        }
        else
        {
            if(Dentro && Input.GetKeyDown(KeyCode.E) && (!tomadaNaranja || !tomadaRosa || !tomadaVerde))
            {
                NoLlaves.textoNoLlaves = true;
                LetreroPuerta1.textoPuertan1 = false;
            }
        }
    }
}
Control_llave

A continuación este script se utiliza para que interactue con la llave amarilla, es decir, que cuando este tome la llave se pueda ir al contador para que busque las otras dos llaves faltantes y pueda abrir las puertas.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Control_Llave : MonoBehaviour
{
    public bool Dentro = false;
 
    // Start is called before the first frame update
    void Start()
    {
        
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = true;
            PresioneEAmarilla.textoLlaveAmarilla = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneEAmarilla.textoLlaveAmarilla = false;
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
        {
            Control_Puerta.tomadaAmarilla = true;
            ControlPuertaBodega.tomadaAmarilla = true;
            PresioneEAmarilla.textoLlaveAmarilla = false;
            Destroy(gameObject);
            
        }
    }
}
Control_Puertas:

Este código se utiliza para abrir la puerta con la llave amarilla previamente seleccionada.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class Control_Puerta : MonoBehaviour{
    Animator anim;
    public bool Dentro = false;
    public static bool tomadaAmarilla = false;
    public bool abierta = false;
    
    // Start is called before the first frame update
    void Start(){
        anim = GetComponent<Animator>();
    }
 
    void OnTriggerEnter(Collider col){
        if(col.tag == "Player" && !abierta)
        {
            Dentro = true;
            MostrarTexto.textoPuerta2 = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            MostrarTexto.textoPuerta2 = false;
            Llave_Amarilla_Puerta2.textoPuerta22 = false;
 
        }
    }
 
    // Update is called once per frame
    void Update()
    {
 
        if(Dentro && Input.GetKeyDown(KeyCode.E) && tomadaAmarilla)
 
        {
            anim.SetBool("abierta", true);
            MostrarTexto.textoPuerta2 = false;
            abierta = true;
        }
        else
        {
            if(Dentro && Input.GetKeyDown(KeyCode.E) && !tomadaAmarilla)
            {
                Llave_Amarilla_Puerta2.textoPuerta22 = true;
                MostrarTexto.textoPuerta2 = false;
            }
        }
    }
}

Control_llave Azul

Asimismo la llave amarilla también tiene un controlador.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ControlLlaveAzul : MonoBehaviour
{
    public bool Dentro = false;
 
    // Start is called before the first frame update
    void Start()
    {
 
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = true;
            PresioneEAzul.textoLlaveAzul = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneEAzul.textoLlaveAzul = false;
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
        {
            ControlPuertaBodega.tomadaAzul = true;
            PresioneEAzul.textoLlaveAzul = false;
            Destroy(gameObject);
 
        }
    }
}
Control Llave Roja:

Controlador de la llave roja.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ControlLlaveRoja : MonoBehaviour
{
    public bool Dentro = false;
 
    // Start is called before the first frame update
    void Start()
    {
 
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = true;
            PresioneERoja.textoLlaveRoja = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneERoja.textoLlaveRoja = false;
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
        {
            ControlPuertaBodega.tomadaRoja = true;
            PresioneERoja.textoLlaveRoja = false;
            Destroy(gameObject);
 
        }
    }
}

En síntesis después de obtener las tres llaves.

Control puerta bodega:

Como resultado, al obtener ya las tres llaves se utiliza este controlador para abrir la puerta.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ControlPuertaBodega : MonoBehaviour
{
    Animator anim;
    public bool Dentro = false;
    public static bool tomadaAmarilla = false;
    public static bool tomadaAzul = false;
    public static bool tomadaRoja = false;
    public bool abierta = false;
 
    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }
 
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player" && !abierta)
        {
            Dentro = true;
            PresioneBodega.texto1Bodega = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneBodega.texto1Bodega = false;
            FaltanLlavesBodega.Texto2Bodega = false;
 
        }
    }
 
    // Update is called once per frame
    void Update()
    {
 
        if (Dentro && Input.GetKeyDown(KeyCode.E) && tomadaAmarilla && tomadaAzul && tomadaRoja)
        {
            anim.SetBool("bodegaAbierta", true);
            PresioneBodega.texto1Bodega = false;
            abierta = true;
            TextoFinal.TxtFinal = true;
        }
        else
        {
            if (Dentro && Input.GetKeyDown(KeyCode.E) && (!tomadaAmarilla || !tomadaAzul || !tomadaRoja))
            {
                FaltanLlavesBodega.Texto2Bodega = true;
                PresioneBodega.texto1Bodega = false;
 
            }
        }
    }
}
Faltan llaves Bodega:

Este script se utiliza para indicarle al jugador que faltan llaves y por eso no puede abrir la puerta que quiere.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class FaltanLlavesBodega : MonoBehaviour
{
    Renderer rend;
    public static bool Texto2Bodega = false;
    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Texto2Bodega)
        {
            rend.enabled = true;
        }
        if (!Texto2Bodega)
        {
            rend.enabled = false;
        }
    }
}
Letrero Puerta

Este script se utiliza para explicarle al jugador como abrir las puertas.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class LetreroPuerta1 : MonoBehaviour
{
    Renderer rend;
    public static bool textoPuertan1 = false;
    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
    }
 
    // Update is called once per frame
    void Update()
    {
        if (textoPuertan1)
        {
            rend.enabled = true;
        }
        if (!textoPuertan1)
        {
            rend.enabled = false;
        }
    }
}
LLave Naranja

Este script  se utiliza para la interaccion con la llave naranja.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class LlaveNaranja : MonoBehaviour
{
    public bool Dentro = false;
 
    // Start is called before the first frame update
    void Start()
    {
 
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = true;
            PresioneENaranja.textoLlaveNaranja = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneENaranja.textoLlaveNaranja = false;
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
        {
            abrirPuerta11.tomadaNaranja = true;
            PresioneENaranja.textoLlaveNaranja = false;
            Destroy(gameObject);
 
        }
    }
}
Llave Rosa

Este script  se utiliza para la interaccion con la llave Rosa.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class LlaveRo : MonoBehaviour
{
    public bool Dentro = false;
 
    // Start is called before the first frame update
    void Start()
    {
 
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = true;
            PresioneERosa.textoLlaveRosa = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneERosa.textoLlaveRosa = false;
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
        {
            abrirPuerta11.tomadaRosa = true;
            PresioneERosa.textoLlaveRosa = false;
            Destroy(gameObject);
 
        }
    }
}
Llave Naranja

Este script  se utiliza para la interaccion con la llave naranja.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class LlaveNaranja : MonoBehaviour
{
    public bool Dentro = false;
 
    // Start is called before the first frame update
    void Start()
    {
 
    }
    void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = true;
            PresioneENaranja.textoLlaveNaranja = true;
        }
    }
    void OnTriggerExit(Collider col)
    {
        if (col.tag == "Player")
        {
            Dentro = false;
            PresioneENaranja.textoLlaveNaranja = false;
        }
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Dentro && Input.GetKeyDown(KeyCode.E))
        {
            abrirPuerta11.tomadaNaranja = true;
            PresioneENaranja.textoLlaveNaranja = false;
            Destroy(gameObject);
 
        }
    }
}

Autores:
Miguel Angel Moreno Rodriguez
Jean Sebastian Salamanca Wilches
Maria Paula Garcia Tarquino

Editor : Carlos Pinzón

Código: UCRV-5

Universidad: Universidad Central

Fuentes:

Unity Technologies. (2020). Cámara. Unity Documentation. https://docs.unity3d.com/es/530/Manual/class-Camera.html
Guinxu. (2019, Mayo 16 ). Efectos que engañan al jugador en videojuegos | Parte 2 [Video]. YouTube. https://www.youtube.com/watch?v=Oqo4QEPi698
Juan Gabriel Gomila Salas.(14 de Agosto 2020).Tutorial completo de Unity 2020 gratis - Aprende a crear videojuegos desde cero [Video]. Youtube. https://www.youtube.com/watch?v=3ROXafxkd6E&t=14078s
JoJo Studios. (9 de Septiembre 2020). Stylized Dungeon - Free Pack. Unity Asset Store. https://assetstore.unity.com/packages/3d/environments/dungeons/stylized-dungeon-free-pack-178268
Hovl Studio. (23 de Abril 2020). Procedural fire. Unity Asset Store. https://assetstore.unity.com/packages/vfx/particles/fire-explosions/procedural-fire-141496
LowlyPoly. (27 de Mayo 2020). Hand Painted Stone Texture. Unity Asset Store. https://assetstore.unity.com/packages/2d/textures-materials/floors/hand-painted-stone-texture-73949
JustCreate. (2 de Septiembre 2020). Low Poly Dungeons Lite. Unity Asset Store. https://assetstore.unity.com/packages/3d/environments/dungeons/low-poly-dungeons-lite-177937
VGcomposer. (30 de Agosto 2019). Action RPG Music Free. Unity Asset Store. https://assetstore.unity.com/packages/audio/music/action-rpg-music-free-85434

Nobiax / Yughues. (1 de Abril 2015). Yughues Free Wooden Floor Materials. Unity Asset Store. https://assetstore.unity.com/packages/2d/textures-materials/wood/yughues-free-wooden-floor-materials-13213

Deja una respuesta