Czy Unity obsługuje istniejące Osie czasu?

13

Planuję opracowanie gry w Unity3D i staram się pogodzić z tym, co silnik już dostarczył, i tym, co sam muszę kodować.

Sama gra będzie grą rytmiczną, co oznacza synchronizowanie zdarzeń dźwiękowych i graficznych, aby zawsze grały, kiedy powinny. To, czego chcę uniknąć, to potencjalny scenariusz opóźnienia, w którym dźwięk lub grafika zaczynają się rozwijać szybciej niż inne.

Kiedy omawialiśmy ten rodzaj układu koordynacyjnego w mojej klasie projektowania gier na uniwersytecie, mój profesor nazwał ten typ projektu klasą „Oś czasu”. Chodzi o to, że możesz utworzyć jedną lub więcej z nich, aby robić postępy w różnym tempie, planować różne rzeczy w przyszłości i synchronizować okresowe zdarzenia. Jednak nazywanie tego „klasą osi czasu” wydaje się ograniczać do samego mojego profesora, ponieważ szukanie informacji o tym, czy niektóre funkcje API mają funkcję „osi czasu”, było bezowocnym przedsięwzięciem.

Czy jest jakaś bardziej popularna nazwa tego rodzaju funkcjonalności? Czy Unity ma jakieś wcześniej istniejące metody koordynowania planowania takich wydarzeń, czy też jest to coś, co należy wbudować w silnik? A jeśli tak, byłbym wdzięczny za wskazanie kilku samouczków!

Raven Dreamer
źródło
Użyłem również podobnych klas osi czasu (miały nawet tę samą nazwę). Bardziej powszechna nazwa wzorca jest mi nieznana, ale prawdopodobnie jest często implementowana za pomocą programowania funkcjonalnie reaktywnego, coroutines lub innych koncepcji asynchronicznych.
interphx

Odpowiedzi:

10

Chociaż ta funkcja nie jest dostępna w Unity, podstawowa implementacja takiej osi czasu nie powinna być zbyt trudna do wykonania.

Oto jak bym to zrobił:

  • Twój Timeline klasa wewnętrznie korzysta z pierwszeństwa-kolejkę jako danych strukturze do wydarzeń sklepowych.
  • Zdarzenie może być tylko czas i zwrotna. Więc dodanie wydarzenia na osi czasu będzie tak proste, jak: timeline.AddEvent(0.25f, MyCallback).
  • Za każdym razem Updateklasa osi czasu:

    1. Zwiększ głowicę (prostą float) o upływ czasu
    2. Sprawdź nagłówek kolejki priorytetowej i usuń i oddzwoń do wszystkich zdarzeń, które mają priorytet (np. Czas) mniejszy lub równy bieżącej głowicy odtwarzania.

Jeśli potrzebujesz funkcji przewijania do tyłu lub odtwarzania , oczywiście głupio byłoby usunąć wszystkie zdarzenia z kolejki (co oznacza, że ​​musiałbyś je dodać ponownie podczas przewijania). Zamiast tego możesz również użyć tablicy, która przechowuje twoje zdarzenia . Wydarzenie składałoby się z Timei Callback. Musisz posortować tablicę według Time.

Następnie zamiast usuwać elementy z tablicy, będziesz śledzić bieżący indeks tablicy , a przy każdej aktualizacji szukaj dalej tego indeksu i wykonuj wszystkie wywołania zwrotne, Playhead >= Timejednocześnie odpowiednio zwiększając indeks.

Wdrożenie większej prędkości odtwarzania działa z obiema implementacjami i byłoby tak proste, jak:

Playhead += Time.deltaTime * playbackSpeed
grzmot
źródło
2
„Zwiększyć głowicę (zwykłą liczbę zmiennoprzecinkową) o upływ czasu” - Jeśli to zrobisz, otrzymasz zagregowane błędy zmiennoprzecinkowe. Zamiast tego należy użyć funkcji Time.time (czas od rozpoczęcia gry) .
BlueRaja - Danny Pflughoeft
4

Nie, Unity3D nie ma takiego interfejsu API od razu po wyjęciu z pudełka.

Obsługuje jednak coroutines i sugeruję, abyś je zbadał. Korpusy ogólnie ułatwiają planowanie i synchronizowanie wydarzeń.

Nieważne
źródło
1

Nie jestem pewien, czy jest to nowe od czasu odpowiedzi w 2012 r., Ale Unity faktycznie obsługuje kontrolę osi czasu za pośrednictwem (Legacy) edytora animacji .

Chociaż ta funkcja jest przeznaczona głównie do animowania parametrów obiektu za pomocą krzywych, obejmuje ona możliwość wyzwalania skryptów w zdarzeniach animacji . Te skrypty mogą sterować twoją grafiką i dźwiękiem.

DMGregory
źródło