Rookie Awards 2024 - Open for Entries!
Explosive Duck Building
Share

Explosive Duck Building

Juan Carlos Maroto Arellano
by juancarrrr on 9 Oct 2023

An exciting augmented reality game designed for mobile devices that combines the fun and strategy of "Angry Birds" with a unique twist: instead of shooting birds, players shoot ducks in an AR environment filled with challenging structures and obstacles.

0 199 0
Round of applause for our sponsors

Este es un juego que realice para la asignatura de VR/AR, en el cual teníamos que hacer un proyecto en Unity 3D enfocado a la Realidad Virtual y otro a la Realidad Aumentada, en este caso voy a mostrar el proyecto de Realidad Aumentada.

Antes de empezar con la explicación del código del videojuego, primero vamos a poner un vídeo del gameplay.

Peso Piezas

Public Rigidbody rb:

Esta línea declara una variable pública llamada rb de tipo Rigidbody. Esta variable se utiliza para almacenar una referencia al componente Rigidbody adjunto a un objeto en Unity.

Public float pesoMadera: 

Esta línea declara una variable pública llamada pesoMadera de tipo flotante. Presumiblemente, esta variable se utilizará para definir el peso de un objeto de madera en Unity.

Void Start(): 

Este es un método especial en Unity que se llama una vez al comienzo del ciclo de vida del objeto. En este método, se obtiene una referencia al componente Rigidbody adjunto al objeto y se almacena en la variable rb.

Void Update(): 

Este es otro método especial en Unity que se llama en cada fotograma del juego. En este método, se actualiza la masa (mass) del componente Rigidbody (rb) con el valor de pesoMadera. Esto significa que la masa del objeto con el componente Rigidbody se establecerá de acuerdo con el valor de pesoMadera en cada fotograma. Esto puede usarse para cambiar dinámicamente la masa de un objeto de madera en función de alguna lógica en el juego.

En resumen, este script parece estar diseñado para ajustar dinámicamente la masa de un objeto con un componente Rigidbody en Unity basándose en el valor de pesoMadera que se establece en el inspector de Unity. Esto podría ser útil para simular cambios en el peso de un objeto de madera durante el juego.

Public Rigidbody rb: 

Declaras una variable pública llamada rb de tipo Rigidbody. 

Public float PesoMetal: 

Declaras una variable pública llamada PesoMetal de tipo flotante. Esta variable se utilizará para definir el peso de un objeto de metal en Unity.

Void Start(): 

Este es un método especial en Unity que se llama una vez al comienzo del ciclo de vida del objeto. 

Void Update(): 

Este es otro método especial en Unity que se llama en cada fotograma del juego. En este método, se actualiza la masa (mass) del componente Rigidbody (rb) con el valor de PesoMetal. Esto significa que la masa del objeto con el componente Rigidbody se establecerá de acuerdo con el valor de PesoMetal en cada fotograma. 

En resumen, este script parece estar diseñado para ajustar dinámicamente la masa de un objeto con un componente Rigidbody en Unity basándose en el valor de PesoMetal que se establece en el inspector de Unity. 

Public Rigidbody rb:

Declaras una variable pública llamada rb de tipo Rigidbody. 

Public float PesoPiedra: 

Declaras una variable pública llamada PesoPiedra de tipo flotante. 

Void Start(): 

Este es un método especial en Unity que se llama una vez al comienzo del ciclo de vida del objeto.

Void Update(): 

Este es otro método especial en Unity que se llama en cada fotograma del juego. En este método, se actualiza la masa (mass) del componente Rigidbody (rb) con el valor de PesoPiedra. Esto significa que la masa del objeto con el componente Rigidbody se establecerá de acuerdo con el valor de PesoPiedra en cada fotograma. 

En resumen, este script parece estar diseñado para ajustar la masa de un objeto de tipo "Piedra" con un componente Rigidbody en Unity basándose en este valor.

Ahora voy a pasar a describir otros Scripts como son los de: Disparo, Score, Timer, Spawner...

Disparo

Private bool dragging: 

Esta variable privada se utiliza para determinar si el objeto actual está siendo arrastrado o no. Inicialmente se establece en falso.

Private float distance: 

Esta variable privada almacena la distancia entre la cámara y el objeto cuando se hace clic en él.

Public float ThrowSpeed, ArchSpeed, Speed: 

