lua实现定时器

Posted 絮叨ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua实现定时器相关的知识,希望对你有一定的参考价值。

先接入这个类中的循环,然后调用这个接口TimerCounter.CreateTimer(时间(按秒传入),function()end)

module("TimerCounter", package.seeall )

 

local _timerDict = {}

 

local quest_list = {}

 

TimerData = {}

function TimerData:new(t, func, arg, unscale)

    local self = {}

    setmetatable( self, {__index = TimerData} )

    self.time = t

    self.callfunc = func

    self.args = arg

    self.unscale = unscale

    return self

end


 

function CreateTimer(t, func, arg, unscale)

    local timer = TimerData:new(t, func, arg, unscale)

    _timerDict[timer] = 0

    return timer

end

 

function StopTimer(timer)

    _timerDict[timer] = nil

end

 

function TimerCounter:AddTimesTimer(callback, delay_time, times)

    local t = {callback, delay_time, UnityEngine.Time.unscaledTime + delay_time, times}

    quest_list[t] = t

    return t

end

 

function TimerCounter:AddDelayTimer(callback, delay_time)

    return self:AddTimesTimer(callback, delay_time, 1)

end

 

function TimerCounter:AddRunQuest(callback, delay_time)

    return self:AddTimesTimer(callback, delay_time, 999999999)

end

 

function TimerCounter:CancelQuest(quest)

    if quest == nil then return end

 

    quest_list[quest] = nil

end

 

function TimerCounter:UpdateQuest()

    local callback_list = {}

    for k, v in pairs(quest_list) do

        if v[4] <= 0 then

            quest_list[k] = nil

        else

            if v[3] <= UnityEngine.Time.unscaledTime then

                table.insert(callback_list, k)

                v[3] = UnityEngine.Time.unscaledTime

                v[3] = v[3] + v[2]

                v[4] = v[4] - 1

            end

        end

    end

 

    local quest = nil

    for k, v in pairs(callback_list) do

        quest = quest_list[v]

        if nil ~= quest then

            quest[1]()

        end

    end

end

 

function Update(deltime, unscaledDeltaTime)

    for i, v in pairs(_timerDict) do

        local t

        if i.unscale then

            t = v + unscaledDeltaTime

        else

            t = v + deltime

        end

        if t >= i.time then

            i.callfunc(i.args)

            _timerDict[i] = nil

        else

            _timerDict[i] = t

        end

    end

 

    UpdateQuest()

end

最后插一则寓言小故事:

信念是一种无坚不催的力量,当你坚信自己能成功时,你必能成功。

一天,我发现,一只黑蜘蛛在后院的两檐之间结了一张很大的网。难道蜘蛛会飞?要不,从这个檐头到那个檐头,中间有一丈余宽,第一根线是怎么拉过去的?后来,我发现蜘蛛走了许多弯路--从一个檐头起,打结,顺墙而下,一步一步向前爬,小心翼翼,翘起尾部,不让丝沾到地面的沙石或别的物体上,走过空地,再爬上对面的檐头,高度差不多了,再把丝收紧,以后也是如此。

温馨提示:蜘蛛不会飞翔,但它能够把网凌结在半空中。它是勤奋、敏感、沉默而坚韧的昆虫,它的网制得精巧而规矩,八卦形地张开,仿佛得到神助。这样的成绩,使人不由想起那些沉默寡言的人和一些深藏不露的智者。于是,我记住了蜘蛛不会飞翔,但它照样把网结在空中。奇迹是执着者造成的。


以上是关于lua实现定时器的主要内容,如果未能解决你的问题,请参考以下文章

记录——时间轮定时器(lua 实现)

浅析时间轮定时器

罗技 LUA 脚本添加睡眠定时器

LUA教程4- 定时器的使用

ESP8266 LUA脚本语言开发: 外设篇-定时器,延时,看门狗

停止 Lua 中的所有计时器(Garry's Mod)