Création d'instances

Dans la partie précédente, nous avons vu qu'une scène est une collection de nœuds organisés en une structure arborescente, avec un seul nœud comme racine. Vous pouvez diviser votre projet en un nombre quelconque de scènes. Cette fonctionnalité vous aide à décomposer et à organiser les différents composants de votre jeu.

Vous pouvez créer autant de scènes que vous le souhaitez et les enregistrer sur le disque avec l'extension .tscn, qui signifie "text scene". Le fichier Label.tscn de la leçon précédente en était un exemple. Nous appelons ces fichiers "Packed Scenes", car ils contiennent des informations sur le contenu de votre scène.

Voici l'exemple d'une balle. Il est composé d'un nœud RigidBody2D à la racine nommé Ball, qui permet à la balle de tomber et de rebondir sur les murs, d'un nœud Sprite, et d'un nœud CollisionShape2D.

../../_images/instancing_ball_scene.png

Une fois que vous avez enregistré une scène, celle-ci fonctionne comme un modèle : vous pouvez la reproduire dans d’autres scènes autant de fois que vous le souhaitez. Reproduire un objet à partir d'un modèle de cette manière s'appelle instancier.

../../_images/instancing_ball_instances_example.png

Comme nous l'avons mentionné dans la partie précédente, les scènes instanciées se comportent comme un nœud : l'éditeur cache leur contenu par défaut. Lorsque vous instanciez la balle, vous ne voyez que le nœud Ball. Remarquez également que chaque duplicata a un nom unique.

Chaque instance de la scène Ball commence avec la même structure et les mêmes propriétés que Ball.tscn. Cependant, vous pouvez modifier chacune d'entre elles indépendamment, par exemple en changeant la façon dont elles rebondissent, leur poids ou toute propriété exposée par la scène source.

En pratique

Utilisons l'instanciation dans la pratique pour voir comment cela fonctionne précisément dans Godot. Nous vous invitons à télécharger le projet d'exemple balle que nous avons préparé pour vous : instancing.zip.

Extrayez l'archive sur votre ordinateur. Ensuite, ouvrez Godot, et dans le gestionnaire de projet, cliquez sur le bouton Importer pour importer le projet.

../../_images/instancing_import_button.png

Dans la fenêtre qui s'affiche, cliquez sur le bouton Parcourir et naviguez jusqu'au dossier que vous avez extrait.

../../_images/instancing_import_browse.png

Double-cliquez sur le fichier project.godot pour l'ouvrir.

../../_images/instancing_import_project_file.png

Enfin, cliquez sur le bouton Importer et Modifier.

../../_images/instancing_import_and_edit_button.png

Le projet contient deux scènes emballées(packed scenes) : Main.tscn, contenant des murs contre lesquels la balle se heurte, et Ball.tscn. La scène Main devrait s'ouvrir automatiquement.

../../_images/instancing_main_scene.png

Ajoutons une balle comme enfant du nœud Main. Dans le dock de la scène, sélectionnez le nœud Main. Puis, cliquez sur l'icône lien en haut du dock scène. Ce bouton vous permet d'ajouter une instance d'une scène en tant qu'enfant du nœud actuellement sélectionné.

../../_images/instancing_scene_link_button.png

Double-cliquez sur la scène de la balle pour l'instancier.

../../_images/instancing_instance_child_window.png

La balle apparaît dans le coin supérieur gauche du viewport.

../../_images/instancing_ball_instanced.png

Cliquez dessus et faites-le glisser vers le centre de la vue.

../../_images/instancing_ball_moved.png

Jouez le jeu en appuyant sur F5. Vous devriez la voir tomber.

Maintenant, nous voulons créer d'autres instances du nœud Ball. Avec la balle toujours sélectionnée, appuyez sur Ctrl-D (Cmd-D sur macOS) pour appeler la commande de duplication. Cliquez et faites glisser pour déplacer la nouvelle balle à un autre endroit.

../../_images/instancing_ball_duplicated.png

Vous pouvez répéter ce processus jusqu'à ce que vous en ayez plusieurs dans la scène.

../../_images/instancing_main_scene_with_balls.png

Rejouez le jeu. Vous devriez maintenant voir toutes les balles tomber indépendamment les unes des autres. C'est ce que font les instances. Chacune est une reproduction indépendante d'une scène modèle.

Modification de scènes et d’instances

Les instances ne s'arrêtent pas là. Avec cette fonctionnalité, vous pouvez :

  1. Modifiez les propriétés d'une balle sans affecter les autres en utilisant l'inspecteur.

  2. Modifiez les propriétés par défaut de chaque boule en ouvrant la scène Ball.tscn et en y apportant une modification au nœud Ball. Lors de l'enregistrement, toutes les instances de Ball dans le projet verront leurs valeurs mises à jour.

Note

La modification d'une propriété sur une instance a toujours priorité sur les valeurs de la scène emballée correspondante.

Essayons ceci. Ouvrez Ball.tscn et sélectionnez le nœud Ball. Dans l'inspecteur à droite, cliquez sur la propriété PhysicsMaterial pour la développer.

../../_images/instancing_physics_material_expand.png

