Rookie Awards 2024 - Open for Entries!
Adventure Trip
Share

Adventure Trip

Juan Carlos Maroto Arellano
by juancarrrr on 2 Oct 2023

"Adventure Trip" is an exhilarating side-scrolling 2D platformer that thrusts players into an action-packed adventure on a mysterious island teeming with dangers and treasures. In this immersive gaming experience, your survival skills will be put to the test as you encounter a variety of formidable foes and face perilo

0 216 0
Round of applause for our sponsors

Para la realizacion de este videojuego mi compañero tuvimos que realizar todo el arte, ademas de riggear, animar y programar todo el videojuego en 3 semanas.

Antes de empezar con la explicacion del codigo del videojuego, primero vamos a poner un gameplay.

A continuacion voy a dejar dos links, uno de itch.io para que puedas descargar el juego y otro de github para que puedas descargar el proyecto o ver como esta organizado.

Character Controller

Vamos a explicar el codigo mas importante del videojuego, y el que hace que todo funcione correctamente, y vamos a empezar por el codigo que compone al personaje.

Definición de Variables:

Variables públicas y privadas son empleadas para configurar y gestionar el comportamiento del personaje. Algunas de estas variables engloban Disparo (un GameObject para disparar), speed (la velocidad del personaje), jump (la fuerza del salto), FXsalto y FXdisparo (sonidos de salto y disparo), entre otras.

Método Awake:

Este método se utiliza para inicializar ciertas variables, como el componente AudioSource, además de establecer las señales sonidoSalto y sonidoDisparo.

Método Start:

El objetivo principal de este método es la configuración de otras variables, como el componente CheckGround, el componente Animator y el componente Rigidbody2D del personaje. También se lleva a cabo la inicialización de ciertas señales relacionadas con el estado del personaje, tales como estoyatacando, estoysaltando y estoytocandosuelo.

Método Update:

Este método contiene la lógica principal para controlar al personaje.

En primer lugar, se actualiza la posición Z del personaje para asegurarse de que se encuentre en el plano correcto.

Seguidamente, se verifica si el personaje tiene la capacidad de moverse (canMove).

Si el jugador no está presionando ninguna tecla de movimiento, ni está atacando o saltando, se inicia una animación de estado inactivo (idle).

Si el jugador pulsa el botón de disparo (Fire1), se crea una instancia de un objeto Disparo en la posición actual del personaje, y se ejecuta una animación de disparo.

Si el jugador presiona las teclas de movimiento horizontal, el personaje se desplaza en la dirección correspondiente y se activa una animación de carrera.

Se verifica si el personaje está en contacto con el suelo (colisionador) para permitirle efectuar un salto. Si el jugador presiona el botón de salto (Jump) y el personaje se encuentra en el suelo, este ejecuta un salto y se reproduce un sonido de salto.

En el caso de que el jugador pulse el botón de salto pero no esté en el suelo, se muestra un mensaje de depuración.

Ademas también tenemos para ver el código de los scripts del GroundCheck, plataformas, disparo y la vida.

Este fragmento de código tiene como objetivo verificar si un objeto, generalmente asociado a los pies del personaje del jugador, está en contacto con el suelo o alguna plataforma. Los elementos clave del código son los siguientes:

Public static bool colPies:

Esta variable estática se utiliza para indicar si el objeto, que normalmente representa los pies del personaje, está en contacto con el suelo o una plataforma.

Private void OnTriggerEnter2D(Collider2D collision): 

Este método se activa cuando el objeto entra en contacto con otro objeto a través de colisiones. Si el objeto con el que colisiona tiene la etiqueta "Terreno" o "Plataformas", se establece la variable colPies en true, lo que indica que el objeto se encuentra en el suelo o una plataforma.

Private void OnTriggerExit2D(Collider2D collision): 

Este método se llama cuando el objeto deja de estar en contacto con otro objeto. Si el objeto que ha perdido el contacto tiene la etiqueta "Terreno" o "Plataformas", la variable colPies se establece en false, indicando que el objeto ya no está en el suelo o en una plataforma.

Este fragmento de código resulta útil para rastrear si el personaje está tocando el suelo o alguna plataforma, lo cual es fundamental para determinar si el personaje puede llevar a cabo ciertas acciones, como saltar, entre otras.

Código 2 (Colision_Platform):

Este script se utiliza para gestionar las colisiones entre el objeto al que se adjunta el script y a las plataformas. Aquí se destacan las partes clave del código:

Public static bool sonido_Plataforma: 

