Utilizando objetos en Habitaciones y Portales

Normalmente, cuando usas Godot, todos los objetos que puedes ver (VisualInstance) se tratan de la misma manera por el motor. El renderizador de portal es ligeramente diferente, ya que hace una distinción entre los diferentes roles que los objetos tendrán en tu juego. Hace esta distinción para definir las Room y para renderizar y procesar todo de la manera más eficiente.

Modo portal

Si observas en el inspector, cada VisualInstance en Godot se deriva de un CullInstance, donde puedes establecer un PortalMode. Esto determina cómo se comportarán los objetos en el sistema de portal.

../../../_images/cull_instance.png

ESTÁTICO

El modo predeterminado para los objetos es ESTÁTICO. Los objetos estáticos son aquellos dentro de las habitaciones que no se moverán durante todo el ciclo de vida del nivel. Cosas como pisos, paredes y techos son buenos candidatos para objetos ESTÁTICO.

DINÁMICO

El modo dinámico es para objetos que se espera que se muevan durante el juego. Sin embargo, hay una limitación: no deben moverse fuera de su habitación original. Estos objetos son manejados de manera muy eficiente por el sistema. Ejemplos de ello podrían ser plataformas móviles y ascensores.

ROAMING (Itinerante)

El modo "Roaming (itinerante)" es para objetos que pueden moverse entre salas. Cosas como jugadores y enemigos deben ser marcados como "roaming". Estos cálculos son más costosos que los modos ESTÁTICO o DINÁMICO, porque el sistema debe hacer un seguimiento de en qué sala se encuentra un objeto roaming.

GLOBAL

El modo "Global" es para objetos que no deseas que sean ocultados por culling en absoluto. Cosas como el arma del jugador principal, las balas y algunos efectos de partículas son buenos candidatos para el modo GLOBAL.

IGNORE

El modo "Ignore" es especial para objetos que serán prácticamente libres en el sistema. Los límites manuales (-bound) se convierten automáticamente al modo de portal "ignore". Estos objetos no necesitan aparecer durante el juego, pero se mantienen en el árbol de escenas en caso de que necesites convertir el nivel múltiples veces (por ejemplo, en el Editor). También puedes optar por usar este modo para objetos que solo deseas que aparezcan en el editor (cuando RoomManager está inactivo).

¿Debes colocar objetos dentro de las habitaciones (en el árbol de escenas) o no?

Los objetos STATIC y DYNAMIC se deben colocar idealmente dentro de las habitaciones en el árbol de escenas. El sistema necesita saber en qué sala se encuentran durante la conversión, ya que asume que nunca cambiarán de salas. Colocarlos dentro de las salas en el árbol de escenas te permite decirle explícitamente al sistema dónde quieres que estén.

Auto-posicionamiento

Sin embargo, por facilidad de uso, también es posible colocar objetos STATIC y DYNAMIC fuera de las salas en el árbol de escenas, pero dentro de la rama RoomList. El sistema intentará colocar automáticamente los objetos en la sala adecuada. Esto funciona en la mayoría de los casos, pero si tienes dudas, es mejor utilizar el enfoque explícito. El enfoque explícito es especialmente necesario al trabajar con salas internas, que tienen algunas restricciones para objetos extensos.

../../../_images/freeform.png

Cabe destacar que si colocas objetos STATIC y DYNAMIC fuera de las salas, no contribuirán a los límites de la sala. Si estás utilizando la geometría de la sala para derivar el límite, las mesas y sillas pueden colocarse fuera de la sala. Sin embargo, las paredes y los pisos deben estar explícitamente dentro de la rama de la Sala en el árbol de escenas para garantizar que el límite sea correcto.

Se recomienda mantener los objetos ROAMING y GLOBAL en una rama separada del árbol de escenas, fuera de cualquier habitación o de la lista de salas. Estos objetos pueden colocarse dentro de las salas, pero para evitar confusiones, generalmente es mejor mantenerlos en su propia rama. No hay restricciones en la ubicación de los objetos "IGNORE".

Tiempo de vida de los Objetos

