Primeros pasos con Salas y Portales

El RoomManager

Cada vez que deseas utilizar el sistema de portales, debes incluir un nodo especial en tu árbol de escena llamado RoomManager. El RoomManager es responsable del mantenimiento en tiempo de ejecución del sistema, especialmente de convertir los objetos en tus salas en un grafo de salas que se utiliza durante la ejecución para realizar la ocultación de objetos y otras tareas.

Conversion de Salas

Esta conversión debe realizarse cada vez que deseas activar el sistema. No almacena el grafo de salas en tu proyecto (por razones de flexibilidad y para ahorrar memoria). Puedes activar la conversión presionando el botón Convert Rooms en la barra de herramientas del editor (que también tiene un acceso directo de teclado) o llamando al método rooms_convert() en el RoomManager. El último método es el que utilizarás en el juego. Ten en cuenta que, por seguridad, es mejor práctica llamar a rooms_clear() antes de descargar o cambiar de nivel.

../../../_images/convert_rooms_button.png

Si conviertes el nivel mientras el editor está en ejecución, el sistema de culling de portales tomará el control del culling de frustum normal de Godot, lo que potencialmente interferirá con las características del editor. Para evitar esto, puedes activar y desactivar el culling de portales utilizando el interruptor View Portal Culling en el menú View de la barra de herramientas del editor (que también tiene un acceso directo de teclado) o el ajuste Active en el nodo RoomManager.

Nota

Para utilizar el RoomManager, debes indicarle dónde se encuentran las salas en tu árbol de escena, o más específicamente, dónde se encuentra el nodo RoomList. Este RoomList es el padre de tus salas, como se muestra a continuación. Si el RoomList no está configurado, la conversión fallará y verás un cuadro de diálogo de advertencia.

../../../_images/room_manager.png

La RoomList

Antes de crear cualquier habitación, primero debemos crear un nodo que será el padre de todos los objetos estáticos, salas, grupos de salas, etc., en nuestro nivel. A este nodo se le llama "RoomList".

../../../_images/roomlist_node.png

Nota

El "RoomList" NO es un tipo especial de nodo - simplemente puede ser un nodo Spatial regular.

Deberás asignar el nodo RoomList en el RoomManager para que sepa dónde encontrar las salas.

¿Por qué utilizamos una rama específica del árbol de escena en lugar de la raíz de la escena? La respuesta es que hay muchos detalles internos del sistema que son más fáciles de gestionar si las habitaciones se colocan en su propia rama.

A menudo, terminarás reemplazando por completo la rama del RoomList en tiempo de ejecución en tu juego a medida que cargas y descargas niveles.

Salas

¿Qué es una sala?

Las Salas (Room) son una forma de dividir espacialmente tu nivel en áreas que tienen sentido en términos de diseño de niveles. Las salas a menudo son literalmente "salas" (como en un edificio). Sin embargo, desde la perspectiva del motor, una sala representa un volumen convexo no superpuesto en el cual típicamente colocas la mayoría de tus objetos que se encuentran dentro de esa área.

Una habitación no necesita corresponder necesariamente a una habitación literal. Por ejemplo, podría ser un cañón en un área al aire libre o una parte más pequeña de una habitación cóncava. Con un poco de imaginación, puedes utilizar el sistema en casi cualquier escenario.

¿Porqué convexo?

Las salas se definen como volúmenes convexos (o envolventes convexas) porque es trivial determinar matemáticamente si un punto se encuentra dentro de una envolvente convexa. Un simple chequeo de plano te dirá la distancia de un punto desde un plano. Si un punto se encuentra detrás de todos los planos que delimitan la envolvente convexa, entonces, por definición, se encuentra dentro de la sala. Esto facilita muchas cosas en los aspectos internos del sistema, como verificar en qué sala se encuentra una cámara.

Una envolvente convexa. La envolvente se define como una serie de planos orientados hacia afuera. Si un punto está detrás de todos los planos, se encuentra dentro de la envolvente.

../../../_images/convex_hull.png

¿Por qué no superpuestos?

Si dos salas se superponen y una cámara o jugador se encuentra en esta zona de superposición, no hay forma de determinar en qué sala debería estar el objeto (y, por lo tanto, renderizarse desde esa sala) o en qué sala debería ser renderizado. Este requisito de que las salas no se superpongan tiene implicaciones en el diseño de niveles.

Si por accidente creas salas superpuestas, el editor te advertirá cuando conviertas las salas, indicando cualquier zona de superposición en rojo.

../../../_images/room_overlap.png

El sistema intenta lidiar con las salas superpuestas de la mejor manera posible al hacer que la sala actual sea "pegajosa". Cada objeto recuerda en qué sala se encontraba durante el fotograma anterior y permanece en ella siempre que no se mueva fuera de los límites de la envolvente convexa de la sala. Esto puede resultar en cierta histeresis en estas zonas de superposición.

