Utilisation d'objets dans les Rooms et Portals

Normalement, lorsque vous utilisez Godot, tous les objets que vous pouvez voir (VisualInstance) sont traités de la même manière par le moteur. Le rendu de portail est légèrement différent, dans la mesure où il fait une distinction entre les différents rôles que les objets auront dans votre jeu. Il fait cette distinction pour définir les :ref:`Room<class_Room>`et pour rendre et traiter le tout de la manière la plus efficace possible.

Mode Portal

Si vous regardez dans l'inspecteur, chaque VisualInstance dans Godot est dérivée d'un CullInstance, où vous pouvez définir un PortalMode. Cela détermine comment les objets se comporteront dans le système de portail.

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

STATIC

Le mode par défaut des objets est STATIC. Les objets statiques sont des objets dans les pièces qui ne bougeront pas tout au long du cycle de vie du niveau. Des choses comme les sols, les murs, les plafonds sont de bons candidats pour les objets STATIC.

DYNAMIC

Le mode dynamique est destiné aux objets qui sont censés se déplacer au cours du jeu. Mais il y a une limitation - ils ne doivent pas se déplacer en dehors de leur pièce d'origine. Ces objets sont gérés très efficacement par le système. On peut citer comme exemple les plateformes mobiles et les ascenseurs.

ROAMING

Le mode itinérant est destiné aux objets qui peuvent se déplacer entre les pièces. Les choses comme les joueurs et les ennemis doivent être marquées comme itinérantes. Ces modes sont plus coûteux à calculer que les modes STATIC ou DYNAMIC, car le système doit garder la trace de la pièce dans laquelle se trouve un objet itinérant.

GLOBAL

Le mode global est destiné aux objets pour lesquels vous ne voulez pas du tout que l'occlusion soit réduite. Des choses comme l'arme du joueur principal, les balles et certains effets de particules sont de bons candidats pour le mode GLOBAL.

IGNORE

Ignore est un mode spécial pour les objets qui seront essentiellement libres dans le système. Les limites manuelles (-bound) sont converties en mode ignore de portail automatiquement. Ils n’ont pas besoin d’apparaître pendant le jeu, mais sont conservés dans l’arbre de la scène au cas où vous auriez besoin de convertir le niveau plusieurs fois (par exemple dans l’éditeur). Vous pouvez également choisir d'utiliser cette option pour les objets que vous souhaitez uniquement voir apparaître dans l'éditeur (lorsque le RoomManager est inactif).