Es importante tener en cuenta que la vida útil de los objetos STATIC y DYNAMIC está vinculada a la vida útil del nivel, desde el momento en que llamas a rooms_convert() para activar el sistema de portal, hasta que llamas a rooms_clear() para descargar el sistema. Esto se debe a que durante la fase de conversión se realiza un preprocesamiento considerable para renderizarlos de manera eficiente.

Por lo tanto, no debes intentar crear o eliminar objetos STATIC o DYNAMIC mientras el sistema de portal esté activo. Hacerlo provocará que el sistema se descargue automáticamente debido a que se encuentra en un estado no válido. Sin embargo, puedes usar libremente los métodos show() y hide() para mostrar u ocultar estos objetos.

La secuencia debería ser, por lo tanto:

  • Cargue su nivel.

  • Ubique cualquier objeto ESTÁTICO o DINÁMICO.

  • Luego ejecuta rooms_convert() después de que todos los objetos STATIC y DYNAMIC hayan sido agregados al árbol de escenas.

Los objetos que son ROAMING, GLOBAL o IGNORE pueden crearse y eliminarse libremente según sea necesario.

Expansión

Aunque los usuarios generalmente pueden ignorar los detalles internos del sistema de portal, deben tener en cuenta que es capaz de manejar objetos tan grandes que terminan en más de una sala. Cada objeto tiene una sala central, pero utilizando AABB (Axis-Aligned Bounding Box) o geometría, el sistema puede detectar cuando un objeto se extiende a través de un portal hacia una habitación vecina (o varias habitaciones). Esto se conoce como sprawling o expansión.

Esto significa que si la esquina de un objeto se extiende hacia una sala vecina, pero la sala principal del objeto no se muestra (por ejemplo, un tren donde el extremo está en una sala diferente), el objeto no será ocultado y seguirá siendo visible. El objeto solo será ocultado si no está presente en ninguna de las salas que son visibles.

Márgenes de Portal

Es difícil colocar objetos exactamente en los bordes de las salas, y si eligiéramos expandir los objetos a la sala adyacente en el momento en que se cruzara un portal (incluso en una cantidad muy pequeña), habría una cantidad innecesaria de expansión y los objetos se renderizarían cuando no fuera realmente necesario. Para contrarrestar esto, los portales tienen un margen ajustable sobre el cual un objeto puede cruzar sin ser considerado en la siguiente sala. El margen se muestra en el editor como un área translúcida de color rojo.

Puedes establecer el margen globalmente en el RoomManager. También puedes anular este valor de margen en cualquier portal si necesitas ajustar los detalles. A medida que edites los valores de margen en el inspector, deberías ver cómo se actualizan los márgenes en la vista del editor 3D.

Incluir en Límite

El soporte para objetos que son más grandes que una sola sala tiene un efecto secundario. Es posible que no desees incluir algunos objetos en el cálculo del límite automático de la sala. Puedes activar o desactivar esto en el inspector para cada objeto. Observa Cull Instance > Include In Bound.

Si bien la expansión funciona muy bien para objetos grandes en movimiento, también te brinda mucha más flexibilidad en el diseño de niveles. Por ejemplo, puedes crear una sección de terreno amplia y tenerla presente en múltiples habitaciones, sin tener que dividir la malla.

Iluminación

En general, las luces se manejan como cualquier otra instancia visual. Pueden colocarse en salas y se expandirán para afectar a las salas vecinas, siguiendo las dimensiones y la dirección de la luz. La excepción a esto son las luces direccionales (DirectionalLight). Las luces direccionales no tienen una sala de origen, ya que afectan a todas partes. Por lo tanto, no deben colocarse en una sala. Como las luces direccionales pueden ser costosas en términos de rendimiento, es una buena idea apagarlas cuando estés dentro de una sala. Consulta la sección posterior RoomGroups (grupos de salas) para obtener más detalles sobre cómo hacerlo.

¡Felicitaciones! Ahora has dominado las técnicas intermedias necesarias para utilizar habitaciones y portales. Ya puedes utilizarlos para crear juegos, pero hay muchas más características disponibles.