Apakah Unity memiliki dukungan yang ada untuk Garis Waktu?


13

Saya merencanakan pengembangan game di Unity3D, dan mencoba memahami apa yang sudah disediakan mesin, dan apa yang harus saya kode sendiri.

Gim itu sendiri akan menjadi gim ritme, yang berarti menyinkronkan peristiwa audio dan grafis sehingga mereka selalu bermain ketika seharusnya. Yang ingin saya hindari adalah skenario potensial dari lag di mana audio atau grafik mulai berkembang lebih cepat daripada yang lain.

Ketika kami membahas jenis sistem koordinasi ini di kelas desain game saya di universitas, profesor saya menyebut jenis desain ini kelas "Garis Waktu". Gagasannya adalah Anda dapat membuat satu atau lebih dari ini untuk berkembang pada tingkat yang berbeda, jadwalkan hal-hal yang akan terjadi di masa depan, dan selaraskan peristiwa berkala. Namun, menyebut ini sebagai "Timeline" sepertinya terbatas pada profesor saya sendiri, karena googling untuk apakah API tertentu memiliki fungsionalitas "Timeline" telah menjadi usaha yang sia-sia.

Apakah ada nama yang lebih umum untuk fungsi semacam ini? Apakah Unity memiliki metode yang sudah ada sebelumnya untuk mengoordinasikan penjadwalan acara seperti ini, atau apakah ini jenis hal yang perlu dibangun ke mesin? Dan jika itu terjadi, saya akan menghargai beberapa tutorial yang diarahkan!


Saya juga menggunakan kelas Timeline yang sama (mereka bahkan memiliki nama yang sama). Nama yang lebih umum untuk pola tersebut tidak saya ketahui, tetapi mungkin sering diimplementasikan melalui pemrograman fungsional-reaktif, coroutine atau konsep asinkron lainnya.
interphx

Jawaban:


10

Meskipun fungsi ini tidak tersedia di Unity, implementasi dasar dari timeline seperti itu seharusnya tidak terlalu sulit untuk dilakukan.

Begini cara saya melakukannya:

  • Kelas Timeline Anda secara internal menggunakan antrian prioritas sebagai struktur data untuk menyimpan acara.
  • Suatu peristiwa bisa menjadi waktu dan panggilan balik. Jadi menambahkan acara ke timeline akan sesederhana: timeline.AddEvent(0.25f, MyCallback).
  • Dengan setiap Update, kelas waktu akan:

    1. Tambahkan playhead (sederhana float) pada waktu yang telah berlalu
    2. Periksa kepala antrian prioritas dan hapus dan panggil panggilan balik dari semua peristiwa yang memiliki prioritas (mis. Waktu) lebih kecil atau sama dengan playhead saat ini.

Jika Anda memerlukan semacam fungsi rewind atau replay , tentu bodoh jika menghapus semua acara dari antrian (artinya Anda harus menambahkannya lagi ketika rewound). Alih-alih, Anda juga bisa menggunakan larik yang menampung acara Anda . Suatu acara akan terdiri dari a Timedan Callback. Anda harus menjaga array Anda diurutkan berdasarkan Time.

Kemudian alih-alih menghapus item dari array, Anda akan melacak indeks-array saat ini , dan dengan setiap pembaruan mencari di depan dari indeks itu dan menjalankan semua panggilan balik dengan Playhead >= Timesementara juga meningkatkan indeks sesuai.

Menerapkan kecepatan pemutaran yang lebih cepat berfungsi dengan kedua implementasi dan akan sesederhana:

Playhead += Time.deltaTime * playbackSpeed

2
"Menambah playhead (pelampung sederhana) pada waktu yang telah berlalu" - Jika Anda melakukan ini, Anda akan mendapatkan agregat kesalahan floating-point. Anda harus menggunakan Time.time (waktu sejak game dimulai) sebagai gantinya.
BlueRaja - Danny Pflughoeft

4

Tidak, Unity3D tidak memiliki API seperti itu di luar kotak.

Itu memang mendukung coroutine, dan saya sarankan Anda melihatnya. Coroutine umumnya membuat penjadwalan dan sinkronisasi acara sangat mudah.


1

Saya tidak yakin apakah ini baru sejak jawaban pada 2012, tetapi Unity sebenarnya memiliki dukungan untuk kontrol waktu melalui Editor Animasi (Legacy) .

Meskipun fitur ini dimaksudkan terutama untuk menganimasi parameter objek dengan kurva, ini mencakup kemampuan untuk memicu skrip pada Acara Animasi . Script ini dapat mengarahkan grafis dan audio Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.