You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过if条件在:Connect绑定的函数中跳出keypad函数?

解决Roblox中通过布尔变量退出keypad函数的问题

原代码的核心问题

  • enter.MouseClick:Connect()是异步触发的回调逻辑,keypad函数执行完毕后,用户点击enter才会触发该回调,此时函数已经执行结束,修改enterFinished无法让函数退出。
  • 原代码里的for循环仅在绑定子项点击事件时一次性检查enterFinished,后续不会再监听变量变化,因此无法在点击enter后触发函数退出。
  • 强行添加死循环(如while not enterFinished do end)会阻塞Roblox主线程,直接导致游戏崩溃。

正确实现方案

采用协程+非阻塞等待循环的方式,既可以监听enterFinished的状态变化,又不会卡死主线程,同时做好事件连接的清理避免内存泄漏:

修改后的代码

function keypad(state)
    local enterFinished = false
    -- 存储enter按钮的事件连接
    local enterConnection = enter.MouseClick:Connect(function()
        if state == "unlock" then
            enterPressed = true
            local x = keyPressed(input)
            enterPressed = false
            table.clear(input)
            if x == pin then
                atmScreen.Text = "Pin Correct!"
                enterFinished = true
            else
                atmScreen.Text = "Pin Incorrect! Please reenter pin!"
            end
        elseif state == "choice" then
            print("choice")
        end
    end)    
    -- 存储数字键的所有事件连接
    local keyConnections = {}
    for i, v in pairs(folder:GetChildren()) do
        local conn = v.ClickDetector.MouseClick:Connect(function()
            table.insert(input,i)
            keyPressed(input)
        end)
        table.insert(keyConnections, conn)
    end

    -- 非阻塞等待enterFinished状态变化
    while not enterFinished do
        task.wait() -- 必须调用wait让出主线程,避免崩溃
    end

    -- 退出前断开所有事件连接,防止内存泄漏
    enterConnection:Disconnect()
    for _, conn in ipairs(keyConnections) do
        conn:Disconnect()
    end
end

代码说明

  1. 事件连接存储:将所有点击事件的连接对象存入变量,在函数退出时统一断开,避免后续无效触发或内存泄漏。
  2. 异步等待逻辑:通过while not enterFinished do task.wait() end监听状态变化,task.wait()会主动让出主线程资源,不会导致游戏卡顿崩溃。
  3. 状态触发退出:当密码验证通过后,enterFinished设为true,循环结束,函数执行后续清理逻辑后自然退出。

内容的提问来源于stack exchange,提问作者Wild Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:03:18