Matt Bird écrit toutes sortes de bêtises, mais il aime écrire des tutoriels pour Unity.
Les GameObjects parent et enfant sont des concepts essentiels à comprendre lors de la programmation d’un jeu dans Unity. Pratiquement tous les jeux s’appuieront sur des changements constants dans les interactions parent-enfant, donc apprendre ce que font ces interactions – et comment les former en premier lieu – est une leçon importante pour un nouveau programmeur. Cet article explorera la nature des GameObjects enfants dans Unity et comment les créer.
Qu’est-ce qu’un enfant dans l’unité ?
Unity est un programme construit sur des hiérarchies organisées, et les enfants sont des GameObjects au sein de la hiérarchie. Les enfants sont contenus dans les parents et sont soumis au positionnement, à la rotation et à l’échelle du parent, entre autres choses. Une fois qu’un enfant est créé, ce GameObject est en grande partie régi par son parent.
Prenez l’image ci-dessous comme exemple. Il y a deux GameObjects cylindriques. Dans la hiérarchie de gauche, l’enfant est répertorié sous le parent. Le plus grand cylindre est le parent, tandis que le plus petit est l’enfant.
Toute modification apportée au parent sera automatiquement transmise à l’enfant. Donc, si nous jouons avec certains paramètres. . . par exemple, la rotation, l’échelle et la position . . .
. . . ces changements se refléteront également chez l’enfant. Lorsque le parent a été redimensionné et repositionné, l’enfant a emboîté le pas – bien qu’il ait conservé le même positionnement par rapport au parent. L’enfant est essentiellement un esclave du parent, et les forces extérieures qui affectent le parent affecteront également l’enfant.
Les GameObjects parents peuvent avoir autant d’enfants que vous le souhaitez. Il est possible que chaque GameObject de votre jeu soit un enfant d’un GameObject parent unique, les parents se ramifiant à partir de là. Les enfants peuvent également être parents de leur propre chef, descendant autant de branches de la hiérarchie que vous le souhaitez – mais gardez à l’esprit que chaque GameObject enfant est sujet aux changements de ses parents. Si un parent est détruit ou supprimé, tous les enfants en dessous le sont également.
Les GameObjects parents, en revanche, ne sont pas sujets aux modifications de leurs enfants, et vous pouvez manipuler des objets enfants sans déplacer, remodeler, redimensionner ou détruire leur parent.
Comment les parents et les enfants sont-ils utilisés dans l’unité ?
Il existe de nombreuses utilisations de la dynamique enfant et parent dans Unity. Voici quelques-uns des plus courants :
- À des fins d’organisation simples. Si votre jeu a une interface utilisateur, par exemple, vous empilerez probablement tous les éléments de cette interface utilisateur afin qu’ils soient faciles à trouver. Cela permet également de désencombrer la hiérarchie de Unity, car vous pouvez réduire les listes d’objets enfants.
- Pour des changements faciles et à grande échelle. En prenant l’interface utilisateur du dernier exemple, supposons que vous décidiez d’agrandir un peu l’ensemble. Ou plus étroit. Ou peut-être voulez-vous le déplacer un peu. Ou peut-être le désactiver complètement dans certaines circonstances. En enfantant tous les éléments de l’interface utilisateur à un seul parent, vous pouvez effectuer ces changements facilement en manipulant le parent plutôt qu’en laiton avec les enfants individuels.
- Pour garder les objets liés ensemble. Disons que vous avez un personnage GameObject avec un équipement modifiable. L’équipement doit accompagner le personnage lorsqu’il se déplace, et faire de chaque GameObject un enfant du GameObject du personnage les gardera par rapport au personnage lorsqu’ils se déplacent sur l’écran. Vous devrez également enfanter GameObjects au parent à des fins d’animation.
- Pour générer de nouveaux objets à partir d’emplacements spécifiques. Supposons que votre personnage ait un pistolet qui tire des balles. Ces balles doivent provenir du pistolet ou peut-être d’un GameObject invisible au bout du canon. En attribuant le point d’apparition à votre personnage parent, les balles voleront à partir de leur point prévu, plutôt qu’à un endroit aléatoire sur l’écran. (Bien que gardez à l’esprit que lesdites balles doivent ne pas devenez les enfants du pistolet, car ils se déplaceront partout où votre personnage se déplacera.)
À moins que vous n’ayez affaire à un jeu très simple, vous devrez probablement enfanter GameObjects à un parent de manière régulière. Alors, comment est-ce fait? Il existe plusieurs façons.
1. Glisser-déposer
La méthode la plus simple pour créer un enfant consiste à utiliser la hiérarchie de Unity sur le côté gauche de l’écran. Cliquez sur un GameObject et faites-le glisser vers un autre GameObject. Cela créera une hiérarchie à plusieurs niveaux, transformant l’objet déplacé en un enfant. Part de gâteau. Vous pouvez continuer à ajouter des enfants au parent d’origine, ou aux autres enfants, autant que vous le souhaitez. Faire glisser l’enfant vers un espace vide de la hiérarchie supprimera son statut d’enfant.
Cette méthode n’est bien sûr d’aucune utilité pendant l’exécution, ce qui signifie que la poursuite de l’enfant nécessitera un peu de plongée dans C#.
Faites défiler pour continuer
2. Instancier en tant qu’enfant
La deuxième méthode pour enfanter un GameObject nécessite une méthode Unity commune appelée Instanciation. Lorsque vous instanciez un GameObject, vous en créez une instance dans le jeu et, dans ce cas, vous placez l’instance en tant qu’enfant d’un objet parent existant.
Cette fois, vous voulez utiliser la méthode Instantiate() et définir le Transform du parent comme parent, comme ceci :
Ici, nous avons deux GameObjects – l’exempleParent (un bloc rose), déjà actif dans le jeu, et l’exempleChild (un personnage trapu), trouvé dans les fichiers du projet – attachés à un GameObject invisible. Lorsque le joueur appuie sur la touche J, le jeu instancie une copie de exampleChild GameObject aux mêmes coordonnées que la transformation de exampleParent. Donc ça . . .
. . . devient ceci.
Chaque fois que vous appuyez sur la touche J dans cet exemple, une autre instance de exampleChild sera ajoutée à exampleParent, en tant qu’enfant, au centre exact de la transformation de exampleParent. Si le centre exact n’est pas souhaitable, vous pouvez également ajouter un vecteur pour modifier les coordonnées initiales de l’enfant, comme ceci :
Le ‘+2’ déplace ainsi la nouvelle instance de exampleChild vers la droite de exampleParent. Vous pouvez ajouter des calculs similaires aux autres nombres du vecteur pour des résultats différents. (Bien que vous ne deviez absolument pas utiliser de nombres bruts pour ce type de calculs. Les variables que vous pouvez modifier dans l’inspecteur sont la solution.)
3. Définir comme enfant
Cette dernière méthode suppose que vous souhaitez transformer un objet existant en enfant d’un autre objet. C’est sympa et simple.
Tout ce que vous avez à faire est de vous assurer que l’enfant potentiel passe en premier dans cette méthode et le parent en second. Si cela est fait correctement, le premier GameObject sera décalé sous le second dans la hiérarchie. (Vous pouvez également utiliser une méthode similaire pour supprimer un enfant d’un GameObject, bien que ce soit un processus plus compliqué pour un autre article.) ne pas modifier la transformation de l’enfant, bien que toute modification ultérieure du parent affecte l’enfant.
Il convient de noter que la relation parent-enfant dans ce cas ne dure que pendant l’exécution. Le parent n’aura plus d’enfant une fois que vous aurez arrêté le jeu et que vous retournerez voir l’inspecteur.
Remarque importante concernant les enfants
Normalement, dans Unity, la transformation d’un GameObject reflète sa position mondiale. Si vous modifiez la position x de l’objet de 0 à 1, il se déplacera donc un peu vers la droite. C’est assez prévisible et c’est généralement ce que vous voulez lorsque vous déplacez GameObjects dans l’inspecteur.
Cependant, lorsque vous transformez un GameObject en enfant, ses statistiques dans l’inspecteur changent, reflétant sa position locale. La position locale utilise le parent de l’objet pour déterminer les nombres plutôt que celui du monde dans son ensemble. Ainsi, si, par exemple, le parent était à une coordonnée x de 2 et que son enfant était également à une coordonnée x de 2, ils ne seraient pas dans la même position.
Au lieu de cela, l’enfant serait à la droite du parent, à deux unités de distance. Cela semble assez simple, mais vous seriez surpris de voir à quel point il est facile de s’embrouiller lorsqu’il s’agit de la position des enfants par rapport à leurs parents et au reste du monde du jeu. La rotation est particulièrement déroutante à cet égard.
Des problèmes avec les coordonnées de vos enfants ? L’un des moyens les plus simples de résoudre les problèmes consiste à supprimer l’enfant de son parent dans l’inspecteur. Cela changera ses valeurs de transformation en sa position mondiale et vous donnera une meilleure idée de l’endroit où se trouve l’enfant dans l’espace. Jouez avec les valeurs en dehors du parent, puis restaurez l’appariement lorsque vous êtes satisfait des résultats.
Ce contenu est exact et fidèle au meilleur de la connaissance de l’auteur et ne vise pas à remplacer les conseils formels et individualisés d’un professionnel qualifié.