Comment synchroniser un jeu avec de la musique

10

Vous connaissez peut-être les jeux ryhtm comme Dancing Line , Geometry Dash ou même Guitar Hero . Ils ont quelque chose en commun: chaque action du jeu est synchronisée avec la musique. Mon but est de créer un jeu comme Geometry Dash où le joueur doit effectuer des actions en rythme tandis que le personnage défile automatiquement dans le niveau. J'ai quelques questions sur ce type de jeu:

  • Dois-je garder mon FPS constant car il doit toujours être synchronisé avec la musique?
  • Comment puis-je construire mes niveaux avec une musique à l'esprit pour m'assurer qu'elle sera synchronisée?

Je travaille sur Unity en utilisant C #.

Shashimee
la source

Réponses:

18

Je ne recommande pas d'utiliser Time.deltaTime pour suivre la progression de la lecture de la chanson comme décrit dans une autre réponse.

C'est génial pour les effets de lissage et d'interpolation à jouer en temps réel, mais lorsque vous voulez faire correspondre l' heure de la chanson, vous devriez demander la chanson.

Dans Unity, vous pouvez mesurer la progression d' une source audio en lisant une piste directement en utilisant AudioSource.timeou AudioSource.timeSamplespour obtenir la position précise de la tête de lecture. (Notez que cette dernière mesure en échantillons, dont le taux par seconde peut varier selon la façon dont vous avez compressé votre piste)

De cette façon, vous n'avez pas besoin d'exécuter votre propre minuteur séparé et espérez qu'ils restent synchronisés. Vous pouvez câbler les déclencheurs de jeu des effets de correspondance des temps pour sortir de la propre chronologie de la chanson.

Pour superposer des sons de gameplay sur la musique, vous pouvez utiliser AudioSource.PlayScheduled pour vous assurer que vos sons atterrissent exactement sur le rythme, car même une petite discordance peut être remarquée

DMGregory
la source
Avez-vous des idées sur la synchronisation des graphiques avec AudioSource? Je veux montrer une explosion ou une collision liée à la musique. Je veux le montrer exactement quand le son est joué.
syabro
Voilà à quoi servent toutes les réponses ici. Avez-vous trouvé des difficultés à mettre en pratique les suggestions de ces réponses, @syabro?
DMGregory
2

Comme alternative si vous êtes d'accord pour ne pas travailler à partir de zéro.

Il existe déjà des ressources prêtes à l'emploi (sous Editor Extensions / Audio comme https://www.assetstore.unity3d.com/en/#!/content/54639 (payant) ou https://www.assetstore.unity3d.com/en / #! / content / 39835 (gratuit)) où vous pouvez synchroniser les pistes musicales avec l'événement. Dans cet exemple, l'arme tire au rythme de la musique.

Si vous voulez savoir comment ils fonctionnent, essayez 1-2 des gratuits et regardez la source.

Zibelas
la source
J'ai vu une présentation des développeurs de Koreographer il y a quelque temps - ça ressemblait à un super morceau de technologie! À l'époque, ses capacités d'analyse audio étaient limitées, mais si vous connaissiez à l'avance la piste avec laquelle vous travaillez, vous pouviez utiliser la technologie pour programmer très précisément les événements de jeu à des rythmes / moments spécifiques de la musique. Je ne sais pas s'ils ont ajouté la possibilité de faire plus d'analyses automatiquement depuis cette démo.
DMGregory
1

Unity dissocie déjà le gameplay du framerate. Si vous vous souvenez de toujours utiliser Time.deltaTimedans vos fonctions de mise à jour, la fréquence d'images réelle ne devrait pas affecter la vitesse de jeu. Ainsi, lorsque vous démarrez le jeu et la piste audio en même temps, ils doivent rester synchronisés.

Concernant la conception de niveaux autour de la musique, il existe deux approches:

  • L'approche manuelle. Des niveaux méticuleusement artisanaux autour de pistes audio spécifiques. Avoir les partitions originales à portée de main peut aider, mais il est également possible de le faire juste à l'oreille.
  • L'approche procédurale. Utilisez des algorithmes d'analyse audio pour générer automatiquement des niveaux autour des pistes audio. Le plus simple est de simplement rechercher les pics de volume. Cela devrait déjà vous permettre d'identifier les battements de tambour dans de nombreuses chansons et de générer des obstacles en conséquence. Une étape supplémentaire consiste à détecter les changements de volume séparément dans différents spectres de fréquence. Cela rend la détection de battements plus fiable et vous permet de générer différents obstacles pour différents emplacements. Mais cela ne fait qu'effleurer la surface. L'analyse audio est un domaine très large et intéressant. Les gens ont écrit beaucoup de littérature scientifique à ce sujet.

    La profondeur dont vous avez besoin pour plonger dans ce domaine dépend de votre ambition. Certains jeux se contentent de détecter les battements et de générer de manière aléatoire tout le reste de la conception de niveau ( Crypt of the Necrodancer ). D'autres essaient de mettre autant d'aspects du level design sous le contrôle de l'audio qu'ils le peuvent ( Audiosurf ).