Estas variables públicas son ajustables desde el Inspector de Unity y controlan la velocidad a la que se lanzará el objeto, la velocidad de arqueo y la velocidad de movimiento al arrastrar.

Public AudioSource Disparo_Sonido: 

Esto es una referencia a un componente de audio que se usará para reproducir un sonido cuando se lance el objeto.

Private Vector3 offset, Private Transform ToDrag: 

Estas variables privadas se utilizan para almacenar un desplazamiento y la referencia al objeto que se está arrastrando.

Void OnMouseDown(): 

Este método se llama cuando se hace clic en el objeto. Calcula la distancia entre la cámara y el objeto y establece la variable dragging en true, lo que indica que el objeto está siendo arrastrado.

Public void OnMouseUp(): 

Este método se llama cuando se suelta el clic del mouse. Habilita la gravedad del objeto, aplica una velocidad de lanzamiento y de arqueo al objeto utilizando el componente Rigidbody, reproduce un sonido y comienza una corrutina llamada "EliminarBola". Además, realiza algunas acciones relacionadas con la lógica del juego, como activar un objeto llamado "Pato" y reiniciar un contador.

Public void Update(): 

En este método, si la variable dragging es true, el objeto se mueve hacia la posición del cursor del mouse de manera suave y controlada mediante la función Vector3.Lerp, lo que permite arrastrar el objeto.

Public IEnumerator EliminarBola(): 

Esta corrutina espera durante 5 segundos y luego destruye el objeto actual, lo que podría usarse para eliminar el objeto después de cierto tiempo de juego.

En resumen, este script permite al jugador arrastrar y lanzar un objeto con propiedades físicas controladas, como velocidad de lanzamiento y arqueo, mientras maneja eventos de sonido y lógica del juego

Spawner

Public GameObject Bolas: 

Esto declara una variable pública llamada "Bolas" de tipo GameObject. Esta variable se utiliza para almacenar un prefab (un objeto que se puede clonar) que representa un "Pato" o algún otro objeto en el juego.

Public Transform LugarInstanciar: 

Esto declara una variable pública llamada "LugarInstanciar" de tipo Transform. Esta variable se utiliza para almacenar una referencia al punto en el espacio donde se instanciarán los objetos.

Public static int conta: 

Esta es una variable pública y estática de tipo entero llamada "conta/contador". Ser estática significa que su valor es compartido entre todas las instancias de la clase. Parece utilizarse para llevar un seguimiento del estado del juego.

Public static GameObject Pato: 

Esto declara una variable pública y estática llamada "Pato" de tipo GameObject. Al ser estática, puede ser accedida desde cualquier parte del código sin necesidad de una instancia de la clase. Supongo que esta variable almacena una referencia a un objeto llamado "Pato" que se utiliza en el juego.

Public void Update(): 

En el método Update, se verifica el valor de la variable conta. Si conta es igual a 0, se activa el objeto "Pato". Si conta no es igual a 0, se desactiva el objeto "Pato". Esto parece controlar la visibilidad del objeto "Pato" en función del valor de conta.

Public void instanciarPato(): 

Este método se encarga de instanciar el objeto "Pato" (o posiblemente el objeto llamado "Bolas") en el lugar especificado por "LugarIntanciar". También disminuye el valor de marcador en 5 y conta lo establece en 1. Esto indica que el método se llama para crear un nuevo "Pato" y realizar alguna lógica relacionada con la puntuación en el juego.

En resumen, este script parece estar diseñado para gestionar la instanciación de objetos en Unity, en particular, objetos llamados "Patos" o "Bolas". También controla la visibilidad de un objeto "Pato" en función del valor de conta y realiza cambios en la puntuación del juego.

Score

Timer

Public static float TiempoRestante: 

Esto declara una variable pública y estática llamada "TiempoRestante" de tipo flotante y la inicializa con un valor de 90 segundos en este caso. Al ser estática, esta variable se comparte entre todas las instancias de la clase y se puede acceder desde cualquier lugar del código sin necesidad de una instancia del script.

Public Text Textotiempo: 

Esto declara una variable pública de tipo Text. Presumiblemente, esta variable se utiliza para mostrar el tiempo restante en la interfaz de usuario del juego.

Public GameObject SpawnerBolas: 

