AnimationTree ¶
Problématique¶
Une situation courante : vous avez un grand nombre d'animations, et il devient difficile de gérer les transitions entre elles. Votre code est devenu plein d'instructions if, et chaque fois que vous changez quelque chose, tout se casse.
Solution¶
Utilisez un AnimationTree pour créer une machine à états d'animation. Cela nous permettra d'organiser nos animations et, surtout, de contrôler les transitions entre elles.
Préparation¶
Attention! Ce document a été partiellement mis à jour. La partie
Créer l'animationa été développé à l'aide de Godot 3 et n'a pas été mis à jour. Cependant, il y a très peu de changement pour Godot 4.La partie
AnimationTreea été mis à jour pour Godot 4.
Godot 3.5¶
Dans le cadre de ce document, j'utiliserai mon dépôt de code yt et plus précisément la version vBase_done.
Ce dernier contient le projet de base pour pour mes vidéos YouTube sur la création d'un jeu de plateforme.
Voici à quoi ressemble le projet de base.

Godot 4.x¶
Pour la partie AnimationTree, j'utiliserai le projet c08_parallax et plus spécifiquement la branche cours_animTree.
Voici à quoi ressemblera le projet à la fin du document.

Créer l'animation¶
Pour utiliser l'AnimationTree, il faut avoir un noeud AnimationPlayer et ce dernier nécessite un noeud Sprite.
Étape 1 : Convertir le noeud Player en scène.¶
Cliquer avec le bouton de droit sur le noeud Player et sélectionner "Sauvegarder la branche en tant que Scène".
Travailler sur une scène sera plus facile pour le futur.
Étape 2 : Ajouter un noeud Camera2D¶
Ajouter à la scène Player un noeud Camera2D pour permettre le suivi du personnage.
- Configurer la propriété
Currentà "On" pour activer le suivi. - Activer la propriété
SmoothingàEnabledpour activer un suivi fluide. - Tester le projet
Étape 3 : Ajouter un noeud Sprite¶
Le noeud Sprite permettra d'ajouter facilement les images au noeud AnimationPlayer.
- Ajouter un noeud
Sprite. -
Glisser l'image
viking2.pngsur la propriétéTexturedu noeudSprite- On devrait obtenir une image similaire à cette capture d'écran

-
Il faudra configurer le nombre d'images à l'horizontal et à la vertical qui sont respectivement 9 et 6.
- Il s'agit des propriétés
HframesetVframesde la sectionAnimation
- Il s'agit des propriétés
Étape 4 : Ajouter un noeud AnimationPlayer¶
Le noeud AnimationPlayer permet, entre autres, de gérer les animations.
- Ajouter un noeud
AnimationPlayer. - Dans le volet inférieur nommé « Animation », ajouter une nouvelle animation appelée « Idle »
- On clique sur le bouton
Animationet on sélectionneNouveau
- On clique sur le bouton
On verra une bande avec des nombres apparaître, il s'agit de l'échelle de temps de l'animation. On peut zommer sur celle-ci en maintenant la touche CTRL enfoncée et en faisant aller la molette de la souris. - Dans le cadre du projet, je propose d'afficher le temps pour voir l'échelle affichée aux dizième de seconde.
- Sélectionner le noeud
Sprite. - Remarquer la propriété
Frame, il y a une petite clé avec un "+" à la droite.

- Cliquer sur ce bouton pour créer une nouvelle trame dans l'animation.
- Si une petite fenêtre s'affiche, s'assurer que la courbe de Bezier ne soit pas cochée et cliquer sur
Créer.
Une nouvelle image apparaîtra et la propriété Frame sera incrémentée de 1.
Le curseur du temps (ligne bleue) sera à zéro

Attention!
Il y a un bogue dans Godot 3.x où il faut repositionner manuellement le curseur du temps après la première image. Il faudra répéter à chaque fois que l'on crée une nouvelle trame d'animation.
- Repositionner le curseur du temps après la première image.
- S'assurer que la propriété
Framesoit à la valeur 1. - Cliquer sur la petite clé
- Répéter l'opération jusqu'à la fin de l'animation.
- Ajuster la durée de l'animation à l'aide de la zone de texte au bout du chronomètre.

L'action complète.

