Time
Time предоставляет текущее время симуляции, номер тика и преобразование между секундами и тиками.
Зачем нужен и как обрабатывается
Заголовок раздела «Зачем нужен и как обрабатывается»Time.Seconds и Time.Tick читают текущие часы симуляции того контекста, в котором выполняется модуль. Они не запускают таймер и не вызывают callback. Для выполнения кода позже используйте Scheduler.
SecondsToTick() и TickToSeconds() — только арифметические преобразования по длительности сетевого тика. Они не ждут указанное время и не меняют ход матча.
Главное
Заголовок раздела «Главное»SecondsиTickдоступны только для чтения;- в текущей версии один тик длится примерно
1/60секунды; SecondsToTick()чувствителен к погрешности чисел с плавающей точкой;- преобразование из тиков в секунды и обратно не гарантирует исходное значение;
- API одинаково доступен в клиентской и серверной Lua-частях.
Текущее время
Заголовок раздела «Текущее время»| Свойство | Тип | Доступ | Описание |
|---|---|---|---|
Seconds |
number |
get |
Текущее время симуляции в секундах. |
Tick |
integer |
get |
Текущий тик симуляции. |
local currentSeconds = Time.Secondslocal currentTick = Time.TickЗапись в любое из свойств завершается Lua-ошибкой доступа:
Time.Seconds = 0 -- Lua access errorTime.Tick = 0 -- Lua access errorЗа проверенные 0.5 секунды Tick увеличился на 30, поэтому оба свойства относятся к одной шкале симуляции.
SecondsToTick
Заголовок раздела «SecondsToTick»Time:SecondsToTick(seconds: number): integerПреобразует длительность в секундах в количество тиков.
local ticks = Time:SecondsToTick(0.1) -- 6Метод поддерживает ноль и отрицательные значения.
| Секунды | Результат |
|---|---|
0 |
0 |
0.1 |
6 |
0.25 |
14 |
0.5 |
29 |
1 |
59 |
2 |
119 |
-1 |
-59 |
Не короче заданной длительности
Заголовок раздела «Не короче заданной длительности»Для положительной длительности, которая не должна завершиться на тик раньше, округлите отношение вверх:
local function SecondsToTicksAtLeast(seconds) local tickDuration = Time:TickToSeconds(1) return math.ceil(seconds / tickDuration)end
local halfSecond = SecondsToTicksAtLeast(0.5) -- 30local oneSecond = SecondsToTicksAtLeast(1) -- 60Этот вариант проверен для длительностей 0.1, 0.25, 0.5, 1, 1.5 и 2 секунды.
TickToSeconds
Заголовок раздела «TickToSeconds»Time:TickToSeconds(ticks: integer): numberПреобразует количество тиков в секунды.
| Тики | Результат |
|---|---|
0 |
0 |
1 |
0.016666667535901 |
6 |
0.1000000089407 |
30 |
0.5 |
60 |
1.0 |
600 |
10.000000953674 |
Небольшие дробные хвосты являются нормальной погрешностью представления числа.
Round-trip
Заголовок раздела «Round-trip»Не рассчитывайте, что двойное преобразование вернёт исходное число:
local seconds = Time:TickToSeconds(60) -- 1.0local ticks = Time:SecondsToTick(seconds) -- 59, не 60При проверке 1, 6, 30, 60 и 600 тиков значения 30 и 60 после round-trip уменьшились на один, а остальные восстановились точно. Храните тики как тики, если дальнейшая логика работает именно в этой единице.
Таймер по тикам
Заголовок раздела «Таймер по тикам»В server.lua Reflex-модуля можно сохранить целевой тик и сравнивать его внутри Scheduler:OnTick():
local durationTicks = math.ceil(0.5 / Time:TickToSeconds(1))local finishTick = Time.Tick + durationTickslocal subscription
subscription = Scheduler:OnTick(function() if Time.Tick >= finishTick then -- Прошло не меньше 0.5 секунды симуляции subscription:Cancel() endend)Если callback нужен только один раз через заданное время, обычно проще использовать Scheduler:Schedule().