Unity'nin Zaman Çizelgeleri için mevcut desteği var mı?


13

Unity3D'de bir oyunun geliştirilmesini planlıyorum ve motorun zaten sağladıkları ve kendimi kodlamam gereken şeylerle anlaşmaya çalışıyorum.

Oyunun kendisi bir ritim oyunu olacak, yani ses ve grafik olaylarını senkronize etmeleri gerekiyor, böylece her zaman istedikleri zaman çalıyorlar. Kaçınılması gereken şey, sesin veya grafiklerin diğerinden daha hızlı ilerlemeye başladığı potansiyel bir gecikme senaryosudur.

Üniversitede oyun tasarımı dersimde bu tür bir koordinasyon sistemini tartıştığımızda, profesörüm bu tip tasarımı "Zaman Çizelgesi" dersi olarak adlandırdı. Fikir, bunlardan birini veya daha fazlasını farklı oranlarda ilerlemek, gelecekte olacakları planlamak ve periyodik olayları senkronize etmek için başlatabileceğinizdir. Bununla birlikte, buna "Zaman Çizelgesi" dersi vermek, belirli bir API'nin "Zaman Çizelgesi" işlevselliğinin sonuçsuz bir çaba olup olmadığını araştırmak olarak profesörümle sınırlı görünmektedir.

Bu tür işlevsellik için daha yaygın bir isim var mı? Unity, bu gibi olayların zamanlamasını koordine etmek için önceden var olan yöntemlere sahip mi, yoksa bu motora inşa edilmesi gereken bir şey mi? Ve eğer öyleyse, bazı eğiticilere yönlendirilmeyi takdir ediyorum!


Ben de benzer Timeline sınıfları kullandım (hatta aynı adı vardı). Model için daha yaygın bir isim bilinmemektedir, ancak muhtemelen fonksiyonel reaktif programlama, coroutines veya diğer asenkron kavramlarla uygulanır.
interphx

Yanıtlar:


10

Bu işlevsellik Unity'de mevcut olmasa da, böyle bir zaman çizelgesinin temel bir uygulamasının yapılması çok zor olmamalıdır.

İşte bu konuda:

  • Kişisel Zaman Çizelgesi sınıf dahili olarak kullanan bir öncelikli sırayı mağaza olaylara veri yapısı olarak.
  • Bir olay sadece bir zaman ve geri arama olabilir. : Yani zaman çizelgesine eklenmesi olaylar olarak basit olarak olurdu timeline.AddEvent(0.25f, MyCallback).
  • Hepsiyle Update biriyle, zaman çizelgesi sınıfı:

    1. Oynatma kafasını artırma (basit float ) geçen süreye kadar artırın
    2. Öncelik sırasının başlığını kontrol edin ve önceliği (örneğin zaman) geçerli oynatma kafasına eşit veya daha küçük olan tüm olayların geri çağrısını kaldırın ve çağırın.

Bir çeşit geri sarma veya yeniden oynatma işlevine ihtiyacınız varsa , elbette tüm olayları kuyruktan kaldırmak aptalca olur (yani geri sardığınızda bunları tekrar eklemeniz gerekir). Bunun yerine etkinliklerinizi tutan bir dizi de kullanabilirsiniz . Bir olay bir Timeve öğesinden oluşur Callback. Dizinizi sıralama ölçütü olarak saklamanız gerekir Time.

Ardından, öğeleri diziden kaldırmak yerine, geçerli dizi dizinini izler ve her güncellemede bu dizinden ileriye doğru arama yapar ve tüm geri aramaları Playhead >= Timeyürütürken, dizini buna göre artırır.

Daha hızlı bir oynatma hızı uygulamak her iki uygulamada da çalışır ve aşağıdaki kadar basit olacaktır:

Playhead += Time.deltaTime * playbackSpeed

2
"Oynatma kafasını (basit bir şamandıra) geçen süreye kadar artır" - Bunu yaparsanız toplu kayan nokta hataları alırsınız. Bunun yerine Time.time (oyunun başlamasından bu yana geçen süre) kullanmalısınız.
BlueRaja - Danny Pflughoeft

4

Hayır, Unity3D'nin kutudan çıktığı gibi bir API'si yok.

Bununla birlikte, programları destekler ve onlara bakmanızı öneririm. Ortak programlar genellikle olayları zamanlamayı ve senkronize etmeyi gerçekten kolaylaştırır.


1

Bunun 2012'deki yanıtlardan bu yana yeni olup olmadığından emin değilim, ancak Unity aslında (Eski) Animasyon Düzenleyicisi aracılığıyla zaman çizelgesi kontrolünü destekliyor .

Bu özellik esas olarak nesne parametrelerini eğrilerle canlandırmak için tasarlanmış olsa da, Animasyon Olayları'nda komut dosyalarını tetikleme yeteneğini içerir . Bu komut dosyaları grafiklerinizi ve sesinizi yönlendirebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.