使用UserInputService检测键盘输入¶
在本教程中,我将向您展示如何使用UserInputService检测键盘输入。
如果您对Lua和Roblox脚本没有基本的了解,我建议您在阅读本教程之前先从这里开始。否则,在讨论事件和其他内容时,您可能会感到困惑。
什么是UserInputService?¶
UserInputService是Roblox为我们管理客户端用户输入而组合的一种巧妙的API服务,因此得名。与UserInputService相比,ContextActionService是另一种常见的选择,特别是在处理不同设备(移动/控制台)的输入时。
入门¶
首先,我们需要我们的**LocalScript**,在本教程中,我将把它放在**StarterPlayerScripts**下,并将其命名为**Sprint**。但是,您可以将其放在LocalScript的任何有效位置:

有效的LocalScript位置:
- 玩家的背包,例如工具的子级
- 玩家角色模型
- 玩家PlayerGui
- 玩家PlayerScripts。
- ReplicatedFirst服务
有趣的部分¶
现在我们有了我们的LocalScript,我们可以开始深入了解。
首先,我们需要创建对**UserInputService**的引用:
您可以在这里了解更多关于GetService的信息。现在我们有了对**UserInputService**的引用,我们可以开始使用它的函数和事件。我们将使用InputBegan和InputEnded。
在创建事件之前,我将把我们的冲刺键定义为一个常量。使用Roblox为我们提供的全局Enums。我还将定义我们的LocalPlayer,我们可以使用它来获取我们的Character。
您可以在这里找到完整的**KeyCodes**列表。
local UserInputService = game:GetService('UserInputService')
local SPRINT_KEY = Enum.KeyCode.LeftShift
local Player = game.Players.LocalPlayer
现在我们定义了冲刺键,我们可以创建我们的事件:
local UserInputService = game:GetService('UserInputService')
local SPRINT_KEY = Enum.KeyCode.LeftShift
UserInputService.InputBegan:Connect(function(InputObject, GameProcessed)
end)
UserInputService.InputEnded:Connect(function(InputObject)
end)
正如您所见,**InputBegan**和**InputEnded**都有一个参数:InputObject,这是包含触发事件的输入的所有信息的对象。这是我们确定按下了哪个键的方式。
在**InputBegan**事件中,您可以看到一个名为*GameProcessed*的第二个参数,这是一个*boolean*值,如果触发事件的输入正在被Roblox使用,则为true。这可以用于避免在玩家在Roblox聊天中输入内容时执行某些操作。但是在我们的教程中,我将忽略该参数,因为我希望人们在按下Shift键时能够冲刺,这也可以用于*ShiftLock*。
现在我们有了事件,我们需要确保按下的键是我们的冲刺键:
然后在该**if语句**中,我们可以获取我们的Character和Humanoid:
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild('Humanoid')
一旦我们有了Humanoid,我们就可以设置WalkSpeed属性以使角色冲刺:
local UserInputService = game:GetService('UserInputService')
local SPRINT_KEY = Enum.KeyCode.LeftShift
UserInputService.InputBegan:Connect(function(InputObject, GameProcessed)
if (InputObject.KeyCode == SPRINT_KEY) then
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild('Humanoid')
Humanoid.WalkSpeed = 25
end
end)
UserInputService.InputEnded:Connect(function(InputObject)
end)
最后,如果我们将相同的代码添加到我们的InputEnded事件中,并反转WalkSpeed:
local UserInputService = game:GetService('UserInputService')
local SPRINT_KEY = Enum.KeyCode.LeftShift
UserInputService.InputBegan:Connect(function(InputObject, GameProcessed)
if (InputObject.KeyCode == SPRINT_KEY) then
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild('Humanoid')
Humanoid.W
alkSpeed = 25
end
end)
UserInputService.InputEnded:Connect(function(InputObject)
if (InputObject.KeyCode == SPRINT_KEY) then
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild('Humanoid')
Humanoid.WalkSpeed = 16
end
end)
完成¶
嘿,神奇!如果您正确地按照本教程操作,当您按住*SPRINT_KEY*时,您的角色应该会加速,释放键时会恢复正常。
希望您喜欢学习UserInputService。