Teknik yang baik untuk menyinkronkan tindakan gameplay ke waktu animasi tertentu?

10

Jadi saya telah menemukan masalah dalam permainan yang sedang saya kerjakan, tetapi tampaknya hal yang cukup mendasar yang mungkin muncul dalam banyak permainan.

Gim saya mengharuskan beberapa fungsi permainan terjadi pada titik waktu yang sangat spesifik selama animasi karakter. Jadi, seperti judulnya, saya bertanya-tanya apa saja teknik dan strategi fundamental yang baik untuk menyinkronkan peristiwa / fungsi / aksi yang terkait dengan gameplay ke titik-titik tertentu dalam animasi karakter.

Berikut adalah beberapa contoh sederhana dari apa yang saya bicarakan di berbagai jenis permainan:

  • Karakter Anda mengisi ulang senjata mereka dalam penembak . Karakter Anda memainkan animasi 'reload' nya, tetapi penting bahwa fungsi yang mengatur variabel currentAmmo hanya dipanggil pada saat yang tepat setelah majalah ditukar dan pistol dimiringkan. Ini mungkin beberapa titik di tengah animasi ulang.

  • Dalam RPG berbasis giliran karakter Anda berdiri dalam garis menghadap garis musuh. Ketika diperintahkan untuk menyerang, salah satu karakter Anda berlari / melompat ke salah satu musuh dan menebas pedang raksasa mereka sebelum berlari / melompat kembali ke tempat mereka berdiri. Anda ingin memastikan bahwa musuh rusak pada saat yang tepat ketika animasi pemotongan dimainkan - beberapa titik antara berlari dan berlari kembali.

  • Dalam permainan sembunyi - sembunyi , karakter Anda dapat menyelinap dan berinteraksi dengan komputer dan tombol di dunia. Mungkin ada tombol yang mematikan catu daya ke lampu pos yang Anda infiltrasi. Saat tombol aksi ditekan, karakter Anda menjangkau dan menekan tombol lalu kembali ke posisi diam. Anda ingin lampu dimatikan pada titik yang tepat dalam animasi 'push_button' ketika tombol ditekan.

Diakui, kasus khusus saya paling seperti contoh kedua , di mana saya telah membuat animasi di mana karakter berbasis giliran saya menerjang maju selama serangan dan saya ingin kerusakan diterapkan pada saat yang tepat bahwa animasi tampaknya membuat kontak . Karena permainan saya menggunakan sistem berbasis giliran (bayangkan sesuatu seperti Final Fantasy atau Fire Emblem) saya ingin kerusakan / penyembuhan / sihir / dll. untuk diterapkan pada waktu yang tepat selama setiap animasi karakter walaupun saya sebenarnya tidak menggunakan tabrakan / hitbox.

Saya harus menyebutkan bahwa saya membuat game saya di mesin permainan yang populer, dan bahwa saat ini saya sedang menangani ini dengan menggunakan acara animasi mereka atau memberitahukan untuk mencapai sesuatu yang mendekati hasil yang diinginkan - karakter saya melakukan perintah tertentu dan memicu sebuah animasi khusus-perintah (yaitu: 'attack_command') dan aset animasi untuk masing-masing perintah saya harus menyertakan acara animasi / beri tahu 'panggilan balik' ke dalam karakter saya, fungsi ExecuteCommand. Dengan kata lain - karakter memberitahu animasi serangan untuk dimainkan, dan kemudian animasi serangan memancarkan suatu peristiwa / memberitahukan callback ke dalam karakter pada saat yang tepat selama animasi ketika kerusakan harus ditangani.

Jujur, ini bekerja untuk saat ini, tetapi rasanya salah - seperti saya kehilangan beberapa bagian dari gambar yang lebih besar di sini! Sebagian alasan mengapa metode ini terasa salah adalah karena memasangkan logika permainan dengan aset animasi; jika aset animasi saya lupa untuk menyertakan event / panggilan balik ExecuteCommand (), perintah tidak akan dijalankan dengan benar dan kode tambahan diperlukan untuk memeriksa apakah animasi perintah selesai tanpa menjalankan perintah. Ini berantakan dan itu berarti bahwa permainan saya memiliki ketergantungan aneh pada asetnya. Tentu saja saya ingin kerusakan terjadi pada titik tertentu selama animasi serangan saya, tetapi saya merasa sangat aneh memanggil kode gameplay di dalam aset animasi ..

Jadi apa yang saya abaikan di sini? Apa beberapa teknik umum yang baik untuk menangani jenis situasi ini di mana Anda ingin aksi gameplay penting tertentu terjadi pada waktu tertentu selama animasi?

Sunting: Untuk memperjelas, ini bukan pertanyaan khusus mesin atau saya juga mencari desain / teknik khusus mesin. Saya tertarik dengan teknik sinkronisasi animasi / gameplay umum yang mungkin digunakan dalam proyek game Anda terlepas dari teknologi yang digunakan.

