输入与按键绑定
如何响应玩家的键盘和鼠标,以及如何提供玩家可自定义的按键绑定。
所有输入都在客户端通过 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
注意
请记住在菜单关闭时始终恢复鼠标和输入,否则玩家将被卡住!