Que recherchez-vous ?
Engine & platform

« Attendez, j'ai changé d'avis » – Interruptions de transition de la machine à états

CATHERINE PROULX Anonymous
Jul 13, 2016|5 Min
« Attendez, j'ai changé d'avis » – Interruptions de transition de la machine à états
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.
J'ai récemment enquêté sur un bug délicat signalé par un utilisateur impliquant la combinaison d'états vides, de couches de remplacement et d'interruptions de transition. En creusant, j’ai découvert que notre documentation sur les interruptions de transition dans le système d’animation était un peu… minimaliste. Après une longue conversation avec mon équipe, nous avons conclu qu’un article de blog était de mise.

Plongeons donc dans certains détails complexes des transitions et des interruptions des machines à états !

Par défaut dans le système d'animation, les transitions ne peuvent pas être interrompues : une fois que vous commencez à passer d'un état à l'autre, il n'y a pas d'issue. Comme un passager sur un vol transatlantique, vous êtes confortablement installé dans votre siège jusqu'à ce que vous atteigniez votre destination et vous ne pouvez pas changer d'avis. Pour la plupart des utilisateurs, cela convient.

Mais si vous avez besoin de plus de contrôle sur les transitions, Mecanim peut être configuré de différentes manières pour répondre à vos besoins. Si vous n'êtes pas satisfait de votre destination actuelle, vous pouvez prendre le siège du pilote et modifier vos plans à mi-vol. Cela signifie des animations plus réactives, mais aussi de nombreuses possibilités de se perdre dans la complexité.

Voyons donc quelques exemples pour éclaircir ce problème. Nous pouvons commencer avec une machine à états assez simple avec quatre états, étiquetés de A à D, et des déclencheurs connectés à chaque transition sur la machine à états.

image05

Par défaut, lorsque nous déclenchons la transition A->B, notre machine d'état transitionne vers B et rien ne peut l'empêcher d'atteindre sa destination. Mais si nous allons sur l'inspecteur de transition A->B et changeons la source d'interruption de « Aucune » à « État actuel », notre voyage de A à B peut être interrompu par certains déclencheurs sur l'état A.

image01

Pourquoi seulement « certains » ? Parce que la case à cocher « Interruption ordonnée » est également cochée par défaut. Cela signifie que seules les transitions sur l'état A qui ont une priorité plus élevée que celle actuelle sont autorisées. En regardant l’inspecteur de l’état A, nous pouvons voir que cela s’applique uniquement à la transition A->C.

image02

Donc si nous activons le déclencheur A->B, puis peu de temps après le déclencheur A->D, notre transition reste ininterrompue. Cependant, si nous appuyons plutôt sur le déclencheur A->C, la transition est immédiatement interrompue et la machine d'état commence la transition vers C.





En interne, le système d'animation enregistre la pose au moment de l'interruption et va désormais fusionner entre cette pose statique (X) et la nouvelle animation de destination. Pourquoi une pose statique, au lieu d'un mélange éventuellement plus fluide entre les transitions actuelles et nouvelles ? En termes simples : la performance. Lorsqu'un jeu est confronté à une cascade d'interruptions, le suivi de plusieurs transitions dynamiques se déroulant simultanément rendrait rapidement le système d'animation non évolutif.

Maintenant, si nous décochons la case « Interruption ordonnée », alors A->C et A->D peuvent interrompre la transition. Cependant, s'ils sont tous deux déclenchés sur la même image, A->C aura toujours la priorité car il a une priorité plus élevée.

Si nous changeons la source d’interruption sur « État suivant », A->C et A->D ne peuvent plus interrompre la transition, quel que soit leur ordre. Cependant, si nous appuyons sur le déclencheur B->D, nous commencerons immédiatement la transition de A à D, sans terminer la transition vers B.

L’ordre de transition est également important pour l’État B. La case à cocher « Interruption ordonnée » n'est plus disponible (toute transition déclenchée sur B peut interrompre la transition car elles n'ont pas de classement de priorité par rapport à A->B), mais l'ordre des transitions sur B déterminera quelle transition gagne si les deux sont déclenchées dans la même image. Dans ce cas, si B->D et B->C sont déclenchés dans la même image, B->D sera sélectionné.

image03

Enfin, pour un contrôle complet, nous pouvons définir la source d’interruption sur « État actuel puis état suivant » ou « État suivant puis état actuel ». Dans ce cas, les transitions seront analysées indépendamment sur un état, puis sur l'autre.

Alors, supposons que nous ayons la configuration suivante.

image00

Lors de la transition A->B, un joueur très excité déclenche quatre transitions dans la même image : A->C, A->D, B->C et B->D. Ce qui se produit?

Tout d’abord, « Interruption ordonnée » est cochée, nous pouvons donc ignorer immédiatement A->D : sa priorité est inférieure à A->B. L'état actuel est résolu en premier, nous n'avons donc même pas besoin de regarder l'état B pour savoir que la transition A->C gagne.

image02
image03