Я не уверен на 100% в единстве, но обычно в играх вы не используете таймеры для игр. То, что вы хотите, звучит как Принц Персии: Пески Времени Механизм перемотки c.
Игры в реальном времени - это просто игры с большим количеством ходов, которые не ждут пользователя вход. «Тик» является общим термином для этих поворотов. Вместо того, чтобы использовать таймеры, вы считаете тики. Вместо секунд вы учитываете тики - с известной цифрой / секундами. Unity немного скрывает галочки, чтобы упростить программирование, но они есть. Начиная с понга, тики являются единственной константой развития игры Единственное, что является фундаментальным для выполнения программы: https://en.wikipedia.org/wiki/Video_game_programming#Game_structure
Однако в этом случае вам понадобится история позиций с максимумом. Думайте об этом как историю отмен любого текстового редактора. Он также возвращается к «последнему сохранению вручную» или с некоторым разумным ограничением записей истории.
Вам необходимо сохранить позицию, каждый игровой штрих, в Коллекцию. После того, как точка в этом собрании была более 5 секунд в прошлом, ее можно отбросить, чтобы освободить место для новой. Специальная коллекция c подлежит обсуждению. Эта историческая диаграмма имеет сходство с очередью - в том, что вы хотите добавить последнюю, не разрушенную вещь. Он имеет элементы связанного списка, так как вы не хотите сдвигать заполненную коллекцию каждый тик игры, так как добавляется новая запись. Но вы также хотите иметь возможность быстро очистить его после перемотки (до точки, которую вы также перематывали), для которой требуется функция очистки или произвольный доступ.
В качестве примера я сделал этот старый и Примитивный Счетчик FPS. Он считает кадры, но только за последнюю секунду:
using System;
using System.Collections.Generic;
namespace FPS_Counter
{
class FPS_Counter
{
List<DateTime> FrameCounter = new List<DateTime>();
public void countFrame(){
FrameCounter.Add(DateTime.Now);
}
private void clearOld()
{
bool continueLoop;
DateTime decayLimit = DateTime.Now.AddSeconds(-1);
do
{
continueLoop = false;
if (FrameCounter.Count > 0 && FrameCounter[0] < decayLimit)
{
FrameCounter.RemoveAt(0);
//If you removed one, the one after might be too old too.
continueLoop = true;
}
}while (continueLoop);
}
public int FPS
{
get
{
clearOld();
return FrameCounter.Count;
}
}
}
}
По сути, он создает историю всех подсчетов countFrame()
. Я использовал простой список и очистил, когда вызывается get. Это неэффективно и может легко переполнить коллекцию, если вы подсчитываете число фреймов, но на самом деле не получаете значение.
Это было достаточно эффективно для работы, так как get называется регулярным. Ваша история будет намного больше, как по количеству записей, так и по размеру записей, поэтому вам, вероятно, придется очищать старое каждый раз, когда вы добавляете что-то новое. И ваш эквивалент countFrame()
должен принять позицию и метку в качестве аргумента.