coroutine协程的问题

游戏中有一个使用技能,触发后能够减少当前处于cd中技能的冷却时间
在客户端cd限制中,cd的展示我使用了协程的方式。但是,当第一次调用冷却后,处于冷却中,再次调用,客户端显示上回会执行2个协程,我没办法中断上一个协程,我对协程理解非常有限,若有能实现方法更好的方式,请大佬赐教!

1、模块
local CoolDownManager = {}

CoolDownManager.__index = CoolDownManager

function CoolDownManager.new_F()

local self = setmetatable({}, CoolDownManager)

self._running = false

return self

end
---方形cd
function CoolDownManager:coolDownAnimaF(Button,CD)
	if not self._running then
		local thread = coroutine.create(function()
			self._running = true
			Button.time.Text = CD
			Button.cd.Visible = true
			Button.icon.ImageColor3 = Color3.fromRGB(107, 107, 107)
			local goal = {}
			goal.Position = UDim2.new(0, 0,1, 0)
			goal.Size = UDim2.new(1, 0,0, 0)
			local info = TweenInfo.new(CD,Enum.EasingStyle.Linear)
			local tween = TweenService:Create(Button.cd,info,goal)
			tween:Play()
			local counter = 0
			while self._running and counter < CD do
				wait(1)
				counter = counter + 1
				Button.time.Text = CD - counter
				--print("--------"..CD)
				--print(self._running)
				if counter == CD then
					Button.time.Text = ""
					Button.icon.ImageColor3 = Color3.fromRGB(255, 255, 255)
					Button.cd.Visible = false
					Button.cd.Size = UDim2.new(1, 0,1, 0)
					Button.cd.Position = UDim2.new(0, 0,0, 0)
				end
			end
			self._running = false
			Button.time.Text = ""
		end)
		coroutine.resume(thread)
	else
		warn("Warning: timer could not start again as it is already running.")
	end
end

--重置状态为假
function CoolDownManager:stop()
	if self and self._running then
		self._running = false
	end
end
return CoolDownManager
3 个赞

没用过协程,但看了下文档好像是需要一个返回值来终止函数
https://developer.roblox.com/zh-cn/api-reference/lua-docs/coroutine
技能冷却的话最好还是放在服务端来做,通过事件来通知客户端
服务端再做个类似线程池的管理,避免重复创建

服务器有判断,协程的挂起函数,会挂起当前脚本进程所有的不同协程号,这里有比较疑惑,之前尝试过存储上次的协程号

你不是判断了 self._running, 改成false 不就停了吗

不会停,表现上感觉就像有两个独立线程在运行一样,也许是这个wait(1)的原因

我试了一下,没问题,调stop能停,看你下你使用的地方的代码,以及如何调的stop

每次调用前会先stop一下

InitUI["cdF"..but]:stop()
InitUI["cdF"..but]:coolDownAnimaF(UseSkillUI["equipSkill"..but],newCD)

按理每次执行stop,就会将InitUI[“cdF”…but]的_running置为false,那么前一个协程应该停止运行了对不对,就不应该再执行前一个协程的while了,而是只执行新的协程,但表现效果还是,两个都在执行,就有点晕了

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号