Esta variable estática se emplea para controlar si se debe reproducir un sonido cuando el objeto colisiona con una plataforma.

Private AudioSource Music: 

Se utiliza un componente AudioSource para reproducir sonidos.

Private void OnCollisionEnter2D(Collision2D collision): 

Este método se ejecuta cuando el objeto colisiona con otro objeto. Si el objeto con el que colisiona tiene la etiqueta "Plataformas", se reproduce un sonido mediante AudioSource.PlayClipAtPoint, y la variable sonidoPlataforma se establece en false. Además, el objeto al que se le ha adjuntado este script se convierte en un hijo del objeto con el que colisiona. Esta asociación se suele utilizar para que el objeto siga el movimiento de la plataforma.

Private void OnCollisionExit2D(Collision2D collision): 

Este método se activa cuando el objeto deja de colisionar con otro objeto. En este caso, el objeto se desvincula de cualquier objeto padre (generalmente la plataforma) al establecer el padre en null.

Este script permite gestionar colisiones con plataformas y controlar la reproducción de sonidos en respuesta a estas colisiones.

Código 3 (Disparo):

Este script se encarga de controlar el comportamiento de un objeto que se desplaza hacia adelante, generalmente representando un proyectil. Aquí se detallan los aspectos clave:

Public float speed: 

Esta variable determina la velocidad a la que el objeto se mueve hacia adelante.

Void Update(): 

En el método Update, el objeto se desplaza hacia adelante en cada frame utilizando la función transform.Translate.

Private void OnTriggerEnter2D(Collider2D collision): 

Este método se activa cuando el objeto entra en contacto con otro objeto. Si el objeto con el que colisiona tiene la etiqueta "Enemigo", se llama al método destroyme(), que elimina este objeto.

Public void destroyme(): 

Este método se utiliza para eliminar este objeto.

Private void OnBecameInvisible(): 

Este método se activa cuando el objeto se vuelve invisible en la cámara. En este caso, el objeto se eliminará.

Este script se emplea típicamente para objetos como proyectiles que avanzan y pueden ser destruidos al colisionar con enemigos o al salir de la vista de la cámara.

Código 4 (vida):

Este script se encarga de controlar la vida del objeto, que en este caso se trata del personaje principal del jugador. Aquí están los aspectos fundamentales:

Public float Vida:

Esta variable representa la cantidad de vida del objeto.

Public Slider barraVida: 

Parece estar relacionada con una barra de vida en la interfaz gráfica del juego.

Void Update(): 

En el método Update, se actualiza la barra de vida para reflejar el valor de la vida actual del objeto. Si la vida llega a cero o menos, el script carga una escena llamada "Menu_Inicio" y elimina el objeto, que posiblemente en este caso es el personaje del jugador.

En resumen, este script se utiliza para supervisar y mostrar la vida del objeto y, en caso de que la vida se agote, realizar acciones importantes, como cargar una pantalla de inicio del juego y eliminar el objeto si es necesario.

Enemy

Ahora voy a explicar los tres codigos diferentes de enemigos: el del boss final, el del indigena y el seguimiento del indigena hacia ti.

Variables y Componentes:

Private Animator myanimator: 

Esta variable almacena una referencia al componente Animator que controla las animaciones del jefe enemigo.

Private static bool sonidoMuerte: 

Esta variable estática determina si se debe reproducir un sonido cuando el jefe enemigo muere. Al ser estática, se comparte entre todas las instancias del jefe enemigo en el juego.

Private bool OnnOff: 

Esta variable parece estar sin uso en el código y podría ser innecesaria.

Private AudioSource music: 

Este es un componente AudioSource que se utiliza para reproducir sonidos relacionados con el jefe enemigo.

Public AudioClip FXMuerte: 

Este es el sonido que se reproduce cuando el jefe enemigo es derrotado.

Public int VidaEnemy = 30: Es una variable estática.

Esta variable establece la cantidad de vida inicial del jefe enemigo en 30. 

Método Awake:

Se usa para configurar algunas variables, como el componente AudioSource y se establece la variable sonidoMuerte en falso al inicio.

Método Start:

Se utiliza para configurar el componente Animator y se establece la variable OnnOff en verdadero (aunque esta variable no se utiliza más adelante).

Método Update:

En este método, se inicializa la animación "Animation_Idle", lo que indica que el jefe enemigo está en estado de espera.

Luego, se verifica si la vida del jefe enemigo (VidaEnemy) es igual o menor que cero. Si es así, el jefe enemigo se destruye y se reproduce un sonido de muerte. Además, la variable sonidoMuerte se establece en falso, aunque su uso no está claro en este contexto.