De nombreux jeux de rythme utilisent une approche hybride. Vous générez un premier brouillon du niveau à l'aide d'un générateur, puis le modifiez à la main pour le rendre plus jouable.

Philipp
la source
Merci pour votre réponse, je vais y jeter un œil! Time.deltaTime est-il vraiment précis et il n'y aura pas de décalage créé avec de longues musiques?
Shashimee
@Shashimee Cela devrait être assez précis. Si vous voulez vraiment être sûr de ne rien perdre aux différences d'arrondi, utilisez Time.timeplutôt.
Philipp
Je recommanderais une approche procédurale car elle ouvre beaucoup plus de possibilités pour que le jeu se développe. Les joueurs peuvent ajouter leurs propres pistes, vous pouvez changer le maillage et toutes les autres choses au rythme, comme les particules. De plus, vous ne passerez pas beaucoup de temps à concevoir des niveaux.
Candid Moon _Max_
1
@Philipp, malheureusement, Time.time peut être encore plus vulnérable à l'imprécision si le jeu fonctionne depuis un certain temps . Puisqu'il mesure le temps de jeu depuis le démarrage, plutôt que depuis le début de la piste ou le début du niveau, après avoir joué une chanson ou deux, il aura perdu autant de bits de précision qu'une somme naïve de deltas, et l'erreur peut continuer à augmenter si le jeu est en cours d'exécution / sommeil-restauré à plusieurs reprises.
DMGregory
0

Il est très courant d’avoir une «carte des temps». Tout type de données représentant les battements de la chanson. Il peut s'agir d'une texture, d'un fichier de données ou de tout autre élément contenant ces informations. La plupart du temps, il est créé manuellement pour créer différents rythmes et combinaisons, des versions de vitesses pour une carte audio.

Cependant, il peut être généré de manière procédurale à partir des données de fichiers audio.

Comment obtenir la vitesse pour correspondre au "point de battement"? Quand faire apparaître un objet?

Speed = Distance / Time.

Distance = Distance entre les points de création de GameObject et de "beat point".

Time =La longueur audio et la carte rythmique construite devraient être suffisantes. Avec ces informations, vous pouvez analyser les données audio / carte pour prédire quand un objet doit être généré pour atteindre le point exact. Maintenant, tout dépend du moment où vous voulez faire apparaître cet objet, si vous voulez qu'il soit très rapide après le frai, alors vous le ferez plus tard avec une grande vitesse. Si vous voulez qu'il soit à une vitesse normale, il faudra du temps pour atteindre le lecteur et l'audio a besoin de temps pour jouer au bon moment.

Vous pouvez même générer une nouvelle carte avec des horodatages pour les apparitions d'objets de battement pour une carte audio particulière. Vous devez faire des prédictions à un moment donné pour être en mesure de faire correspondre le rythme, pour le style le plus populaire, je dirais, pour prévoir de whenfaire apparaître l'objet pour qu'il se déplace avec certain speed. Celles-ci peuvent être faites en runtime, ou lues à partir d'un fichier calculé précédemment, ou enregistrées dans la RAM ...

Je suppose que les jeux comme ceux-ci Osun'ont pas cela Distance, ils ont juste le temps de réduire les cercles, bpm ... Les cartes sont généralement faites sur mesure. L'approche pour calculer les visuels dépend donc du style du jeu que vous créez également.

Donc, pour résumer tout, les valeurs sont interdépendantes. Cela dépend du nombre de battements que vous avez, de la distance entre le point d'apparition et le joueur, et dépend parfois des données fournies [certains jeux ont la vitesse de chaque battement et son apparence encodée dans un fichier de données créé manuellement]. Si vous le faites de manière procédurale, vous pouvez tout calculer en utilisant des données audio.

Candid Moon _Max_
la source