Есть ли в 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 - Дэнни Пфлюгофт,

4

Нет, Unity3D не имеет такого API из коробки.

Тем не менее, он поддерживает сопрограммы, и я предлагаю вам изучить их. Сопрограммы обычно делают планирование и синхронизацию событий действительно легкими.


1

Я не уверен, что это новое, так как ответы в 2012 году, но на самом деле Unity действительно поддерживает контроль временной шкалы через (Legacy) Animation Editor .

Хотя эта функция предназначена главным образом для анимации параметров объекта с помощью кривых, она включает возможность запуска сценариев в событиях анимации . Эти сценарии могут управлять вашей графикой и аудио.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.