Cara menyinkronkan game dengan musik

10

Anda mungkin akrab dengan permainan ryhtm seperti Dancing Line , Geometry Dash , atau bahkan Guitar Hero . Mereka memiliki kesamaan: setiap aksi dalam game disinkronkan dengan musik. Tujuan saya adalah membuat permainan seperti Geometry Dash di mana pemain harus melakukan beberapa aksi dalam ritme sementara karakter bergulir secara otomatis di tingkat. Saya punya beberapa pertanyaan tentang jenis permainan ini:

  • Apakah saya harus menjaga FPS saya konstan karena harus selalu disinkronkan dengan musik?
  • Bagaimana saya bisa membangun level saya dengan musik dalam pikiran untuk memastikan bahwa itu akan disinkronkan?

Saya mengerjakan Unity menggunakan C #.

Shashimee
sumber

Jawaban:

18

Saya tidak merekomendasikan menggunakan Time.deltaTime untuk melacak kemajuan melalui memainkan lagu seperti yang dijelaskan dalam jawaban lain.

Ini bagus untuk menghaluskan & menambahkan efek interpolasi secara realtime, tetapi ketika Anda ingin mencocokkan waktu lagu Anda harus meminta lagu.

Di Unity, Anda dapat mengukur kemajuan Sumber Audio dengan memainkan trek secara langsung menggunakan AudioSource.timeatau AudioSource.timeSamplesuntuk mendapatkan posisi playhead yang tepat. (Perhatikan bahwa yang terakhir mengukur dalam sampel, yang dapat bervariasi dalam tingkat per detik tergantung pada bagaimana Anda telah mengompresi trek Anda)

Dengan cara ini, Anda tidak perlu menjalankan timer terpisah Anda sendiri dan berharap mereka tetap sinkron. Anda dapat memasang pemicu game efek pencocokan beat untuk kabur dari timeline lagu itu sendiri.

Untuk menyaring suara gameplay ke musik, Anda dapat menggunakan AudioSource.PlayScheduled untuk memastikan suara Anda tepat sesuai irama, karena bahkan ketidakcocokan kecil dapat diperhatikan

DMGregory
sumber
Adakah cara untuk menyinkronkan grafik ke AudioSource? Saya ingin menunjukkan ledakan atau tabrakan yang terhubung ke musik. Saya ingin menunjukkannya tepat ketika suara diputar.
syabro
Itulah semua jawaban di sini. Apakah Anda menemukan masalah dalam menerapkan saran dalam jawaban ini, @syabro?
DMGregory
2

Sebagai alternatif jika Anda baik-baik saja dengan tidak bekerja dari awal.

