Unity a-t-il déjà un support pour Timelines?

13

Je prévois le développement d'un jeu dans Unity3D, et j'essaie de comprendre ce que le moteur a déjà fourni et ce que je dois coder moi-même.

Le jeu lui-même va être un jeu de rythme, ce qui signifie synchroniser les événements audio et graphiques afin qu'ils jouent toujours quand ils sont censés le faire. Ce que je cherche à éviter, c'est un scénario potentiel de décalage où l'audio ou les graphiques commencent à progresser plus rapidement que l'autre.

Lorsque nous avons discuté de ce type de système de coordination dans ma classe de conception de jeux à l'université, mon professeur a appelé ce type de conception une classe "Chronologie". L'idée étant que vous pouvez instancier une ou plusieurs d'entre elles pour progresser à des rythmes différents, planifier des événements futurs et synchroniser des événements périodiques. Cependant, appeler cela une classe "Timeline" semble avoir été limité à mon professeur lui-même, car googler pour savoir si certaines fonctionnalités d'API "Timeline" ont été une tentative infructueuse.

Existe-t-il un nom plus courant pour ce type de fonctionnalité? Unity dispose-t-il de méthodes préexistantes pour coordonner la planification d'événements comme celui-ci, ou est-ce le genre de chose qui doit être intégrée au moteur? Et si c'est le cas, j'apprécierais d'être pointé vers des tutoriels!

Raven Dreamer
la source
J'ai également utilisé des classes Timeline similaires (elles avaient même le même nom). Un nom plus courant pour le modèle m'est inconnu, mais il est probablement souvent implémenté via une programmation réactive fonctionnelle, des coroutines ou d'autres concepts asynchrones.
interphx

Réponses:

10

Bien que cette fonctionnalité ne soit pas disponible dans Unity, une implémentation de base d'une telle chronologie ne devrait pas être trop difficile à faire.

Voici comment je procéderais à ce sujet:

  • Votre classe Timeline utilise en interne une file d' attente prioritaire comme structure de données pour stocker les événements.
  • Un événement pourrait simplement être un moment et un rappel. Ainsi , l' ajout d' événements à la chronologie serait aussi simple que: timeline.AddEvent(0.25f, MyCallback).
  • Avec chaque Update, la classe de chronologie:

    1. Incrémenter la tête de lecture (simple float) du temps écoulé
    2. Vérifiez la tête de la file d'attente prioritaire et supprimez et appelez le rappel de tous les événements qui ont une priorité (par exemple, l'heure) inférieure ou égale à la tête de lecture actuelle.

Si vous avez besoin d'une sorte de fonctionnalité de rembobinage ou de relecture , il serait bien sûr stupide de supprimer tous les événements de la file d'attente (ce qui signifie que vous devrez les ajouter à nouveau lors du rembobinage). Au lieu de cela, vous pouvez également utiliser un tableau contenant vos événements . Un événement consisterait en un Timeet Callback. Vous devez conserver votre tableau trié par Time.

Ensuite, au lieu de supprimer des éléments du tableau, vous garderiez une trace de l' index du tableau actuel , et à chaque mise à jour, vous chercherez à l'avance à partir de cet index et exécuterez tous les rappels avec Playhead >= Timetout en augmentant également l'index en conséquence.

L'implémentation d'une vitesse de lecture plus rapide fonctionne avec les deux implémentations et serait aussi simple que:

Playhead += Time.deltaTime * playbackSpeed
bummzack
la source
2
"Augmentez la tête de lecture (un flottant simple) du temps écoulé" - Si vous faites cela, vous obtiendrez des erreurs de virgule flottante agrégées. Vous devez utiliser Time.time (le temps écoulé depuis le début du jeu) à la place.
BlueRaja - Danny Pflughoeft
4

Non, Unity3D n'a pas une telle API prête à l'emploi.

Il prend en charge les coroutines, cependant, et je vous suggère de les examiner. Les coroutines facilitent généralement la planification et la synchronisation des événements.

Ça ne fait rien
la source
1

Je ne sais pas si c'est nouveau depuis les réponses de 2012, mais Unity prend en charge le contrôle de la chronologie via l' éditeur d'animation (hérité) .

Bien que cette fonctionnalité soit principalement destinée à l'animation de paramètres d'objet avec des courbes, elle inclut la possibilité de déclencher des scripts sur des événements d'animation . Ces scripts pourraient piloter vos graphiques et vos fichiers audio.

DMGregory
la source