Définissez sa propriété Bounce à 2 en cliquant sur le champ numérique, en tapant 2 et en appuyant sur Enter.

../../_images/instancing_property_bounce_updated.png

Jouez le jeu en appuyant sur F5 et remarquez que toutes les balles rebondissent maintenant beaucoup plus. Comme la scène Ball est un modèle pour toutes les instances, la modifier et la sauvegarder entraîne la mise à jour de toutes les instances en conséquence.

Ajustons maintenant une instance individuelle. Revenez à la scène Main en cliquant sur l'onglet correspondant au-dessus de la fenêtre d'affichage.

../../_images/instancing_scene_tabs.png

Sélectionnez l'un des nœuds Ball instanciés et, dans l'inspecteur, définissez sa valeur Gravity Scale sur 10.

../../_images/instancing_property_gravity_scale.png

Un bouton gris "rétablir" apparaît à côté de la propriété ajustée.

../../_images/instancing_property_revert_icon.png

Cette icône indique que vous remplacez une valeur de la scène source emballée(packed scene). Même si vous modifiez la propriété dans la scène originale, la valeur remplacée sera préservée dans l'instance. En cliquant sur l'icône de retour en arrière, vous restaurerez la valeur de la propriété dans la scène sauvegardée.

Relancez le jeu et remarquez que cette balle tombe maintenant beaucoup plus vite que les autres.

Note

Si vous modifiez une valeur sur le PhysicsMaterial d'une instance, cela affectera toutes les autres. Ceci est dû au fait que PhysicsMaterial est une ressource, et que les ressources sont partagées entre les instances. Pour rendre une ressource unique pour une instance, faites un clic droit dessus dans l'inspecteur et cliquez sur Rendre unique dans le menu contextuel.

Les ressources sont un autre élément essentiel des jeux Godot que nous aborderons dans une prochaine leçon.

Les instances de scène en tant que langage de conception

Les instances et les scènes de Godot constituent un excellent langage de conception, qui distingue le moteur des autres. Nous avons conçu Godot autour de ce concept dès le départ.

Nous vous recommandons d'écarter les modèles de code architecturaux lorsque vous créez des jeux avec Godot, comme les diagrammes Modèle-Vue-Contrôleur (MVC) ou Entité-Relation. Au lieu de cela, vous pouvez commencer par imaginer les éléments que les joueurs verront dans votre jeu et structurer votre code autour d'eux.

Par exemple, vous pouvez décomposer un jeu de tir comme ceci :

../../_images/instancing_diagram_shooter.png

Vous pouvez créer un diagramme comme celui-ci pour presque tout type de jeu. Chaque rectangle représente une entité qui est visible dans le jeu du point de vue du joueur. Les flèches vous indiquent quelle scène possède quelle entité.

Une fois que vous avez un diagramme, nous vous recommandons de créer une scène pour chaque élément qui y est répertorié pour développer votre jeu. Vous utiliserez l'instanciation, soit par code, soit directement dans l'éditeur, pour construire votre arbre de scènes.

Les programmeurs ont tendance à passer beaucoup de temps à concevoir des architectures abstraites et à essayer d'y intégrer des composants. La conception basée sur les scènes rend le développement plus rapide et plus simple, ce qui vous permet de vous concentrer sur la logique de jeu elle-même. La plupart des composants du jeu étant directement liés à une scène, l'utilisation d'une conception basée sur l'instanciation de scènes signifie que vous n'avez besoin que de peu de code architectural supplémentaire.

Voici l'exemple d'un diagramme de scène pour un jeu en monde ouvert avec des tonnes de assets et d'éléments imbriqués :

../../_images/instancing_diagram_open_world.png

Imaginons que nous commencions par créer la pièce. Nous pourrions créer plusieurs scènes de pièces différentes, avec des arrangements uniques de meubles. Plus tard, nous pourrions créer une scène de maison qui utilise plusieurs instances de pièces pour l'intérieur. Nous pourrions créer une citadelle à partir de plusieurs maisons instanciées et d'un grand terrain sur lequel nous placerions la citadelle. Chacune d'entre elles serait une scène qui instaure une ou plusieurs sous-scènes.

Plus tard, nous pourrions créer des scènes représentant des gardes et les ajouter à la citadelle. Ils seraient indirectement ajoutés à l'univers global du jeu.

Avec Godot, il est facile d’itérer sur votre jeu de cette façon, car tout ce que vous avez à faire est de créer et d’instaurer plus de scènes. Nous avons conçu l'éditeur pour qu'il soit accessible aux programmeurs, aux concepteurs et aux artistes. Un processus typique de développement en équipe peut impliquer des artistes 2D ou 3D, des concepteurs de niveaux, des concepteurs de jeux et des animateurs, qui travaillent tous avec l'éditeur Godot.

Résumé

L'instanciation, le processus de production d'un objet à partir d'un plan, a de nombreux usages pratiques. Avec les scènes, il vous donne :

  • La possibilité de diviser votre jeu en composants réutilisables.

  • Un outil pour structurer et encapsuler les systèmes complexes.

  • Un langage pour réfléchir à la structure de votre projet de jeu de manière naturelle.