Faut-il placer les objets dans les pièces (dans l'arbre de scène) ou non ?

Les objets STATIC et DYNAMIC sont idéalement placés dans des pièces dans l'arbre de scène. Le système doit savoir dans quelle pièce ils se trouvent pendant la conversion car il suppose qu'ils ne changeront jamais de pièce. En les plaçant dans des pièces de l'arbre de scène, vous pouvez indiquer explicitement au système où vous voulez qu'ils se trouvent.

Autoplace

Cependant, pour faciliter l'utilisation, il est également possible de placer les objets STATIC et DYNAMIC en dehors des pièces de l'arbre de scène, mais dans la branche RoomList. Le système tentera de placer automatiquement les objets dans la pièce appropriée. Cela fonctionne dans la plupart des cas, mais en cas de doute, utilisez l'approche explicite. L'approche explicite est particulièrement nécessaire lorsqu'il s'agit de salles internes, qui présentent certaines restrictions pour les objets s'étalant(sprawling).

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

Notez que si vous placez des objets STATIC et DYNAMIC en dehors des pièces, ils ne contribueront pas à la limite de pièce. Si vous utilisez la géométrie de la pièce pour dériver la limite, les tables et les chaises peuvent être placées à l'extérieur de la pièce. Cependant, les murs et les sols doivent être explicitement placés dans la branche de la Room de l'arbre de la scène pour que la limite soit correcte.

Les objets ROAMING et GLOBAL sont recommandés d'être conservés dans une branche de l'arbre de scène en dehors de toute pièce ou de la RoomList. Ils peuvent être placés à l'intérieur des pièces, mais pour éviter toute confusion, il est normalement préférable de les garder sur leur propre branche. Il n'y a aucune restriction sur le placement des objets IGNORE.

Durées de vie des objets

Il est important de noter que la durée de vie des objets STATIC et DYNAMIC est liée à la durée de vie du niveau, entre le moment où vous appelez rooms_convert() pour activer le système de portail, et l'appel rooms_clear() pour décharger le système. Cela s'explique par le fait qu'un certain nombre de pré-traitements sont effectués pendant la phase de conversion afin d'assurer un rendu efficace.

Vous ne devez donc pas essayer de créer ou de supprimer des objets STATIC ou DYNAMIC pendant que le système de portail est actif. En faisant cela, le système se déchargera automatiquement car il est dans un état invalide. Vous pouvez toutefois librement show() et hide() ces objets.

La séquence devrait donc être la suivante :

  • Chargez votre niveau.

  • Placez n'importe quel objet STATIC ou DYNAMIC.

  • Exécutez ensuite rooms_convert() après que tous les objets STATIC et DYNAMIC ont été ajoutés à l'arborescence des scènes.

Les objets qui sont ROAMING, GLOBAL ou IGNORE peuvent être librement créés et supprimés selon les besoins.

Sprawling

Bien que les utilisateurs puissent généralement ignorer les mécanismes internes du système de portail, ils doivent savoir qu'il est capable de gérer des objets si grands qu'ils se retrouvent dans plus d'une pièce. Chaque objet a une pièce centrale, mais en utilisant l'AABB ou la géométrie, le système peut détecter quand un objet s'étend à travers un portail dans une pièce voisine (ou plusieurs pièces). On parle alors de sprawling.

Cela signifie que si le coin d’un objet s’étend dans une pièce voisine, mais que la pièce principale de l’objet n’est pas visible (par exemple, un train dont l’extrémité se trouve dans une autre pièce), l’objet ne sera pas éliminé et sera toujours affiché. L'objet ne sera éliminé que s'il n'est présent dans aucune des pièces visibles.

Marges de portail

Il est difficile de placer des objets exactement aux bords des pièces, et si nous choisissions d'étaler les objets dans la pièce adjacente dès qu'un portail est franchi (même de très peu), il y aurait une quantité inutile d'étalement (sprawling), et les objets finiraient par être rendus alors qu'ils ne sont pas vraiment nécessaires. Pour contrer cela, les portails ont une margin réglable qu'un objet peut traverser sans être considéré dans la pièce suivante. La marge est représentée dans le gizmo de l'éditeur par une zone translucide rouge.

Vous pouvez définir la marge de manière globale dans le RoomManager. Vous pouvez également remplacer cette valeur de marge dans n'importe quel portail si vous avez besoin d'affiner les choses. Lorsque vous modifiez les valeurs de marge dans l'inspecteur, vous devriez voir les marges s'actualiser dans la fenêtre de l'éditeur 3D.

Inclure dans Bound

La prise en charge d'objets dont la taille est supérieure à celle d'une pièce unique a un effet secondaire. Il se peut que vous ne souhaitiez pas inclure certains objets dans le calcul de la limite automatique de la pièce. Vous pouvez activer et désactiver cette fonction dans l'inspecteur pour chaque objet. Voir Cull Instance > Include In Bound.

Si le sprawling fonctionne très bien pour les grands objets mobiles, il vous donne également une plus grande marge de manœuvre dans la conception des niveaux. Vous pouvez par exemple créer une grande section de terrain et la faire apparaître dans plusieurs pièces, sans avoir à diviser le maillage.

Éclairage

En général, les lumières sont traitées comme toute autre instance visuelle. Elles peuvent être placées dans des pièces, et elles s'étendront pour affecter les pièces voisines, en suivant les dimensions et la direction de la lumière. L'exception à cette règle est DirectionalLight<class_DirectionalLight>`. Les DirectionalLights n'ont pas de pièce source puisqu'elles affectent tout. Elles ne doivent donc pas être placées dans une pièce. Comme les DirectionalLights peuvent être coûteux, c'est une bonne idée de les éteindre quand on est à l'intérieur, voir la section suivante Groupes de salles pour savoir comment faire.

Félicitations ! Vous avez maintenant maîtrisé les techniques intermédiaires requises pour utiliser les salles et les portails. Vous pouvez déjà les utiliser pour créer des jeux, mais il existe de nombreuses autres fonctionnalités.