Перейти к содержимому

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.Seconds
local currentTick = Time.Tick

Запись в любое из свойств завершается Lua-ошибкой доступа:

Time.Seconds = 0 -- Lua access error
Time.Tick = 0 -- Lua access error

За проверенные 0.5 секунды Tick увеличился на 30, поэтому оба свойства относятся к одной шкале симуляции.

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) -- 30
local oneSecond = SecondsToTicksAtLeast(1) -- 60

Этот вариант проверен для длительностей 0.1, 0.25, 0.5, 1, 1.5 и 2 секунды.

Time:TickToSeconds(ticks: integer): number

Преобразует количество тиков в секунды.

Тики Результат
0 0
1 0.016666667535901
6 0.1000000089407
30 0.5
60 1.0
600 10.000000953674

Небольшие дробные хвосты являются нормальной погрешностью представления числа.

Не рассчитывайте, что двойное преобразование вернёт исходное число:

local seconds = Time:TickToSeconds(60) -- 1.0
local 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 + durationTicks
local subscription
subscription = Scheduler:OnTick(function()
if Time.Tick >= finishTick then
-- Прошло не меньше 0.5 секунды симуляции
subscription:Cancel()
end
end)

Если callback нужен только один раз через заданное время, обычно проще использовать Scheduler:Schedule().