Roblox Studio - 函数无意中同时运行多次

问题描述 投票:0回答:1

我的游戏中有一个无意的事情,如果我再次运行一个函数,这些函数会相互重叠,但我不希望这样。

当我再次运行该函数时,该函数与之前运行的另一个函数重叠。

剧本:

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)

当我再次运行该函数时,该函数与之前运行的另一个函数重叠。

lua roblox roblox-studio
1个回答
0
投票

要阻止函数同时运行,您需要存储函数当前是否正在运行,并且对于任何新调用,检查它是否已经在运行。 例如:

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 语句中。

© www.soinside.com 2019 - 2024. All rights reserved.