今天有一个时间队列需求,使用lua实现的过程中遇到了一个问题,因为同一时间最多只会使用一个弹窗,所以想使用一个预制体内置一个timer做计时,每次回调重新设置timer的计时器。
但是这就有一个问题,如果每次回调调用的都是自己的计时器的话,就会被timer直接stop掉。
function Timer:Start()
self.running = true
self.coroutineid = coroutine.start(function()
while self.running do
local delta = self.scale and Time.deltaTime or Time.fixedTime
self.time = self.time - delta
if self.time <= 0 then
self.func()
if self.loop > 0 then
self.loop = self.loop - 1
self.time = self.time + self.duration
end
if self.loop == 0 then
self:Stop()
elseif self.loop < 0 then
self.time = self.time + self.duration
end
end
coroutine.step()
end
end)
end
也就是在调用self.func()的时候又对本身的timer进行reset与restart,因为单线程的缘故,在执行了restart之后,相当于是新开了一个coroutine进行计时,但是上一次的timer还没有停掉,还会执行后面的loop次数判断,当loop==0的时候,会把timer给关掉,这就导致了后面开启的协程不会执行到回调函数。
嘛,反正,找到问题了最后就多做了一个预制体作为缓存,两个预制体进行切换显示,反正也算是解决了任务