Esto declara una variable pública de tipo GameObject llamada "SpawnerBolas". Esta variable probablemente almacena una referencia a un objeto en la escena que se utiliza para generar objetos (posiblemente bolas) en el juego.

Void Start(): 

En el método Start, se inicializa la variable "TiempoRestante" con un valor de 90. Esto asegura que el temporizador comienza con 90 segundos cuando se inicia el juego.

Void Update(): 

En el método Update, se actualiza el temporizador. Si el "TiempoRestante" es mayor que 0, se le resta el tiempo transcurrido en el fotograma actual (calculado con Time.deltaTime). Si el tiempo restante llega a ser menor o igual a 0, se establece en 0. Luego, se llama al método TiempoExacto para mostrar el tiempo en el formato deseado.

Public void TiempoExacto(float tiempoMuestra): 

Este método toma un valor de tiempo en segundos como argumento y lo convierte en minutos y segundos. Si el tiempo es menor que 0, se establece en 0, y el objeto "SpawnerBolas" se desactiva, lo que sugiere que se detiene la generación de objetos cuando el tiempo llega a 0. Luego, el tiempo en minutos y segundos se muestra en el objeto Text llamado "Textotiempo" en formato "mm:ss".

En resumen, este script gestiona un temporizador en el juego que cuenta hacia atrás desde 90 segundos y muestra el tiempo restante en un formato específico en la interfaz de usuario. Cuando el tiempo llega a 0, el script desactiva un objeto llamado "SpawnerBolas", lo que podría indicar el final del juego o alguna otra lógica relacionada con el tiempo.

Congelación

Private float contador: 

Esta variable privada de tipo flotante se utiliza para almacenar un valor de tiempo. Inicialmente, se establece en 6.

[SerializeField] Material mat1, Material mat2: 

Estas variables serializadas de tipo Material permiten que los materiales se asignen desde el Inspector de Unity. mat1 y mat2 son dos materiales que se utilizarán para cambiar la apariencia del objeto cuando ocurra cierto evento.

Private Renderer render:

Esta variable privada se utiliza para almacenar una referencia al componente Renderer del objeto al que se adjunta el script. El componente Renderer se utiliza para controlar la apariencia visual del objeto.

Private Rigidbody rb: 

Esta variable privada se utiliza para almacenar una referencia al componente Rigidbody del objeto al que se adjunta el script. El componente Rigidbody se utiliza para simular la física del objeto.

Void Start(): 

En el método Start, se inicializa la variable contador con un valor de 6. Luego, se obtienen referencias a los componentes Renderer y Rigidbody del objeto, y se asegura de que el componente Renderer esté habilitado.

Private void OnCollisionEnter(Collision collision): 

Este método se llama cuando el objeto colisiona con otro objeto en el juego. Si la etiqueta ("tag") del objeto con el que colisiona es "bola", se ejecuta el siguiente código:

Se congela la posición del Rigidbody (rb) y se congela su rotación para que el objeto deje de moverse y girar.

Se cambia el material del Renderer (render) al mat1 asignado desde el Inspector de Unity.

Se utiliza Invoke para llamar al método quemar después de un período de tiempo especificado por la variable contador.

Public void hielo(): 

Este método público parece estar diseñado para revertir los cambios hechos en OnCollisionEnter. Cuando se llama a este método:

La rotación del Rigidbody (rb) se desbloquea para que el objeto pueda girar libremente.

Las restricciones de posición del Rigidbody se eliminan para permitir que el objeto se mueva libremente.

Se cambia el material del Renderer (render) al mat2 asignado desde el Inspector de Unity.

En resumen, este script permite cambiar la apariencia visual y el comportamiento físico de un objeto cuando colisiona con otro objeto con la etiqueta "bola". Luego, proporciona una forma de revertir estos cambios llamando al método hielo.

Impar-Par

Public SpawnerIlimitado Spawner: 

Esto declara una variable pública de tipo SpawnerIlimitado llamada "spawner". Presumiblemente, se utiliza para almacenar una referencia al script SpawnerIlimitado que controla el contador.

[SerializeField] GameObject escudo: 

Esto declara una variable serializada de tipo GameObject llamada "escudo". Esta variable se utiliza para asignar un objeto "escudo" desde el Inspector de Unity.

Private int cont: 

