Come sincronizzare un gioco con la musica


10

Potresti avere familiarità con i giochi ritmici come Dancing Line , Geometry Dash o Guitar Hero . Hanno qualcosa in comune: ogni singola azione nel gioco è sincronizzata con la musica. Il mio scopo è quello di creare un gioco come Geometry Dash in cui il giocatore deve compiere alcune azioni in ritmo mentre il personaggio scorre automaticamente nel livello. Ho alcune domande su questo tipo di gioco:

  • Devo mantenere costante il mio FPS in quanto deve essere sempre sincronizzato con la musica?
  • Come posso costruire i miei livelli pensando a una musica per assicurarmi che sia sincronizzata?

Sto lavorando su Unity usando C #.

Risposte:


18

Non consiglio di usare Time.deltaTime per tenere traccia dei progressi durante la riproduzione del brano come descritto in un'altra risposta.

È ottimo per gli effetti di levigatura e interpolazione da riprodurre in tempo reale, ma quando vuoi abbinare il tempo della canzone dovresti chiedere alla canzone.

In Unity, è possibile misurare i progressi di una sorgente audio riproducendo direttamente una traccia utilizzando AudioSource.timeo AudioSource.timeSamplesper ottenere la posizione precisa della testina. (Nota che quest'ultimo misura in campioni, che possono variare in frequenza al secondo a seconda di come hai compresso la tua traccia)

In questo modo, non è necessario eseguire il proprio timer separato e sperare che rimangano sincronizzati. Puoi collegare i trigger di gioco degli effetti di corrispondenza dei battiti per scappare dalla sequenza temporale della canzone.

Per stratificare i suoni di gameplay sulla musica, puoi utilizzare AudioSource.PlayScheduled per garantire che i tuoi suoni arrivino esattamente al ritmo, poiché si può notare anche una piccola discrepanza


Qualche idea su come sincronizzare la grafica con AudioSource? Vorrei mostrare un'esplosione o una collisione legata alla musica. Voglio mostrarlo esattamente quando viene riprodotto il suono.
Syabro,

Ecco a cosa servono tutte le risposte qui. Hai riscontrato problemi nel mettere in pratica i suggerimenti di queste risposte, @syabro?
DMGregory

2

In alternativa se stai bene non lavorando da zero.

Esistono già risorse già pronte (sotto Editor Extensions / Audio come https://www.assetstore.unity3d.com/en/#!/content/54639 (a pagamento) o https://www.assetstore.unity3d.com/en / #! / content / 39835 (gratuito)) in cui è possibile sincronizzare i brani musicali all'evento. In quell'esempio l'arma sta sparando al ritmo della musica.

Se vuoi imparare come funzionano, prova 1-2 di quelli gratuiti e guarda la fonte.


Ho visto una presentazione degli sviluppatori Koreographer un po 'di tempo fa: sembrava un grande pezzo di tecnologia! All'epoca le sue capacità di analisi audio erano limitate, ma se avessi saputo in anticipo la traccia con cui stai lavorando, potresti utilizzare la tecnologia per programmare in modo molto preciso gli eventi di gioco su battute / momenti specifici della musica. Non so se hanno aggiunto la possibilità di fare automaticamente più analisi da quella demo.
DMGregory

1

Unity disaccoppia già il gameplay dal framerate. Se ricordi di utilizzare sempre Time.deltaTimele funzioni di aggiornamento, il framerate grafico effettivo non dovrebbe influire sulla velocità di gioco. Quindi, quando avvii il gioco e la traccia audio contemporaneamente, dovrebbero rimanere sincronizzati.

Per quanto riguarda la progettazione di livelli intorno alla musica, ci sono due approcci:

  • L'approccio manuale. Livelli meticolosamente realizzati a mano attorno a tracce audio specifiche. Avere a portata di mano gli spartiti originali può aiutare, ma è anche possibile farlo solo a orecchio.
  • L'approccio procedurale. Utilizza algoritmi di analisi audio per generare automaticamente livelli attorno alle tracce audio. Il più semplice è cercare picchi di volume. Ciò dovrebbe già consentire di identificare i ritmi di batteria in molte canzoni e generare di conseguenza ostacoli. Un ulteriore passo è rilevare gli spostamenti di volume separatamente in diversi spettri di frequenza. Ciò rende il rilevamento delle battute più affidabile e consente di generare diversi ostacoli per diverse tonalità. Ma questo sta ancora graffiando la superficie. L'analisi audio è un campo molto ampio e interessante. La gente ha scritto molta letteratura scientifica al riguardo.

    Quanto in profondità devi immergerti in questo campo dipende da quanto sei ambizioso. Alcuni giochi sono soddisfatti del solo rilevamento dei battiti e generano in modo casuale tutto il resto del design del livello ( Crypt of the Necrodancer ). Altri cercano di mettere il maggior numero possibile di aspetti del design di livello sotto il controllo dell'audio ( Audiosurf ).

Molti giochi ritmici usano un approccio ibrido. Generi una prima bozza del livello usando un generatore e poi lo modifichi a mano per renderlo più giocabile.


Grazie per la tua risposta, ci penserò su! Time.deltaTime è davvero preciso e non ci sarà alcun ritardo creato con musiche lunghe?
Shashimee,

@Shashimee Dovrebbe essere abbastanza preciso. Se vuoi essere davvero sicuro di non perdere nulla per arrotondare le differenze, usa Time.timeinvece.
Philipp

Consiglierei l'approccio procedurale perché apre molte più possibilità allo sviluppo del gioco. I giocatori possono aggiungere le proprie tracce, puoi cambiare mesh e tutte le altre cose al ritmo, come le particelle. Inoltre, non passerai un sacco di tempo a progettare livelli.
Candid Moon _Max_

1
@Philipp sfortunatamente Time.time può essere ancora più suscettibile all'imprecisione se il gioco dura da un po ' . Dato che misura il tempo di gioco dall'inizio, piuttosto che dall'inizio della traccia o l'inizio del livello, dopo aver suonato una canzone o due, avrà perso tanti bit di precisione bassi come una somma ingenua di delta, e l'errore può continua ad aumentare se il gioco viene lasciato in esecuzione / dormito ripetutamente.
DMGregory

0

Molto comune è l'approccio per avere una "beat map". Qualsiasi tipo di dato che rappresenta i battiti della canzone. Può essere una trama, un file di dati o qualsiasi altra cosa che contenga tali informazioni. Il più delle volte viene creato manualmente per creare battute e combinazioni diverse, versioni di velocità per una mappa audio.

Tuttavia, può essere generato proceduralmente dai dati dei file audio.

Come ottenere la velocità corrispondente al "punto di battuta"? Quando generare un oggetto?

Speed = Distance / Time.

Distance = Distanza tra i punti di creazione di GameObject e di "beat point".

Time =La lunghezza dell'audio e la beat map costruita dovrebbero essere sufficienti. Con queste informazioni è possibile analizzare i dati di audio / mappa per prevedere quando un oggetto deve essere generato per raggiungere il punto esatto. Ora tutto dipende da quando vuoi spawnare quell'oggetto, se vuoi che sia molto veloce dopo la spawn, quindi lo spawn in seguito con grande velocità. Se vuoi che sia a una velocità normale, allora avrà bisogno di tempo per raggiungere il lettore e l'audio ha bisogno di tempo per suonare al momento giusto.

Puoi persino generare una nuova mappa con timestamp per la generazione di oggetti beat per una particolare mappa audio. Devi fare delle previsioni ad un certo punto per riuscire ad abbinare il ritmo, per lo stile più popolare, direi, per prevedere whendi generare l'oggetto affinché si muova con certezza speed. Questi possono essere fatti in runtime, o letti da alcuni file calcolati in precedenza, o salvati nella RAM ...

Suppongo che giochi come questi Osunon abbiano questo Distance, hanno solo il tempo di restringimento dei cerchi, bpm ... Le mappe sono generalmente personalizzate. Quindi l'approccio per calcolare gli elementi visivi dipende anche dallo stile del gioco che stai realizzando.

Quindi per riassumere tutto, i valori sono interdipendenti. Dipende da quanti battiti hai, dalla distanza tra il punto di spawn e il giocatore, e talvolta dipende dai dati forniti [alcuni giochi hanno la velocità di ogni battuta e il suo aspetto codificato in alcuni file di dati creati manualmente]. Se lo stai facendo in modo procedurale, puoi calcolare tutto sostanzialmente usando i dati audio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.