Чи існує у Unity підтримка строків?


13

Я планую розробку гри в Unity3D і намагаюся примиритися з тим, що вже надав двигун, і що я повинен кодувати сам.

Сама гра буде ритм-грою, що означає синхронізацію аудіо та графічних подій, щоб вони завжди грали, коли їм належить. Те, чого я хочу уникати, - це потенційний сценарій відставання, коли звук або графіка починають просуватися швидше, ніж інші.

Коли ми обговорювали такий тип системи координації в моєму класі ігрового дизайну ще в університеті, мій професор назвав цей тип дизайну класом "Хронологія". Ідея полягає в тому, що ви можете спонукати один або декілька з них прогресувати різними темпами, планувати щось, що може відбуватися в майбутньому, і синхронізувати періодичні події. Однак, називаючи це класом "Хронологія", схоже, обмежилося саме мого професора, як гуглінг щодо того, чи є певна функція API функціональності "Хронологія" безрезультатною.

Чи існує ще якась загальна назва для цього виду функціональності? Чи є у Unity якісь раніше існуючі методи для координації планування таких подій, чи це така штука, яку потрібно вбудовувати в двигун? І якщо це станеться, я був би вдячний, щоб його вказали на деякі підручники!


Я також використовував подібні класи Timeline (вони навіть мали таку саму назву). Більш поширена назва шаблону мені невідома, але вона, ймовірно, часто реалізується за допомогою функціонально-реактивного програмування, підпрограм або інших асинхронних концепцій.
interphx

Відповіді:


10

Хоча ця функція недоступна в Unity, базову реалізацію такої часової шкали робити не слід занадто складно.

Ось як я б це зробив:

  • Ваш Timeline клас внутрішньо використовує пріоритет чергу в якості структури даних для зберігання подій.
  • Подія може бути просто час і на зворотний дзвінок. Таким чином , додавання подій в шкалі часу буде настільки ж просто , як: timeline.AddEvent(0.25f, MyCallback).
  • З кожним Updateкласом часової шкали:

    1. Збільшити відтворення (простий float) за минулий час
    2. Перевірте заголовок черги пріоритетів і видаліть та викличте зворотний виклик усіх подій, які мають пріоритет (наприклад, час), менший або рівний поточному відтворення.

Якщо вам потрібна якась функція перемотування або повторного перегляду , звичайно було б нерозумно видаляти всі події з черги (це означає, що вам доведеться додати їх знову при перемотуванні). Натомість ви також можете використовувати масив, який зберігає ваші події . Подія складається з Timeта Callback. Вам доведеться зберегти свій масив за сортуванням Time.

Тоді замість видалення елементів з масиву ви б відслідковували поточний індекс масиву , і з кожним оновленням прагнете випереджати цей індекс та виконувати всі зворотні виклики, Playhead >= Timeодночасно збільшуючи індекс відповідно.

Реалізація більшої швидкості відтворення працює з обома реалізаціями і буде такою ж простою, як:

Playhead += Time.deltaTime * playbackSpeed

2
"Збільшити відтворення (простий поплавок) за минулий час" - Якщо ви це зробите, ви отримаєте сукупні помилки з плаваючою комою. Натомість слід використовувати Time.time (час з початку гри) .
BlueRaja - Danny Pflughoeft

4

Ні, у Unity3D такого інтерфейсу немає.

Однак воно підтримує супроводи, і я пропоную вам заглянути їх. Зазвичай процедури спрощення планування та синхронізації подій дійсно прості.


1

Я не впевнений, чи є це новим після відповідей у ​​2012 році, але Unity насправді має підтримку контролю за часовою шкалою через (Legacy) редактор анімації .

Хоча ця функція призначена головним чином для анімації параметрів об'єкта кривими, вона включає можливість запускати скрипти на Анімаційних подіях . Ці сценарії можуть керувати вашою графікою та звуком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.