Объяснение кода таймера

Cody456

Новичок
Автор темы
15
3
Я недавно начал изучать программирование и Lua, и для проекта нужен был таймер который не останавливает весь код ( без wait() ). Нашел вот такой код, могу его применить, но не пойму как он работает. Если кто-то разбирается, объясните пожалуйста как работает код. А если точнее не понимаю эти моменты: что такое self, что такое __index, почему переменные объявлены с нижнего подчеркивания "_", не понимаю как работает самая первая функция и почему она объявлена с точкой, а другие двоеточием. Остальные моменты нашел сам и вроде как понял, а это видимо какие-то внегласные правила как у сишарпа юнити с нижним подчеркиванием в приватных полях.

Таймер:
local Timer = {}
Timer.__index = Timer

function Timer.new()
    local self = setmetatable({}, Timer)

    self._finishedEvent = Instance.new("BindableEvent")
    self.finished = self._finishedEvent.Event

    self._running = false
    self._startTime = nil
    self._duration = nil

    return self
end

function Timer:start(duration)
    if not self._running then
        local timerThread = coroutine.wrap(function()
            self._running = true
            self._duration = duration
            self._startTime = tick()
            while self._running and tick() - self._startTime < duration do
                wait()
            end
            local completed = self._running
            self._running = false
            self._startTime = nil
            self._duration = nil
            self._finishedEvent:Fire(completed)
        end)
        timerThread()
    else
        warn("Warning: timer could not start again as it is already running.")
    end
end

function Timer:getTimeLeft()
    if self._running then
        local now = tick()
        local timeLeft = self._startTime + self._duration - now
        if timeLeft < 0 then
            timeLeft = 0
        end
        return timeLeft
    else
        warn("Warning: could not get remaining time, timer is not running.")
    end
end

function Timer:isRunning()
    return self._running
end

function Timer:stop()
    self._running = false
end

return Timer
 

Fott

Простреленный
3,446
2,309