Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

En esta lección, utilizaremos la lógica de ítems coleccionables creada previamente para desencadenar una acción dentro del juego.

Como ejemplo, haremos que una puerta que bloquea el camino del jugador se elimine de la escena solo después de que se hayan recolectado todos los ítems en el mapa.

Esta es una estructura de juego muy común: el jugador completa un objetivo y el juego reacciona desbloqueando algo. Podría ser una puerta, una plataforma, un ascensor, un puente, una cinemática, una pelea con un jefe, o cualquier otro evento de progresión.

En esta lección, aprenderás a acceder y manipular una Entity desde la lógica de otra Entity. En este caso, el Jugador verificará el progreso de la colección y luego eliminará la Puerta de la escena.

1. Creando la Lógica para Eliminar la Puerta

Comencemos creando una nueva Entity Template para nuestra puerta.

Configura el Mesh que se utilizará como su representación visual y añade un componente de física para que la puerta pueda bloquear el paso del Jugador.

Dado que la puerta debe impedir que el personaje pase a través de ella, no habilites la opción Ghost en el componente de física.

Un cuerpo físico Ghost puede detectar colisiones, pero no bloquea físicamente el movimiento. Para el ítem coleccionable, eso era exactamente lo que queríamos. Pero para la puerta, queremos lo opuesto: el Jugador no puede pasar hasta que se complete la condición.

Al presionar la tecla 3, puedes visualizar la vista previa de colisión de la Entity. Esto es útil para confirmar si la forma física coincide correctamente con la puerta.

Cave te ofrece diferentes maneras de configurar la forma física. Puedes usar el mesh del objeto como la colisión, importar un modelo optimizado diferente hecho solo para física, o incluso usar cualquier otro Mesh del proyecto como la forma de colisión.

Elige la opción que mejor se ajuste a las necesidades y al rendimiento de tu juego.

image.png

El sistema que creamos previamente ya nos brinda exactamente la información que necesitamos para controlar cuándo se debe eliminar la puerta.

Calcula automáticamente el número total de ítems coleccionables presentes en la escena, sin importar cuántos ítems existan en el mapa, y también lleva un registro de cuántos de ellos ya han sido recolectados por el Jugador.

Esto hace que la lógica sea muy flexible. No necesitamos cambiar manualmente un número cada vez que añadimos o eliminamos ítems del nivel. El contador seguirá funcionando correctamente, adaptándose automáticamente a la cantidad de coleccionables disponibles en la escena.

image.png

Con esta información disponible — ítems recolectados y total de ítems — simplemente podemos comparar ambos valores.

Cuando el número de ítems recolectados es igual al número total de ítems en el mapa, significa que el jugador encontró todos los coleccionables y completó el objetivo requerido para abrir el camino.

A partir de esta condición, ejecutaremos la lógica responsable de eliminar la puerta de la escena, permitiendo que el jugador avance a la siguiente área del juego.

Después de actualizar TextCollect, verificaremos si todos los ítems del mapa ya han sido recolectados.

Para hacer eso, obtén las propiedades Collected Item y Max Item y utiliza un nodo de comparación para verificar si ambos valores son iguales.

Si la condición es verdadera, significa que el jugador recolectó cada ítem disponible en la escena y cumplió con el requisito necesario para desbloquear la progresión.

image.png

A partir de esta verificación, podemos ejecutar la lógica responsable de eliminar la puerta y permitir el acceso a la siguiente área.

Para hacer esto, accederemos y manipularemos una Entity desde la lógica del Jugador.

Primero, obtén la Scene y utiliza el nodo Get Entities With Name, pasando el nombre de la Entity puerta. En este caso, el nombre es Door.

Este nodo devuelve una lista de Entities encontradas con ese nombre.

Luego, utiliza un nodo de Get para recuperar el elemento en el índice 0, que corresponde a la primera Entity encontrada con ese nombre.

Finalmente, conecta esa Entity al nodo Kill.

Cuando esta lógica se ejecute, la puerta se eliminará de la escena.

image.png

Es importante entender lo que está sucediendo aquí.

El Jugador no está directamente conectado a la Puerta como una Entity hijo o padre. En cambio, el Jugador obtiene la Scene actual, busca una Entity llamada Door, la recupera de la lista de resultados y luego la elimina.

Esto significa que puedes crear lógica donde un objeto afecta a otro objeto en la escena, lo cual es esencial para crear interacciones de juego.

Una cosa a tener en cuenta es que Get Entities With Name devuelve una lista porque puede haber más de una Entity con el mismo nombre. En este ejemplo, estamos obteniendo el índice 0, lo que significa que estamos utilizando el primer resultado encontrado. Para este caso simple, eso está bien. Pero en proyectos más grandes, es una buena idea mantener los nombres de las Entity importantes organizados, o usar etiquetas y otras referencias según la situación.

Esta lógica puede expandirse de muchas maneras diferentes.

En este ejemplo, utilizamos la colección de todos los ítems para eliminar una puerta, pero el mismo principio se puede aplicar a casi cualquier evento dentro de tu juego.

En lugar de eliminar una puerta, podrías:

  • mover una plataforma
  • activar un ascensor
  • reproducir una cinemática
  • habilitar una palanca
  • iniciar una pelea con un jefe
  • desbloquear una nueva área
  • generar enemigos
  • cambiar el objetivo del nivel

Lo más importante es entender que ahora tienes las herramientas necesarias para crear objetivos y recompensas utilizando la lógica visual de Cave.

Debido a eso, un gran ejercicio es intentar adaptar este sistema a algo diferente del ejemplo mostrado en esta lección. Puedes crear tu propia condición, tu propia recompensa y explorar nuevas posibilidades utilizando todo lo que has aprendido hasta ahora.

image.png