🗄️ Globals et Singletons

Lien vers la documentation

Le système des nœuds et des scènes de Godot est très pratique pour structurer facilement et de manière modulaire un jeu. Néanmoins, il peut rendre plus compliqué le partage d’informations entre les différentes scènes et systèmes de notre jeu.

Pour cela, Godot met Ă  notre disposition le patron de conception Singleton sous la forme des Autoloads.

📝 Note

Le singleton est un patron de conception (design pattern) dont l’objectif est d’avoir une instance d’objet accessible globalement, de n’importe où.

🔥 Exemple

On pourrait l’utiliser pour un système d’inventaire :

## Appelée quand le joueur essaie de prendre un item
func _on_item_pickup(item: Item):
    if not Inventory.can_store(item.info):
        return
    Inventory.store(item.info)
    body_animation_player.play("pick_up")
    item.queue_free()

Les Autoloads

Un Autoload est un script (ou une scène) chargé automatiquement au lancement du jeu. Au lancement, Godot va créer un nœud à la racine, et lui attacher le script désigné.

Il sera ensuite possible de référencer ce nœud globalement, depuis n’importe quel script, comme montré dans l’exemple ci-dessus.

L’ajout d’un nouvel Autoload se fait via les paramètres du projet.

Autoload “Inventory” ajouté au projet
📝 Note

Il est également possible d’utiliser une scène complète comme Autoload. Elle va être instanciée automatiquement par le moteur et persister tout au long du jeu.

Cela peut ĂŞtre notamment pratique pour mettre en place des effets de transition.

⚠️ Attention

Bien que très utiles, les singletons / Autoloads sont à utiliser avec parcimonie.

Une surutilisation des singletons rend plus compliqué le suivi du flux des données de la logique, vu qu’il s’agit d’un état global.

Les Singletons du moteur

On a parlé des Autoloads, qui sont créés par l’utilisateur du moteur, mais Godot lui-même expose un certain nombre de systèmes à l’aide du patron Singleton, les rendant accessibles globalement.

On notera par exemple :

🔥 Exemple
if Input.is_action_pressed("slow_motion"):
    Engine.time_scale = 0.5
else:
    Engine.time_scale = 1.0
📝 Note

Les singletons du moteur ne sont pas des Autoloads, vous ne retrouverez par exemple pas de noeud “Input” à la racine du jeu. Ce sont des systèmes plus bas niveau.