脚本
如何用按键打开 Roblox GUI
按 M 开地图、按 B 开背包、按 Tab 开排行榜 —— 按键开关是 Roblox 里被问得最多的 GUI 问题之一。机制本身只是一个 UserInputService 事件,但有两个细节让所有人踩坑:玩家在 TextBox 里打字时事件照样触发,以及开关可能同时写到了客户端和服务端。本指南给出做对的完整模式,外加对手柄友好的变体。
打开主菜单 模板 →1. 核心:UserInputService.InputBegan
UserInputService 在客户端对每次按键、点按和按钮按下触发 InputBegan。在 LocalScript 里监听它,把 input.KeyCode 和你想要的键比较,然后翻转 ScreenGui 的 Enabled 属性。机制就这么多。
-- LocalScript under StarterGui
local UserInputService = game:GetService("UserInputService")
local player = game:GetService("Players").LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local menuGui = playerGui:WaitForChild("MenuGui")
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
if input.KeyCode == Enum.KeyCode.M then
menuGui.Enabled = not menuGui.Enabled
end
end)2. 哪些按键适合绑定
避开 Roblox 和常见游戏已经占用的键:W A S D 和方向键(移动)、斜杠(聊天)、Escape(Roblox 菜单)、回车。M、B、I、G、K 这些字母,以及 Tab 和 Q,是常用且无冲突的选择。F 键和回车常与平台 UI 冲突。
Enum.KeyCode 列出了所有可绑定的按键和手柄按钮 —— 同一段 InputBegan 代码也可以绑 Enum.KeyCode.ButtonX 来覆盖手柄玩家。
3. 带过渡地显示和隐藏
直接翻转 Enabled 是瞬间生效的。想要菜单淡入或滑入,就保持 GUI 启用、改为补间一个属性 —— CanvasGroup 的 GroupTransparency 做淡入淡出,面板的 Position 做滑动 —— 关闭补间结束后再禁用它。
local TweenService = game:GetService("TweenService")
local function openMenu()
menuGui.Enabled = true
local panel = menuGui:WaitForChild("Panel")
TweenService:Create(
panel,
TweenInfo.new(0.2, Enum.EasingStyle.Quint, Enum.EasingDirection.Out),
{ GroupTransparency = 0 }
):Play()
end4. 手柄和手机玩家
键盘不是唯一的输入。要让一个绑定同时覆盖键盘和手柄、还自带手机上的屏幕按钮,用 ContextActionService:它把一个动作名映射到多个按键码,传入标题后会在手机上自动显示触摸按钮,GUI 关闭时还能解绑。
local ContextActionService = game:GetService("ContextActionService")
local function handleOpen(actionName, inputState, input)
if inputState ~= Enum.UserInputState.Begin then return end
menuGui.Enabled = not menuGui.Enabled
end
ContextActionService:BindAction("OpenMenu", handleOpen, true, Enum.KeyCode.M, Enum.KeyCode.ButtonSelect)
ContextActionService:SetTitle("OpenMenu", "Menu")5. 开关留在客户端
打开自己的菜单是视觉变化,所以它属于 LocalScript —— 不需要 RemoteEvent。需要跨到服务端的只有后果:如果按这个键会买东西或领奖励,那么 GUI 里的按钮照常触发 RemoteEvent、由服务端校验,和其它按钮完全一样。
常见问题
为什么在聊天框打字时 GUI 也会打开?
你漏了 gameProcessedEvent 防护。UserInputService 传给处理函数的第二个参数,在 Roblox 已消费该输入(聊天、TextBox)时为 true。每个处理器开头都写上:if gameProcessed then return end。
怎么在服务端检测按键?
做不到 —— 输入只存在于客户端。在 LocalScript 里检测,若服务端需要响应就触发 RemoteEvent。永远不要信任客户端上报的奖励或权限;在服务端校验。
UserInputService 和 ContextActionService 有什么区别?
UserInputService 上报原始输入 —— 一个事件,你自己过滤按键。ContextActionService 把命名动作绑定到多个输入,能创建手机触摸按钮,支持优先级和重绑定。单个按键两者都行;跨平台菜单更适合 ContextActionService。
能让玩家自定义按键吗?
能 —— 存下玩家选的 Enum.KeyCode,比较时用它而不是硬编码。捕获选择的方法:玩家点击“重新绑定”按钮后,监听下一次 InputBegan 并保存 input.KeyCode。
相关教程
不想手写这些样板代码?
本篇教程里的每一项 —— 层级结构、布局助手、按钮连线 —— 都内置在免费的 Roblox GUI 制作器 里。拖拽搭建、直接调 Roblox 真实属性,然后导出可直接粘贴进 Studio 的 Luau 代码。
