我的游戏中有一个无意的事情,如果我再次运行一个函数,这些函数会相互重叠,但我不希望这样。
当我再次运行该函数时,该函数与之前运行的另一个函数重叠。
剧本:
local eids = script.Parent.EnemyIDSelected
local userinput = game:GetService("UserInputService")
local frame = script.Parent.Parent.Parent
local enemycount = frame.Enemies.NumberOfEnemies
local enemyorder = frame.Enemies.Frame:WaitForChild("EnemyOrder")
userinput.InputBegan:Connect(function(input,gameProcessedEvent)
if input.KeyCode == Enum.KeyCode.A or input.KeyCode == Enum.KeyCode.Left then
eids.Value = eids.Value - 1
elseif input.KeyCode == Enum.KeyCode.D or input.KeyCode == Enum.KeyCode.Right then
eids.Value = eids.Value + 1
end
end)
eids.Changed:Connect(function()
if eids.Value > enemycount.Value then
eids.Value = 1
elseif eids.Value < 1 then
eids.Value = enemycount.Value
end
end)
eids.Changed:Connect(function()
local number = 0
local function findenemies()
local enemycount = frame.Enemies.NumberOfEnemies.Value
local enemies = {}
local ordernumber = 1
for i, v in pairs(enemyorder:GetChildren()) do
if string.sub(v.Name, 1, 5) == "Order" then
enemies[ordernumber] = v.Value
if ordernumber == enemycount then
return enemies
end
ordernumber = ordernumber + 1
end
end
end
local enemies = findenemies()
--
while wait() do
for i, v in pairs(enemies) do
if i == eids.Value then
print(number)
script.Parent.ImageLabel.TextLabel.Text = enemies[i].EnemyValue.Value
enemies[i].ImageColor3 = Color3.fromRGB(80, 80, 80)
for i2, v2 in pairs(enemies) do
if v2 ~= enemies[i] then
v2.ImageColor3 = Color3.fromRGB(80, 80, 80)
end
end
wait(0.15)
enemies[i].ImageColor3 = Color3.fromRGB(255, 255, 255)
wait(0.15)
number = number + 1
end
end
end
end)
当我再次运行该函数时,该函数与之前运行的另一个函数重叠。
要阻止函数同时运行,您需要存储函数当前是否正在运行,并且对于任何新调用,检查它是否已经在运行。 例如:
local currentlyRunning = false
function test()
if currentlyRunning then return end
currentlyRunning = true
task.wait(5)
-- Very important if you have any return statements, put this line infront of them.
-- Otherwise, the execution of the function may stop and
currentlyRunning = false
end
如果您尝试在事件再次触发时取消停止前一个函数的执行,则应将脚本中处理可视化的部分移至回调之外,而仅引用回调设置的变量。这可以让您避免处理协程的问题和麻烦。
例如:
local enemies = 0
event:Connect(function()
enemies +=1
end)
RunService:Hearbeat:Connect(function()
print(enemies)
end)
此外,在您的脚本中,您多次监听同一事件,这是不好的做法,因为它可能会导致正在运行的函数的顺序出现问题。您应该将它们放入同一个 :Connect 语句中。