Método OnTriggerEnter2D:

Este método se activa cuando el jefe enemigo colisiona con otro objeto que tiene un colisionador en modo trigger. Aquí se detectan dos tipos de colisiones posibles:

Si el objeto con el que colisiona tiene la etiqueta "Disparo", la vida del jefe enemigo (VidaEnemy) se reduce en 1.

Si el objeto con el que colisiona tiene la etiqueta "Player", se accede al componente de vida del jugador y se reduce en 1 su vida. Esto significa que el jefe enemigo puede dañar al jugador cuando colisiona con él.

Estas son las variables:

Private GameObject principal: 

Esta variable almacena una referencia al GameObject "Pirata", que es el objeto que queremos seguir.

Public float speed: 

Esta variable determina la velocidad a la que el objeto que contiene este script se moverá hacia el objeto "Pirata".

Metodo Start:

Se encuentra el GameObject llamado "Pirata" utilizando GameObject.Find("Pirata") y se almacena en la variable principal. Esto se hace al comienzo del juego para asegurarse de que siempre tengamos una referencia al personaje principal al que queremos seguir.

Metodo Update:

Aquí se implementa la lógica principal para que el objeto que contiene este script siga al personaje principal.

Transform.position representa la posición actual del objeto que contiene este script (el objeto que queremos que siga al "Pirata").

Vector2.MoveTowards se utiliza para mover gradualmente la posición del objeto actual hacia la posición del "Pirata". Se pasan tres argumentos a esta función:

La posición actual del objeto (transform.position).

La posición hacia la cual queremos movernos (principal.transform.position que es la posición del "Pirata").

La velocidad a la que queremos que se mueva (speed * Time.deltaTime).

Speed * Time.deltaTime garantiza que el movimiento sea suave y dependa del tiempo para que sea constante en diferentes sistemas y velocidades de fotogramas.

Parallax y SpawnEnemigos

Las variables son:

Private float length, startpos: 

Almacenan la longitud de la imagen de fondo y su posición inicial en el eje X.

Public GameObject cam: 

Es una referencia a la cámara principal del juego, que debes asignar en el Inspector de Unity.

Public float parallaxEffect: 

Determina la velocidad del fondo en relación con la cámara. Un valor mayor aumenta la velocidad, mientras que un valor menor la disminuye.

Método Start:

Inicializa startpos con la posición inicial en el eje X del objeto que contiene el script.

Calcula la longitud ("length") utilizando el componente SpriteRenderer para representar la longitud de la imagen de fondo en el eje X.

Método FixedUpdate:

Calcula la distancia ("dist"), que representa cuánto debe desplazarse el fondo en relación con la cámara, basándose en la distancia recorrida por la cámara en el eje X y el factor parallaxEffect.

Actualiza la posición del objeto en el eje X, creando el efecto de parallax, manteniendo las coordenadas Y y Z sin cambios.

Estas son las variables:

Public GameObject bomba: 

Referencia al prefab de la bomba u objeto que se generará aleatoriamente en el juego. Debes asignar este prefab en el Inspector de Unity.

Public int xPos: 

Variable para almacenar la posición X en la que se generará la bomba de manera aleatoria.

Public int Contador: 

Variable para llevar un registro del número de bombas que se generarán. Puedes establecer su valor inicial en el Inspector de Unity.

public float espera = 0.5f: Variable que determina el tiempo de espera entre la generación consecutiva de bombas.

Método Start:

Este método se ejecuta una vez al inicio del juego.

Llama a StartCoroutine(BombaDrop()), que inicia la generación aleatoria de bombas como una rutina (corrutina). Esto permite generar bombas de forma continua a lo largo del tiempo.

Método BombaDrop (Corrutina):

Es una rutina que genera bombas de forma aleatoria mientras el valor de Contador sea mayor o igual a 0.

En cada iteración del bucle while, se genera una posición X aleatoria en el rango entre 20 y 99 (ajustable) y se guarda en la variable xPos.

Luego, se utiliza Instantiate para crear una instancia del prefab de la bomba en la posición (xPos, 10, 0) del escenario. Esto establece la altura a la que se generará la bomba en el juego.

Después de crear la bomba, el código espera un tiempo determinado, especificado por espera, antes de continuar con la siguiente iteración.

Finalmente, se incrementa el valor de Contador en 1 para llevar un registro del número de bombas generadas.

My Website


Comments (0)

This project doesn't have any comments yet.