Animation Curves, l'ultime levier de conception

EDUARDO ORIZ / UNITY TECHNOLOGIESSenior Content Marketing Manager
Jul 21, 2022|27 Min
Animation Curves, l'ultime levier de conception
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

Voici le troisième billet de Christo Nobbs dans sa série consacrée aux concepteurs de jeux. La série développe ses contributions à Le manuel du concepteur de jeux Unityun guide approfondi de plus de 100 pages qui explique aux concepteurs de jeux comment prototyper, créer et tester le gameplay dans Unity. Des liens vers les précédents articles du blog de Christo sont inclus à la fin de ce document.

Dans Unity, il existe plusieurs "types" que nous pouvons utiliser pour stocker des données qui sont tout aussi bénéfiques que les leviers de conception pour l'équilibrage des systèmes, le gameplay, les paramètres des personnages, les profils des véhicules, et ainsi de suite. Les courbes d'animation sont un type de composant qui offre aux concepteurs et créateurs de jeux des possibilités intéressantes, en particulier lors du prototypage. Utilisez-les dans votre projet, par exemple dans un système de particules pour contrôler les variables animées, ou dans le composant source audio pour gérer le roll-off et d'autres propriétés.

Une courbe est un graphique linéaire qui montre la réponse (sur l'axe Y) à la valeur variable d'une entrée (sur l'axe X). Unity utilise les courbes dans différents contextes, notamment dans l'animation. Les éditeurs de courbes disposent d'un certain nombre d'options et d'outils différents dont vous pouvez tirer parti.

Cet article se concentre sur l'utilisation des courbes d'animation via l'API Unity, avec le type de variable AnimationCurve. Ils peuvent ainsi être utilisés pour capturer et stocker des données, ce qui est utile pour l'analyse des résultats. Les courbes sont également compatibles avec les ScriptableObjects, qui, comme nous l'avons vu dans le playbook, sont très utiles pour modifier les données de gameplay.

Les courbes d'animation peuvent être modifiées dans l'inspecteur en tant que variables publiques ou lorsqu'elles sont sérialisées. Vous pouvez les enregistrer, les exporter ou les charger en mode édition ou au moment de l'exécution. Les tangentes modifiables permettent de contrôler la forme de la courbe entre les touches.

Une propriété de courbe d'animation dans l'inspecteur
Une propriété de courbe d'animation dans l'inspecteur : En cliquant dessus, vous ouvrez l'éditeur de courbes, où vous pouvez ajuster la courbe et l'enregistrer dans votre propre bibliothèque en sélectionnant l'icône en forme de roue dentée.
La clé de la tangente dans Unity
Un double-clic sur une courbe crée une nouvelle clé que vous pouvez utiliser pour la manipuler, et fournit également plusieurs options pour contrôler les poignées de la clé.

Vous pouvez ajouter des clés, modifier leurs tangentes et manipuler les poignées de la courbe pour trouver la forme qui donnera les résultats souhaités.

Une courbe d'animation avec plusieurs tangentes
Une courbe d'animation qui inclut des tangentes pour créer des pics, des creux et des angles abrupts.
Ajouter des détails réalistes aux mouvements de tous les jours

Un levier de conception visuelle tel qu'une courbe d'animation permet aux concepteurs de jeux d'affiner le gameplay sans avoir à écrire des fonctions mathématiques ou d'assouplissement complexes.

Les courbes d'animation peuvent notamment être utilisées dans une Timeline, pour ajouter des nuances et des détails aux mouvements linéaires. Prenons l'exemple d'un personnage qui ferme la portière d'une voiture. L'action commence par un tremblement lorsque la main saisit le levier pour fermer la porte. La porte se ferme d'abord lentement, puis le mouvement s'accélère au fur et à mesure que la porte se referme, avant de s'arrêter brusquement, peut-être avec un petit rebond ou un clic. Tous ces mouvements peuvent être enregistrés dans la même courbe pour la séquence.

Une porte marron s'ouvrant et se fermant sur un gar vert dans l'éditeur Unity
Ouverture et fermeture d'une porte à l'aide de courbes dans la ligne de temps de l'animation
La courbe d'ouverture d'une porte
La courbe d'ouverture d'une porte
La courbe de fermeture d'une porte
La courbe de fermeture d'une porte

Comme le montre cet exemple, les courbes d'animation sont utiles pour modifier les propriétés d'un objet au fil du temps afin de créer un mouvement naturel. D'autres cas d'utilisation concernent la manière dont un objet se déplace ou tourne, dont un personnage accélère ou décélère dans un sprint, ou dont un moteur fournit de la puissance à un contrôleur de voiture.

Courbe d'animation code C#
Voir cet aperçu de la façon dont une courbe d'animation dans l'inspecteur renvoie des données sur l'axe Y à une position donnée sur l'axe X. La méthode du bas montre comment utiliser la méthode EvaluateCurve en transmettant la courbe et la position souhaitées.

Lorsque vous créez une courbe d'animation à éditer dans l'inspecteur, vous pourrez évaluer la courbe en lui passant un paramètre, appelé temps dans Unity. Plus loin dans ce billet, nous verrons pourquoi la position est plus descriptive lorsque l'on n'utilise pas l'axe X pour le temps.

Une "pseudo" courbe de couple du moteur pour contrôler la puissance de sortie du moteur

Voyons comment utiliser une courbe d'animation pour contrôler la puissance du moteur d'un véhicule. Vous pouvez créer une "pseudo" courbe de couple moteur pour restituer la force appliquée au véhicule en fonction du régime actuel du moteur (tours par minute). Celle-ci augmente avec le temps si le joueur appuie sur l'accélérateur.

Plutôt que de cartographier toute la plage de régime pour chaque vitesse et chaque véhicule, vous pouvez "normaliser" ou régler le régime entre 0 et 1. Les courbes de "couple" que vous créez peuvent ensuite être sauvegardées et réutilisées pour d'autres véhicules et engrenages.

Définissez cette valeur en divisant votre valeur brute ou actuelle par la valeur maximale :

normalisedCurrentRPM = currentRPM / maxRPM

La puissance de sortie (axe Y) sera également utilisée entre 0 et 1 pour que l'éditeur de courbes reste gérable et que les courbes elles-mêmes soient réutilisables. Cette valeur peut être ajoutée à la force de déplacement du véhicule, pour faire avancer le corps rigide du véhicule sur l'axe Z.

Exemple de script pour normaliser le RPM
Voici un exemple de script pour "normaliser" le régime, puis ajouter une force basée sur la valeur Y de la courbe de couple à un régime donné multipliée par la puissance du moteur.

Vous pouvez obtenir différents résultats avec la même configuration pour d'autres véhicules en restant entre les valeurs 0,0 et 1,1 de la courbe.

Une courbe verte ascendante

L'ajout d'une équation de rapport de vitesse de base au moteur de votre voiture permet d'obtenir des véhicules réalistes qui bougent et se balancent lorsque vous passez les vitesses et que vous atteignez des courbes de puissance différentes, ou la même courbe à différents endroits. Pour cela, il faut que la voiture soit une carrosserie rigide. Lorsque vous ajoutez d'autres corps rigides dans le coffre ou sur les sièges arrière de la voiture, celle-ci se déplace, ce qui peut être amusant pour les missions de livraison chronométrées.

Si vous ne souhaitez pas utiliser le système physique d'Unity parce que vous avez un contrôleur de voiture personnalisé, vous pouvez créer des variantes à vide et en charge de vos courbes, et échanger ces courbes au moment de l'exécution pour que le véhicule se conduise comme vous le souhaitez.

Même si vous ne l'utiliserez pas souvent, vous pouvez ajouter des clés, modifier des clés (ce qui permet de supprimer et d'ajouter de nouvelles clés) et supprimer entièrement des clés sur les courbes au moment de l'exécution via l'API Unity. Cela vous permet de mieux contrôler la modification de vos courbes, ce qui peut également inclure le lissage des tangentes si nécessaire.

Courbes pour un véhicule lourd, tel qu'un camion à boîte de vitesses automatique qui démarre lentement mais ne perd pas de puissance après avoir atteint son régime maximal : Cette courbe montre le camion à vide.
Cette courbe montre un camion avec une lourde charge. En ajoutant une autre touche et une réduction de puissance après que le véhicule a commencé à se déplacer, vous pouvez donner au camion l'impression qu'il a une deuxième vitesse longue, par exemple, ce qui lui donne plus de personnalité.
Une seule courbe pour un véhicule à plusieurs vitesses
Une seule courbe pour un véhicule à plusieurs vitesses

Les courbes d'animation vous permettent de créer d'excellentes abstractions de systèmes plus complexes que vous pouvez contrôler sous forme visuelle. Dans l'exemple du moteur, vous pouvez ajouter de la puissance au fur et à mesure de l'accélération avec la courbe illustrée ci-dessus (qui représente la "pseudo" boîte de vitesses) pour créer la sensation que la voiture change de vitesse - en ajustant son pas vers le haut à mesure que la puissance est délivrée, puis vers le bas à mesure que la puissance s'éteint au sommet de chaque vitesse. Cette méthode est idéale pour prototyper le mouvement d'un véhicule en plaçant toute la puissance de la voiture sur une seule courbe qui représente toutes les vitesses, du début de la première vitesse à x0,y0 jusqu'au sommet de la cinquième vitesse à x1,y1.

Le régime s'accumule généralement au fil du temps lorsque l'on accélère, de sorte que l'on trace essentiellement des valeurs au fil du temps, un peu comme si l'on ajoutait un mouvement linéaire à un objet en mouvement. Pour en savoir plus, consultez la section sur la synchronisation et l'animation dans le Manuel du concepteur de jeux.

Trois voitures à l'allure futuriste font la course sur une grande route quadrillée entourée de néons bleus.
La physique "pseudo" est utile dans les jeux où le mouvement n'adhère pas aux règles de la physique réelle, comme dans le jeu de course futuriste Made with Unity, Antigraviator.

Prenons un autre exemple : la suspension et le mouvement d'une voiture lorsqu'elle roule sur un terrain accidenté, qu'elle prend un virage ou que la puissance est transmise aux roues. Une meilleure direction, le contrôle des forces latérales ou le glissement des pneus peuvent tous être gérés avec des courbes d'animation pour créer des résultats réalistes que vous pouvez affiner visuellement.

Lors de la création d'une mécanique basée sur la diffusion de rayons pour un véhicule, qu'il s'agisse d'un aéroglisseur ou d'un véhicule à roues, un choix courant pour créer l'effet de "suspension" dans le moteur consiste à appliquer une force ascendante sur chaque rayon et à utiliser un algorithme de contrôleur PID (proportionnel-intégral-dérivé) pour contrôler le rebond ou, dans certains cas, la loi de Hooke pour l'amortissement. Un exemple de ceci peut être vu dans le Hover Racer Live 7/21 Cycle 4.2 d'Unity, ainsi qu'un exemple plus bas dans ce billet utilisant un PID basé sur celui-ci.

Un algorithme de contrôleur PID est un mécanisme de rétroaction de boucle de contrôle, ou un contrôleur, utilisé dans de nombreux secteurs, y compris le développement de jeux, lorsqu'une correction réactive est nécessaire. Le contrôleur PID calcule une valeur d'erreur comme étant la différence entre une variable de processus mesurée et un point de consigne désiré, et en relation avec l'élasticité (ou notre exemple), il peut être utilisé comme une alternative à la loi de Hooke. Un PID dans les jeux est également pratique pour :

  • Faire en sorte qu'un véhicule régule une vitesse cible en mode régulateur de vitesse, tout en étant soumis de manière imprévisible à d'autres facteurs tels que la masse transportée, l'intervention du joueur ou l'angulation du terrain.
  • Contrôle de la précision des agents de l'IA ennemie lorsqu'ils tirent sur vos joueurs, tout en évitant de se faire toucher.
  • Prédiction de la latence dans les jeux multijoueurs.

Les PID peuvent être utilisés partout dans le développement de jeux, en particulier dans les bacs à sable et les simulations qui nécessitent un "contrôle automatique précis et optimisé". Kerbal Space Program by Squad utilise le PID pour maintenir un vaisseau spatial dans une seule direction.

Selon cette étude, "la régulation PID est la technologie la plus mature et la plus largement utilisée pour les systèmes continus" en dehors du développement de jeux. Voir ce cours sur le système de contrôle à l'adresse : Introduction à la régulation PID pour plus d'informations.

Une fusée spatiale se trouve dans un hangar, avec une interface ouverte sur la gauche, montrant les options de personnalisation de la fusée.
Kerbal Space Program de Squad, disponible sur Steam, utilise des algorithmes de contrôle PID.

Les algorithmes des contrôleurs PID ne prennent peut-être pas beaucoup de temps à créer, mais ils nécessitent du temps pour les équilibrer ; ce temps est multiplié en fonction du nombre de véhicules que vous possédez. Cependant, lors du prototypage, vous pouvez utiliser une courbe d'animation pour gagner du temps ou éviter les difficultés techniques liées à la mise en œuvre et à l'équilibrage de plusieurs contrôleurs PID (vous souhaiterez éventuellement remplacer la solution de la courbe par un PID pour un contrôle optimal).

Les courbes sont idéales pour le prototypage car elles peuvent être utilisées pour faire correspondre visuellement des exemples de référence de cibles du monde réel. En ce qui concerne l'espace, c'est "mathématiquement parfait" dans un moteur de jeu, sans forces de mouvement opposées à moins qu'elles ne soient ajoutées ou que la gravité par défaut ne soit activée. Il est donc souvent plus facile d'utiliser une courbe simple pour contrôler le changement et obtenir des résultats solides.

Dans le cas de la création d'une suspension pour un véhicule, vous pouvez utiliser les courbes d'animation pour déterminer la force opposée appliquée en fonction du niveau de compression du ressort (normalisé entre 0 et 1), plutôt que d'utiliser un contrôleur PID pour créer l'amortissement. Associée à un corps rigide et à une faible traînée, l'oscillation du rebond est supprimée et la suspension du véhicule réagit à l'augmentation ou à la diminution de la charge.

Pour déterminer la compression du ressort, il faut soustraire la distance d'impact du rayon de la longueur du ressort de 1,0f. Quelle que soit sa longueur, lorsque le ressort est comprimé à 25 %, la valeur de compression est de 0,25. Définissez cette valeur de compression comme valeur X sur la courbe d'animation, multipliez-la par la force de ressort souhaitée (car vous travaillez avec des valeurs normalisées), puis utilisez-la dans AddForceAtPosition pour appliquer la force ascendante à chaque point d'une boucle, en fonction du nombre de points de suspension. Aucune force descendante supplémentaire n'est nécessaire en dehors de la gravité par défaut d'Unity à -9,81f.

Voici la formule :

force ascendante = forceMultiplier * forceCurve.Evaluate(springCompressionNormalized) ;

rigidBody.AddForceAtPosition(hitNormal * upwardsForce, point.transform.position);

En utilisant un rapport masse:force de 13:110 et la courbe ci-dessous.

Une camionnette blanche sans roues tombant sur une route devant une forêt, à Unity
Une camionnette sans roues avec des suspensions allongées (1 mètre de longueur de ressort) : La camionnette tombe à un angle irrégulier, en ligne droite, et bascule d'un côté à l'autre.
Une double courbe sigmoïdale
Une double courbe sigmoïdale

Le véhicule se stabilise à une compression d'environ 50 % en utilisant des valeurs appropriées pour la masse, la force ascendante et de petites quantités de traînée linéaire et angulaire pour supprimer l'oscillation. Cela permet au véhicule de rebondir et de se stabiliser, mais pas de s'effondrer, à moins qu'il ne tombe d'une hauteur extrêmement élevée ou qu'il ne soit surchargé par le joueur qui ajoute de la masse.

Pour trouver de bonnes valeurs, commencez par une courbe y = b^x (qui ressemble à un quart de cercle). La traînée doit être faible et la masse du véhicule doit correspondre à la réalité. La force ascendante est ensuite réglée jusqu'à ce que le véhicule se trouve à environ 50 % de compression du ressort. Faites tomber le véhicule plusieurs fois pour vérifier qu'il ne s'enfonce pas et voyez où il se stabilise après le rebond. L'utilisation de cette approche pour la suspension des véhicules qui roulent sur des terrains accidentés, où chaque point de traction peut être gagné ou perdu, permet d'obtenir un système de suspension rapide et contrôlable.

L'utilisation de courbes d'animation pour votre modèle de suspension permet d'obtenir des mouvements variés pour les véhicules - voitures, camionnettes ou camions - dotés d'une mauvaise suspension, à savoir ceux qui s'écrasent constamment, qui rebondissent comme dans les jeux d'arcade ou qui roulent dans les virages et vacillent lorsque vous accélérez et freinez. Les courbes peuvent être utilisées en combinaison avec des systèmes existants si vous n'utilisez pas déjà le système Rigidbody d'Unity ou votre propre méthode de suspension. Vous pouvez utiliser les courbes pour la direction ou pour amplifier la puissance du moteur, la suspension, la traînée, le glissement des pneus, la force de freinage, etc. Les courbes d'animation sont un outil tellement pratique et polyvalent dans Unity pour ajouter des leviers de conception à chaque véhicule afin de contrôler leurs caractéristiques visuellement dans l'inspecteur.

Boules grises tombant avec différentes caractéristiques et courbes dans Unity
Utilisation de différentes courbes pour chaque corps rigide afin de visualiser les caractéristiques en cas de chute
Les courbes de chaque sphère dans l'image précédente
Les courbes de chaque sphère dans l'image précédente
Un extrait de code en C# pour déposer des objets
L'extrait de code pour déposer des sphères

La rangée de sphères dans l'image ci-dessus a été créée en positionnant une séquence de corps rigides dans une rangée et en contraignant leurs propriétés X et Z Freeze Position. Une force ascendante a ensuite été appliquée à l'aide d'une courbe d'animation basée sur la force ascendante de compression, mais avec des courbes différentes pour chaque sphère, placées côte à côte pour une meilleure visualisation. Vous pouvez utiliser cette technique pour trouver le niveau de rebond souhaité pour un objet, ou pour modifier le rebond existant afin d'équilibrer les caractéristiques. En tant que concepteur, la possibilité de manipuler les caractéristiques de la force ascendante peut vous aider à créer des abstractions de fonctions plus complexes.

Les courbes sont un type de données XY puissant et, bien qu'elles ne soient pas techniquement parfaites, elles peuvent vous aider à prototyper des solutions d'amortissement rapides qui peuvent être modifiées visuellement dans l'inspecteur et enregistrées en tant que préréglages au moment de l'exécution. Dans ce blog sur l'art de l'amortissement, Alexis Bacot met en lumière tout ce qui "dépend d'un bon amortissement". Caméra, animation, mouvement, dégradés de couleurs, transitions d'interface utilisateur, et bien d'autres choses encore... il est utilisé partout ! La compréhension de l'amortissement est essentielle pour obtenir un polissage de qualité. L'amortissement peut à lui seul faire la différence entre une bonne et une mauvaise expérience".

Dans le même billet, il montre comment SmoothDamp d'Unity peut être utilisé pour créer une belle aisance à l'entrée et à la sortie, et réagit au changement de cible avec précision. Mais il ne rebondit pas comme un "amortisseur à ressort perfectionné qui peut osciller, ce qui est idéal pour la suspension des voitures ou la physique des fausses balles" - un exemple où les courbes d'animation offrent un avantage considérable.

Bien entendu, les courbes ont d'autres usages que celui d'un type de données XY permettant de manipuler le gameplay. Ils peuvent également être traités comme un outil d'évaluation pour capturer des données visuellement en utilisant AddKey via l'API Unity. Pour évaluer une position dans le temps, comme l'amortissement dans l'exemple de la suspension du véhicule ou la chute des sphères, utilisez AddKey(elapsedTime, currentSpringCompression) dans une méthode, puis appelez cette méthode et transmettez captureResolution comme taux de répétition via InvokeRepeating. Une résolution de capture de 0,1f signifie que, toutes les 0,1s, une clé est ajoutée à la courbe. Visualisez le mini résultat dans l'inspecteur ou ouvrez le graphique pour voir les données complètes.

Une courbe tracée
Une courbe tracée résulte de l'utilisation d'une courbe de rebond linéaire qui présente une ligne droite directe de 0,0 à 1,1.
Une courbe tracée
Une courbe tracée résulte de l'utilisation d'une courbe non linéaire, de type sigmoïde double, similaire à celle illustrée ci-dessus.
Retour à la camionnette bondissante

Jetons un dernier coup d'œil à la camionnette qui tombe. La courbe d'animation détermine la force appliquée en fonction de la compression du ressort et permet d'obtenir un résultat proche de la cible, avec un peu plus d'oscillation lors du troisième rebond. Vous pouvez comparer la suspension créée avec une courbe d'animation à celle du contrôleur PID, en utilisant le PID dans le cycle 4.2 du Hover Racer Live 7/21 d'Unity. La seule différence est que le résultat du PID est multiplié par la force de vol stationnaire au lieu de la valeur Y de la courbe d'animation.

Après la mise en œuvre du PID et de nombreux équilibrages, la suspension du véhicule semble plus proche de l'objectif, avec moins d'oscillations à l'arrière et moins de traînée nécessaire pour la suppression. Malheureusement, le PID doit être équilibré pour chaque véhicule s'ils ont des valeurs de masse différentes, ce qui prend beaucoup de temps. À des fins de prototypage, cette opération peut être réalisée rapidement et visuellement à l'aide des courbes d'animation, et les résultats tracés du mouvement peuvent être analysés. Pour évaluer la mise en œuvre du PID, vous pouvez à nouveau utiliser une courbe pour tracer le résultat par rapport à une courbe vierge. Le résultat est bien meilleur, avec un deuxième rebond légèrement exagéré, mais offrant le mouvement et l'apparence souhaités pour une grosse camionnette flottante.

Une camionnette blanche sans roues suspendue dans les airs, à Unity
La mise en œuvre finale de la suspension du véhicule utilisant le PID, mais basée sur les courbes d'animation développées pendant le prototypage : La suspension est toujours exagérée, utilisant des ressorts d'une longueur de 1 mètre.
Une courbe d'amortissement cible à gauche, avec une courbe de résultat tracée à droite.
Voir le résultat de la courbe d'amortissement cible d'Alexis Bacot à gauche, et le résultat tracé du mouvement du véhicule après la mise en œuvre du PID à droite.

Pour résumer, utilisez les courbes d'animation lorsque vous développez le mouvement du véhicule :

  • Tracer la puissance du moteur d'un véhicule et produire une progression régulière de la puissance.
  • Créez des mouvements de freinage réalistes, par exemple lorsque la force de freinage est appliquée rapidement puis réduite progressivement pour simuler le freinage d'une vraie voiture ou, dans un jeu tel que iRacing, lorsque le conducteur freine à la limite des pneus pour que la voiture ralentisse en peu de temps sans partir en vrille.
  • Simulez un système de suspension qui fournit les forces ascendantes à la voiture.
  • Simulez la traction latérale, avec des calculs de contre-force latérale qui empêchent la voiture de trop glisser vers la gauche ou la droite.
  • Simuler la direction lors de l'utilisation d'un contrôleur (la direction est utilisable vers le milieu, autour de -0,5 à 0,5, mais devient progressivement plus rapide lorsque la position du manche s'approche de -1 ou 1).
Un bloc vert flottant sur une eau bleue, entouré de montagnes, dans Unity
Dans ce prototype, curve.Evaluate(time) est utilisé pour déplacer la transformation de la plate-forme sur l'axe Y au fil du temps.

En plus de la physique des véhicules, les courbes d'animation peuvent être utilisées comme leviers de conception pour le prototypage des mouvements des joueurs, des dommages causés par les coups au fil du temps, et plus encore. En tant que puissant outil de prototypage, les courbes d'animation permettent aux concepteurs de jeux de tester l'application de différentes forces et d'identifier la bonne "sensation" pour les mécanismes, sans avoir à écrire des algorithmes complexes ou des calculs de physique.

Pour plus de conseils et d'inspiration, consultez le Game Designer Playbook, téléchargeable gratuitement.