MrKatSwordfish
sumber
1
Saya bingung. Anda mengatakan Anda ingin permainan tergantung pada waktu animasi, tetapi kemudian mengatakan Anda tidak ingin permainan Anda bergantung pada aset Anda, dan animasi adalah jenis aset. Bagaimana Anda berharap semua harapan itu kompatibel?
Anko
Saya ingin beberapa elemen gameplay disinkronkan dengan animasi. Namun, sinkronisasi antara dua hal tidak selalu menyiratkan ketergantungan, bukan? Saya tertarik pada beberapa teknik yang digunakan orang untuk menyinkronkan animasi mereka dengan gameplay mereka. Saya mengatakan apa yang saya coba dan apa yang saat ini saya lakukan untuk mencapai ini - dan pertanyaan saya adalah, apakah ada teknik berbeda / lebih baik / alternatif yang mungkin digunakan atau ini (acara animasi / pemberitahuan / panggilan balik dimasukkan ke dalam aset) cara standar? Apakah ini yang Anda gunakan dalam proyek Anda?
MrKatSwordfish

Jawaban:

5

Untuk sinkronisasi, Anda perlu memutuskan siapa (kode, animasi, atau tidak satu pun) yang merupakan otoritas waktu — "beat" yang "ditarikan" oleh semua orang.

Pengaturan yang berbeda sesuai dengan permainan yang berbeda:

  • Animasi adalah otoritas waktu (pengaturan Anda saat ini)

    Kode game dapat memicu animasi. Ketika animasi mencapai titik-titik tertentu, mereka meningkatkan peristiwa (mis. Reload dilakukan) yang mungkin bereaksi terhadap kode game (mis. Set ulang amunisi yang tersedia).

    Jika waktu yang tepat dari animasi (terlepas dari kondisi permainan) adalah bagian penting dari permainan Anda, atau Anda secara khusus ingin animator Anda mengontrol waktu, pertimbangkan pendekatan ini.

    Alat animasi Blender (3D) dan Spine (2D) memungkinkan animator untuk menentukan peristiwa yang dapat diikuti oleh kode gim.

  • Kode adalah otoritas waktu

    Inverse of the above: Kejadian yang terjadi di dunia game (misalnya pemain memilih untuk memuat ulang senjatanya) menyebabkan animasi untuk dijalankan dan melewati parameter (misalnya waktu sampai memuat ulang harus selesai). Setiap animasi menggunakan parameter yang disediakan untuk memodifikasi tampilannya (misalnya menjalankan animasi pada kecepatan yang sesuai sehingga "bagian yang dimuat kembali" terjadi ketika ditentukan).

    Animasi mungkin juga mendengarkan acara permainan (mis. Pemain membatalkan pemuatan ulang atau pemain berjongkok saat memuat ulang) dan memodifikasi tampilan mereka sesuai dengan itu.

    Jika animasi Anda mampu menjadi fleksibel tentang penentuan waktu, permainan Anda sangat bergantung pada konten yang dihasilkan secara prosedural, atau Anda secara khusus ingin programmer Anda mengontrol waktu, pertimbangkan pendekatan ini.

    Pertumbuhan berlebih animasi karakter 's sebagian besar terstruktur dengan cara ini: David Rosen menjelaskan hal itu dalam bukunya GDC 14 bicara (lihat khususnya Gerakan dan Gerakan Lanjutan segmen).

  • Waktu implisit (otoritas eksternal)

    Dalam permainan ritme atau situasi lain di mana pengaturan waktu dikontrol dari sumber eksternal (dalam permainan ritme, irama trek musik), mungkin masuk akal untuk memodelkan hal-hal seperti itu. Kode permainan dan animasi dapat membaca stempel waktu global dan status permainan, lalu berperilaku sesuai tanpa komunikasi.

    Jika keadaan gim dan animasi Anda sebagian besar bergantung pada otoritas waktu eksternal, pertimbangkan pendekatan ini.

Tentu saja Anda mungkin ingin menggunakan pendekatan berbeda untuk sistem yang berbeda di gim Anda. (Misalnya, permainan ritme sering menggunakan ketukan lagu sebagai otoritas eksternal, tetapi animasi masih mendengarkan acara interaksi pemain untuk membatalkan atau mengubah tampilan catatan yang dipegang.)

Anko
sumber
0

Saya telah membaca di suatu tempat bahwa hampir semua masalah perhitungan dapat diselesaikan dengan lapisan abstraksi tambahan, dan saya tidak melihat kasus Anda menjadi berbeda.

Untuk persyaratan ini, saya biasanya melihat layer untuk mengontrol keadaan karakter. Dengan cara ini karakter akan memiliki Animasi saat ini dan Status saat ini. Masing-masing dengan tanggung jawabnya sendiri.

Animasi hanya bertanggung jawab untuk visual, dan negara bagian menangani logika permainan khusus untuk tindakan itu.

Dalam game pertarungan saya, negara adalah objek yang mewarisi dari kelas BaseState dan memiliki metode Pembaruan (). Setiap karakter memiliki kumpulan status, tetapi hanya satu yang dapat ditugaskan pada suatu waktu. Dan metode Pembaruan () dari kondisi saat ini disebut sekali per frame.

Itu ada di dalam Pembaruan () dari kondisi di mana saya melakukan semua logika itu: atur kecepatan karakter pada bingkai tertentu, peningkatan / penurunan kesehatan dll.

Emir Lima
sumber