如何通过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
代码说明
- 事件连接存储:将所有点击事件的连接对象存入变量,在函数退出时统一断开,避免后续无效触发或内存泄漏。
- 异步等待逻辑:通过
while not enterFinished do task.wait() end监听状态变化,task.wait()会主动让出主线程资源,不会导致游戏卡顿崩溃。 - 状态触发退出:当密码验证通过后,
enterFinished设为true,循环结束,函数执行后续清理逻辑后自然退出。
内容的提问来源于stack exchange,提问作者Wild Alex
相关产品推荐
相关产品推荐