Sudah ada aset siap pakai (di bawah Ekstensi Editor / Audio seperti https://www.assetstore.unity3d.com/en/#!/content/54639 (berbayar) atau https://www.assetstore.unity3d.com/en / #! / content / 39835 (gratis)) tempat Anda dapat menyinkronkan trek musik ke acara. Dalam contoh itu senjata menembak dengan irama musik.

Jika Anda ingin mempelajari cara kerjanya, cobalah 1-2 yang gratis dan lihat sumbernya.

Zibelas
sumber
Saya melihat presentasi dari ahli koreografi beberapa waktu lalu - tampak seperti teknologi hebat! Pada saat itu kemampuan analisis audionya terbatas, tetapi jika Anda tahu sebelumnya trek yang sedang Anda kerjakan, Anda dapat menggunakan teknologi tersebut untuk menjadwalkan acara game dengan tepat untuk ketukan / momen tertentu dalam musik. Saya tidak tahu apakah mereka telah menambahkan kemampuan untuk melakukan lebih banyak analisis secara otomatis sejak demo itu.
DMGregory
1

Unity sudah memisahkan gameplay dari framerate. Jika Anda ingat untuk selalu menggunakan Time.deltaTimedalam fungsi Perbarui Anda, framerate grafik yang sebenarnya tidak akan mempengaruhi kecepatan gameplay. Jadi ketika Anda memulai gim dan trek audio pada saat yang sama, mereka harus tetap disinkronkan.

Mengenai tingkat perancangan di sekitar musik, ada dua pendekatan:

  • Pendekatan manual. Tingkat kerajinan tangan yang cermat di sekitar trek audio tertentu. Memiliki lembaran musik asli dapat membantu, tetapi juga memungkinkan untuk melakukannya hanya dengan telinga.
  • Pendekatan prosedural. Gunakan algoritma analisis audio untuk menghasilkan level di sekitar trek audio secara otomatis. Yang paling sederhana adalah dengan hanya mencari lonjakan volume. Itu seharusnya sudah memungkinkan Anda untuk mengidentifikasi ketukan drum di banyak lagu dan menimbulkan hambatan yang sesuai. Langkah selanjutnya adalah mendeteksi perpindahan volume secara terpisah dalam spektrum frekuensi yang berbeda. Ini membuat deteksi ketukan menjadi lebih andal dan memungkinkan Anda untuk menelurkan berbagai rintangan untuk pitch yang berbeda. Tapi itu masih menggores permukaan saja. Analisis audio adalah bidang yang sangat luas dan menarik. Orang-orang menulis banyak literatur ilmiah tentangnya.

    Seberapa dalam Anda perlu terjun ke bidang ini tergantung pada seberapa ambisi Anda. Beberapa game puas dengan hanya mendeteksi ketukan dan secara acak-menghasilkan semua sisa desain tingkat ( Crypt of the Necrodancer ). Lainnya mencoba menempatkan sebanyak mungkin aspek desain level di bawah kendali audio yang mereka bisa ( Audiosurf ).

Banyak permainan ritme menggunakan pendekatan hybrid. Anda menghasilkan draf pertama tingkat menggunakan generator dan kemudian men-tweak dengan tangan untuk membuatnya lebih bisa dimainkan.

Philipp
sumber
Terima kasih atas jawaban Anda, saya akan memeriksanya! Apakah Time.deltaTime benar-benar tepat dan tidak akan ada jeda waktu yang dibuat dengan musik lama?
Shashimee
@Shashimee Seharusnya cukup tepat. Jika Anda ingin benar-benar yakin untuk tidak kehilangan apa pun untuk menyelesaikan perbedaan, gunakan Time.timesaja.
Philipp
Saya akan merekomendasikan pendekatan prosedural karena membuka lebih banyak kemungkinan untuk dikembangkan. Pemain dapat menambahkan trek mereka sendiri, Anda dapat mengubah jala dan semua hal lainnya ke irama, seperti partikel. Juga, Anda tidak akan menghabiskan waktu terlalu banyak untuk merancang level.
Candid Moon _Max_
1
@Philipp sayangnya Time.time dapat menjadi lebih rentan terhadap ketidaktepatan jika permainan telah berjalan beberapa saat . Karena ini mengukur waktu permainan sejak startup, daripada sejak awal trek atau awal level, setelah memainkan satu atau dua lagu, ia akan kehilangan presisi serendah bit sebagai jumlah delta yang naif, dan kesalahannya dapat terus meningkat jika permainan dibiarkan berjalan / tidur-dipulihkan berulang kali.
DMGregory
0

Sangat umum adalah pendekatan untuk memiliki "beat map". Setiap jenis data yang mewakili ketukan dalam lagu. Itu bisa berupa tekstur, datafile atau apa pun yang menyimpan informasi itu. Sebagian besar waktu itu dibuat secara manual untuk membuat berbagai ketukan dan kombinasi, versi kecepatan untuk peta audio.

Itu dapat dihasilkan secara prosedural dari data file audio.

Bagaimana cara mendapatkan kecepatan agar sesuai dengan "beat point"? Kapan harus menelurkan objek?

Speed = Distance / Time.

Distance = Jarak antara titik-titik penciptaan GameObject dan dari "beat point".

Time =Panjang audio dan beat beat yang dibangun harus cukup. Dengan informasi ini, Anda dapat menganalisis data audio / peta untuk memprediksi kapan suatu objek harus dihasilkan untuk mencapai titik yang tepat. Sekarang semuanya tergantung pada kapan Anda ingin menelurkan objek itu, jika Anda ingin sangat cepat setelah bertelur, maka Anda menelurkannya nanti dengan kecepatan tinggi. Jika Anda ingin berada pada kecepatan normal - maka perlu waktu untuk mencapai pemain dan audio membutuhkan waktu untuk bermain di saat yang tepat.

Anda bahkan dapat membuat peta baru dengan prangko waktu untuk memunculkan objek beat untuk peta audio tertentu. Anda harus membuat beberapa prediksi pada suatu titik untuk dapat menyamai ketukan, untuk gaya paling populer, saya katakan, untuk memprediksi whenuntuk menelurkan objek untuk bergerak dengan pasti speed. Itu dapat dibuat dalam runtime, atau dibaca dari beberapa file yang dihitung sebelumnya, atau disimpan dalam RAM ...

Saya berasumsi game seperti Osutidak punya ini Distance, mereka hanya punya waktu menyusut lingkaran, bpm ... Peta umumnya dibuat khusus. Jadi pendekatan untuk menghitung visual tergantung pada gaya permainan yang Anda buat juga.

Jadi untuk meringkas semuanya, nilainya saling tergantung. Tergantung pada berapa banyak ketukan yang Anda miliki, pada jarak antara titik spawn dan pemain, dan kadang-kadang tergantung pada data yang disediakan [beberapa game memiliki kecepatan setiap ketukan dan tampilannya dikodekan dalam beberapa file data yang dibuat secara manual]. Jika Anda melakukannya dengan cara prosedural, maka Anda dapat menghitung semuanya pada dasarnya dengan menggunakan data audio.

Candid Moon _Max_
sumber