Sin embargo, hay una excepción para las salas internas (habitaciones internas). No es necesario preocuparse por ellas al principio.

¿Como creo una sala?

Una clase Room es un tipo de nodo que se puede agregar al árbol de escena como cualquier otro. Puedes colocar objetos dentro de la sala haciéndolos hijos y nietos del nodo Room.

¿Cómo defino la forma y posición de la envolvente convexa de mi sala?

Debido a que definir los límites de la sala es el aspecto más importante del sistema, existen TRES métodos disponibles para definir la forma de una sala en Godot:

  1. Utilizar la geometría de los objetos contenidos dentro de la sala para crear automáticamente un límite aproximado.

  2. Editar manualmente los puntos que definen la envolvente convexa en el inspector de la sala o arrastrar los puntos utilizando el gizmo del editor (ver Edición de puntos de la sala).

  3. Proporcionar un límite manual. Esto implica utilizar un MeshInstance dentro de la sala que tenga geometría en la forma del límite deseado, y que tenga un nombre con el sufijo -bound. Esto es algo que podrías elegir hacer si creas tus niveles en Blender u otro software similar (ver Crear sistemas de salas en Blender (u otras herramientas de modelado)).

Si bien la primera opción puede ser todo lo que se requiere, especialmente con habitaciones simples o para preproducción, el uso de límites manuales te brinda un control completo a expensas de un pequeño trabajo de edición. También puedes combinar ambos enfoques, utilizando límites automáticos para la mayoría de las salas pero editando manualmente las áreas problemáticas.

El método automático se utiliza siempre que no se proporciona un límite manual.

Un par de salas simples. El margen del portal se muestra en rojo translúcido y las estructuras de las salas se muestran en alambre verde.

../../../_images/simple_room.png

Portales

Si creas algunas sañas, colocas objetos dentro de ellas y luego conviertes el nivel en el editor, verás que los objetos en las salas aparecen y se muestran a medida que te mueves entre las salas. ¡Sin embargo, hay un problema! Aunque puedes ver los objetos dentro de la sala en la que se encuentra la cámara, ¡no puedes ver las habitaciones vecinas! Para eso necesitamos portales.

Los portales (Portal) son polígonos convexos especiales que se posicionan sobre las aberturas entre salas para permitir que el sistema vea entre ellas. Puedes crear un nodo de portal directamente en el editor. El portal predeterminado tiene 4 puntos y se comporta de manera similar a una MeshInstance de un plano. Puedes agregar o eliminar puntos utilizando el inspector. Un portal requiere al menos 3 puntos para funcionar, ya que necesita formar un polígono en lugar de un punto o una línea.

Para ahorrar esfuerzo de edición, solo se requiere un solo portal entre cada par de salas. No es necesario (y de hecho no se debe) crear dos portales que se superpongan en direcciones opuestas. Los portales tienen configuración predeterminada para ser bidireccionales, pero puedes hacerlos unidireccionales en el inspector del portal.

Por lo tanto, debes colocar un portal solo en una de cada par de salas vecinas; esta es la "sala de origen" del portal. En general, no importa cuál elijas como la sala de origen. La normal del portal (la flecha en el gizmo) debe estar orientada hacia el exterior de la sala de origen.

../../../_images/portal_inspector.png

No te confundas con la flecha. Aunque la flecha muestra la dirección hacia la que se enfrenta el portal, la mayoría de los portales serán bidireccionales y se pueden ver desde ambas direcciones. La flecha es más importante para asegurarse de que el portal se enlace con la sala vecina correcta.

Vinculando portal

Hay dos formas de especificar a qué sala debe enlazarse el portal:

  • Dejar en blanco la opción Linked Room en el inspector. El sistema intentará enlazar automáticamente el portal a la sala vecina más cercana durante la conversión. Esto funciona bien en la mayoría de los casos.

  • Especificar explícitamente la sala estableciendo la opción Linked Room en el inspector.

Nota

Los portales se definen como un conjunto de puntos en 2D. Esto asegura que el polígono formado esté en un solo plano. La orientación del portal se determina mediante la transformación. Los puntos también deben formar un polígono convexo. Esto se garantiza mediante la validación de los puntos que especificas, ignorando aquellos que no forman una forma convexa. Esto facilita la edición al tiempo que hace que sea difícil romper el sistema.

Probando esto

En este punto, deberías ser capaz de crear un par de salas, agregar algunos nodos como instancias de malla dentro de las salas y agregar un portal entre las salas. Intenta convertir las salas en el editor y verifica si puedes ver ahora los objetos en las salas vecinas a través del portal.

../../../_images/simple_scenetree.png

Ahora has dominado los principios básicos del sistema.

El siguiente paso es examinar los diferentes tipos de objetos que pueden ser gestionados por el sistema.