跳至正文
版本:最新版 - a1.169.2 ⚖️

输入与按键绑定

如何响应玩家的键盘和鼠标,以及如何提供玩家可自定义的按键绑定。

所有输入都在客户端通过 Input 静态类进行处理。如果服务器需要了解相关信息,请发送远程事件。

处理输入的最佳方式是注册按键绑定:为其指定名称和默认按键,玩家可以在游戏设置(设置 -> 控制)中更改按键。这还可以避免与其他包和键盘布局发生冲突。

Client/Index.lua
-- 注册名为 "OpenShop" 的按键绑定,默认使用 B 键
Input.Register("OpenShop", "B", "Opens the Shop")

-- 当按下按键绑定时调用此函数
Input.Bind("OpenShop", InputEvent.Pressed, function()
Console.Log("Opening the shop!")
end)

-- 当释放按键绑定时调用
Input.Bind("OpenShop", InputEvent.Released, function()
Console.Log("Released the shop key")
end)

你还可以绑定到游戏自带的按键绑定(例如 Jump 或 Crouch),使用 Input.GetGameKeyBindings() 进行检查。你还可以通过 Input.IsBindingDown() 检查按键绑定当前是否处于按住状态。

提示

若要显示按键绑定正在使用的按键(例如在用户界面中),请使用 Input.GetMappedKeys() 和 Input.GetKeyIcon()。

原始输入事件​

对于按键绑定不适用的情况(例如打字或响应任意按键),你可以订阅原始输入事件:

Client/Index.lua
Input.Subscribe("KeyPress", function(key_name)
Console.Log("Pressed %s", key_name)
end)

Input.Subscribe("MouseUp", function(key_name, mouse_x, mouse_y)
if (key_name == "LeftMouseButton") then
Console.Log("Clicked at %d, %d", mouse_x, mouse_y)
end
end)

Input.Subscribe("MouseScroll", function(mouse_x, mouse_y, delta)
-- 向上滚动时 delta 为正,向下滚动时为负
Console.Log("Scrolled %d", delta)
end)

在 KeyDown、KeyPress、KeyUp、MouseDown、MouseUp、MouseMove 和 MouseScroll 中返回 false 会阻止输入,因此游戏(以及角色)不会对此作出反应。

请参阅输入页面中的所有按键名称列表。

鼠标光标与 UI 焦点​

打开菜单时,你通常希望显示鼠标光标并停止角色的移动:

Client/Index.lua
function SetMenuOpen(is_open)
-- 显示鼠标光标,以便玩家可以点击 UI
Input.SetMouseEnabled(is_open)

-- 在菜单打开时停止本地玩家输入(移动、射击……)
Input.SetInputEnabled(not is_open)

if (is_open) then
-- 使 WebUI 接收键盘输入(例如在文本框中输入)
my_menu_ui:SetFocus()
else
my_menu_ui:RemoveFocus()
end
end
注意

请记住在菜单关闭时始终恢复鼠标和输入,否则玩家将被卡住!