Esta es una variable privada de tipo entero llamada "cont" que se utilizará para almacenar el valor del contador del "SpawnerIlimitado".

Void Update(): 

En el método Update, se llama al método cambio para controlar la activación y desactivación del "escudo" basado en el valor del contador.

Private void cambio(): 

Este método privado se encarga de verificar el valor del contador almacenado en SpawnerIlimitado.conta. Si el valor del contador (cont) es par (se verifica usando el operador %), se activa el "escudo". Si es impar, se desactiva el "escudo".

En resumen, este script controla la visibilidad del objeto "escudo" en función del valor del contador almacenado en el script SpawnerIlimitado. Si el contador es par, el "escudo" se activa; si es impar, se desactiva. Esto podría usarse para implementar algún tipo de mecánica de juego donde el "escudo" está disponible en ciertos momentos determinados por el contador.

Menú-Inicial

Audio Manager

public GameObject MenuInicial, MenuOpciones, MenuNivel;: Estas son variables públicas que almacenan referencias a tres objetos GameObject en la escena. Presumiblemente, MenuInicial representa el menú principal, MenuOpciones representa el menú de opciones y MenuNivel representa el menú de selección de nivel.

public AudioMixer mixerMusic, mixerEffects;: Estas variables públicas almacenan referencias a dos mezcladores de audio que se utilizan para ajustar el volumen de la música y los efectos de sonido en el juego.

public Slider sliderMusic, sliderEffects;: Estas variables públicas almacenan referencias a dos objetos Slider en la interfaz de usuario que permiten a los jugadores ajustar el volumen de la música y los efectos de sonido.

public GameObject MuteMusic, UnmuteMusic, MuteEffects, UnmuteEffects;: Estas son referencias a objetos GameObject que representan botones o elementos de interfaz para silenciar y desactivar el silencio de la música y los efectos de sonido.

float valorMusic, valorEffects, valor_anterior_musica, valor_anterior_effects;: Estas son variables que almacenan valores relacionados con el volumen de la música y los efectos de sonido, así como valores anteriores para el volumen antes de silenciar.

[SerializeField] Text Music_Text, Effects_Text, Puntuacion_Nivel1;: Estas variables serializadas almacenan referencias a objetos Text utilizados para mostrar información relacionada con el volumen de la música, el volumen de los efectos de sonido y la puntuación del nivel 1.

public static int puntuacion_Maxima = 0;: Esta es una variable pública y estática que almacena la puntuación máxima del juego. Puede ser accedida desde otras clases.

void Start(): En el método Start(), se realiza la inicialización inicial. Se obtiene la puntuación máxima almacenada en las preferencias del jugador (PlayerPrefs) y se muestra en la interfaz de usuario. Si la puntuación actual supera la puntuación máxima, se actualiza la puntuación máxima y se guarda en PlayerPrefs.

void Update(): En el método Update(), se actualiza la información relacionada con el volumen de la música y los efectos de sonido en la interfaz de usuario. También se maneja el silencio y la desactivación del silencio de la música y los efectos de sonido.

public void BorrarDatos(): Este método permite borrar los datos almacenados en PlayerPrefs, específicamente la puntuación máxima del juego.

public void Jugar(), public void Nivel1(), public void Salir_Jugar(), public void Opciones(), public void Salir_Opciones(), public void SalirDelJuego(): Estos métodos gestionan la navegación entre los diferentes menús y la escena del juego.

public void SetVolume_Music(float volumeMusic), public void SetVolume_Effects(float volumeEffects): Estos métodos se utilizan para establecer el volumen de la música y los efectos de sonido utilizando los mezcladores de audio.

public void MutearMusic(), public void DesmutearMusic(), public void MutearEffects(), public void DesmutearEffects(): Estos métodos permiten silenciar y desactivar el silencio de la música y los efectos de sonido, y guardan valores anteriores para el volumen antes de silenciar.

En resumen, este script gestiona la configuración de audio, la puntuación máxima, la navegación entre menús y la gestión del volumen en un juego de Unity. Proporciona opciones para ajustar el volumen de la música y los efectos de sonido, así como para silenciar y desactivar el silencio de estos elementos. También permite a los jugadores borrar sus datos guardados y salir del juego.

En el método Start(), que es un método especial en Unity que se ejecuta una vez al inicio del juego, se están realizando las siguientes acciones:

Int volumenMusic = PlayerPrefs.GetInt("Volumen Music", 1): 

Aquí se utiliza PlayerPrefs.GetInt para obtener el valor almacenado en la clave "VolumenMusic". El segundo argumento (1) es un valor predeterminado que se utilizará si no se encuentra ningún valor almacenado en la clave. En otras palabras, si es la primera vez que se ejecuta el juego o si no se ha guardado previamente un valor para "VolumenMusic", se usará el valor predeterminado de 1. El valor obtenido se almacena en la variable volumenMusic.

Int volumenEffects = PlayerPrefs.GetInt("VolumenEffects", 1): 

De manera similar, aquí se obtiene el valor almacenado en la clave "VolumenEffects". De nuevo, si no se encuentra ningún valor almacenado o es la primera vez que se ejecuta el juego, se utilizará el valor predeterminado de 1. El valor obtenido se almacena en la variable volumenEffects.

En resumen, este código se encarga de obtener los valores de volumen de música y efectos de sonido almacenados en las preferencias del jugador utilizando PlayerPrefs y los almacena en variables para su posterior uso en el juego. Esto permite que los jugadores configuren y personalicen su experiencia de sonido en el juego.

Pause Manager


public GameObject Hud, Pausa, YouLose;: Estas son variables públicas que almacenan referencias a tres objetos GameObject en la escena. Presumiblemente, Hud representa la interfaz de usuario principal, Pausa representa la pantalla de pausa y YouLose representa la pantalla de "Has Perdido" o Game Over.

[SerializeField] Text Puntuacion, PuntuacionTiempoReal;: Estas son variables serializadas que almacenan referencias a dos objetos Text utilizados para mostrar la puntuación en la interfaz de usuario.

public AudioSource Sonido_Juego;: Esto declara una variable pública para almacenar un componente de audio que se utilizará para reproducir el sonido del juego.

void Update(): En el método Update, se verifica si el valor del temporizador (timer.TiempoRestante) ha llegado a cero. Si es así, se activa la pantalla de "YouLose", se desactiva la interfaz de usuario principal ("Hud"), se detiene el sonido del juego y se detiene el tiempo en el juego (usando Time.timeScale).

Puntuacion.text = score.marcador.ToString();: Esto actualiza el texto de la puntuación en la interfaz de usuario con el valor almacenado en score.marcador.

PuntuacionTiempoReal.text = score.marcador.ToString();: Esto actualiza otro objeto de texto llamado "PuntuacionTiempoReal" con la misma puntuación que se muestra en "Puntuacion". Es posible que esto sea redundante, ya que ambos muestran la misma puntuación.

public void BotonPausa(): Este método se llama cuando se presiona un botón de pausa en el juego. Desactiva la interfaz de usuario principal ("Hud"), activa la pantalla de pausa ("Pausa"), detiene el sonido del juego y detiene el tiempo en el juego.

public void BotonContinuar(): Este método se llama cuando se presiona un botón de continuar en la pantalla de pausa. Activa la interfaz de usuario principal ("Hud"), desactiva la pantalla de pausa ("Pausa"), reanuda el sonido del juego y restablece el tiempo en el juego a su velocidad normal.

public void BotonReiniciar(): Este método se llama cuando se presiona un botón para reiniciar el juego. Restablece el tiempo en el juego a su velocidad normal, reinicia el temporizador (timer.TiempoRestante), y carga la escena "BlankAR" (posiblemente la escena principal del juego).

public void BotonMenu(): Este método se llama cuando se presiona un botón para regresar al menú principal. Restablece el tiempo en el juego a su velocidad normal, reinicia el temporizador, restablece la puntuación (score.marcador) a cero y carga la escena "Menu".

public void BotonMenu_GameOver(): Este método se llama cuando se presiona un botón para regresar al menú principal desde la pantalla de Game Over. Realiza acciones similares a BotonMenu, como restablecer el tiempo, la puntuación y cargar la escena del menú.

En resumen, este script se encarga de gestionar la interfaz de usuario, la lógica de pausa y el flujo del juego en Unity. Controla la activación de las pantallas de pausa y Game Over, la actualización de la puntuación y la gestión del tiempo en el juego.

My Website

Y por ultimo, os dejo un enlace a mi pagina web:


Comments (0)

This project doesn't have any comments yet.