Как я могу реализовать функцию «ускоренной перемотки вперед» в моей игре?


15

Как я могу реализовать функцию ускоренной перемотки для моей игры Tower Defense, как в http://fieldrunners.com/ и других играх TD?

Я использую Unity 3D. Будет ли что-то для управления меньшим количеством кадров в секунду или какая-то ручная установка быстрого движения врагов и скорости стрельбы из башни, и так далее?


Вы пытались увеличить частоту обновления? возможно, вам придется пропустить кадры ..
concept3d

Ответы:


7

если в вашей игре нет сложных или дорогих в вычислительном отношении симуляций, требующих разделения их на независимые временные рамки обновления, вы можете использовать простой подход, основывая код в ваших Update()функциях на значении Unity Time.time, а в вашем коде установите значение Time .timeScale будет тем, что вы хотите. 0 == приостановлено, 1 = нормально, наши тестировщики любят устанавливать timeScale> 1 для ускорения работы.

http://unity3d.com/support/documentation/ScriptReference/Time-timeScale.html


18

Подход: более высокая скорость моделирования

Время вашего пользовательского интерфейса должно быть отделено от вашего реального игрового цикла, как и ваш рендеринг. Скажем, например, ваш мир движется со скоростью 4x. Допустим, что при вашей базовой (1x) скорости ваша игра запускает 30 обновлений в секунду.

После этого в режиме ускоренной перемотки вы получите что-то вроде следующего:

  • Мировая логика запускает 4 обновления для каждого обновления интерфейса и рендерера. Это означает, что ему нужно запускать 120 обновлений в секунду. Таким образом, ваша модель мира (данные) обновляется с такой скоростью.
  • Рендерер и логика пользовательского интерфейса продолжают опрашивать или делать что-либо со скоростью 30 обновлений в секунду.

Другими словами, игра в целом не работает быстрее. Симуляция часть.

Вы можете вывести две вещи из этого:

  1. Вы должны сохранять свою игровую логику достаточно простой, чтобы вы могли легко запускать ее в четыре раза быстрее на целевой платформе, ИЛИ вам нужно вводить методы для более быстрой экстраполяции различных аспектов игрового процесса - однако это может привести к модели, которая отличается от того, что было бы, если бы вы просто использовали более быстрый темп моделирования. Таким образом, компромиссом будет стоимость обработки для точности. Смотрите подход 2 ниже.

  2. Именно разделение интересов позволяет вам легко ускорить симуляцию мира, причем это разделение представляет собой модель, представление и контроллер ( MVC ). Если ваши мировые данные (M), логика рендеринга (V) и игровая логика (C) смешаны, вы действительно не сможете сделать это, по крайней мере, без массовой мигрени.

Подход: экстраполяция на основе дельт времени

Как уже упоминалось выше, вам нужно рассчитать движение на основе того, как далеко что-то должно было бы пройти в данный момент времени. Это предполагает, что физика вашей игры по своей природе более реалистична, однако это может быть не так. Это довольно обширная тема и значительно более сложная. Вам нужно будет задать больше вопросов, если вы хотите знать. По сути, вы будете делать некоторые исчисления, чтобы все было правильно. Вам придется иметь дело с взаимопроникновением при столкновениях и множеством других вопросов, которые я не буду здесь рассматривать.

Заключить

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


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

9

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

В таком случае становится просто реализовать масштабирование времени (включая ускоренную перемотку) в вашей игре. Просто умножьте временной шаг логики игры на какое-то скалярное значение, которое определяет, сколько будет «ускоряться» или замедляться. По умолчанию это значение равно единице, и, например, когда пользователь нажимает клавишу «ускоренная перемотка вперед», вы устанавливаете его на 1,5, и все моделирование будет выполняться на 50% быстрее. Однако вы все равно будете рендерить с той же скоростью.

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


1
Это определенно применимо к его сценарию. Все, что ему нужно сделать, это установить Time.timeScale в некоторый множитель, и все будет идти быстрее. Это повсеместное изменение, поэтому, если есть такие вещи, как взаимодействие с меню и тому подобное, они тоже будут работать быстрее.
Tetrad

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