- Répéter les étapes 2 à 11 pour l'ensemble des animations.
Attention!
Il faut souvent séparer les animations de saut. En effet, il y a l'animation de l'impulsion ainsi que l'animation de la chute.
Ajouter un noeud AnimationTree¶
Une fois que les configurations des animations est réalisées, on peut passer à l'étape de l'AnimationTree.
Vidéo où j'explique l'AnimationTree
Ce noeud sert à créer et gérer une machine à état fini pour notre personnage.
Avant d'utiliser le noeud, il faut établir les différents états du personnage. Dans notre cas, les états sont définis dans les types d'animation que l'on a réalisé dans l'AnimationPlayer, par exemple, idle, run, attack_1, ...
Les étapes de base seront les suivantes :
- Ajouter un noeud
AnimationTreeau personnage- Un volet
AnimationTreeapparaîtra dans le bas de l'IDE.
- Un volet
- Sélectionner le type de machine que l'on désire avec la propriété
Tree Root.- Dans notre cas, ce sera un
AnimationNodeStateMachine - Note : Personnallement, n'ayant fait que du 2D, je n'ai exploré que l'option
AnimationNodeStateMachine. Il se peut que vous ayez exploré d'autres options selon les tutoriels que vous avez suivi.
- Dans notre cas, ce sera un
- Associer l'
AnimationPlayerque l'on désire gérer.- Dans notre cas, on n'a qu'un noeud
AnimationPlayer.
- Dans notre cas, on n'a qu'un noeud

- Dans le volet
AnimationTree, cliquer avec le bouton de droite dans l'espace de travail et ajouter l'animationidle.- Activer la propriété
Activede l'AnimationTree. - Pour voir l'animation
idle, il suffit d'appuyer sur le boutonplaydans l'état (rectangle noir).
- Activer la propriété

- Répéter l'opération précédente en ajoutant l'animation
running.- On peut tester l'animation.
- Répèter l'opération précédente en ajoutant l'animation
attack1.- Tester l'animation.
- On remarque que l'attaque "gèle" après s'être exécutée. La raison est que l'animation ne boucle pas. Il faudra ajouter une transition pour qu'elle reviennent à l'état
idle.

- Ajouter une transition d'
idlevers l'attaque.- Dans la petite barre d'outils, il y a une petite flèche avec une ligne (3e bouton). Ce bouton sert à ajouter des transitions entre les états.
- Pour ajouter une transition, il faut cliquer-glisser de l'état source et vers l'état destination.
- Tester l'animation d'attaque
- Il gèle encore, car il n'y a pas de transition de l'attaque vers l'
idle.
- Il gèle encore, car il n'y a pas de transition de l'attaque vers l'
- Ajouter une transition entre l'état "attaque" vers
idle. - Tester l'attaque.
- L'animation "gig", car elle passe successivement de l'
idleà l'attaque et à l'idle.
- L'animation "gig", car elle passe successivement de l'

- Sélectionner la transition de l'attaque vers l'
idle - Modifier la propriété
Switch ModepourAtEnd.

- Das les propriétés
Advance, configurer le mode pourAuto

- Tester l'attaque
- Tout devrait fonctionner.
- Ajouter les transitions entre
runetidle.- Laisser les transitions telles quelles, car la n dn se fera dans le code.
- Ajouter l'ensemble des animations.
- Le saut devra être composé de
jumpetfall. - Il devra avoir un état
fallseul avec des transitions aller-retour avecidle. La gestion se fera dans le code.
- Le saut devra être composé de
- L'état
idlesera l'état initial. Faire une transition entreStartetidle. - Définir
deadcomme étant l'état de fin. Il suffit de sélectionner l'état et de faire une transition versEnd.

La configuration de l'AnimationTree est terminée. Il est maintenant temps de passer à la programmation.
Programmer les transitions entre les états¶
Comme indiquer précédement, il faudra gérer les transitions entre les états dans le code.
Godot possède une mécanisme géniale qui permet de simplifier la gestion des transitions. En effet, il y a une classe nommée AnimationNodeStateMachinePlayback qui permet de "voyager" d'un état à un autre automatiquement.
Étape 1 : Objets pour la gestion de l'animation¶
Dans la classe Player.cs, créer les deux membres suivants :
Dans la méthode _Ready(), ajouter le code suivant :
Dans Godot, la méthode GodotObject.Get permet de récupérer les propriétés d'un noeud. Dans notre cas, on récupère la propriété playback de l'AnimationTree qui est un AnimationNodeStateMachinePlayback.
Pour connaître la chaîne du paramètre, il suffit de sélectionner le noeud dans l'IDE et de cliquez avec le bouton droit sur la propriété qui nous intéresse. Un menu contextuel apparaîtra et il suffit de sélectionner Copier le chemin de la propriété.

Étape 2 : Ajouter les méthodes pour gérer les transitions¶
Pour passer d'un état à l'autre, on utilise la méthode AnimationNodeStateMachinePlayback.Travel qui prend en paramètre le nom de l'état de destination.
Cette méthode trouve le chemin le plus court pour passer de l'état actuel à l'état de destination.
Dans le if (isOnFloor())..., il y a le else qui vérifie si le vecteur d'entrée est différent de zéro. Modifier cette partie pour avoir ce code.
if (!isOnFloor()...), modifier le code pour le suivant:
Si tout fonctionne bien, on devrait avoir un résultat similaire à celui-ci.

