跳转至

使用UserInputService检测键盘输入

在本教程中,我将向您展示如何使用UserInputService检测键盘输入。

如果您对Lua和Roblox脚本没有基本的了解,我建议您在阅读本教程之前先从这里开始。否则,在讨论事件和其他内容时,您可能会感到困惑。

什么是UserInputService?

UserInputService是Roblox为我们管理客户端用户输入而组合的一种巧妙的API服务,因此得名。与UserInputService相比,ContextActionService是另一种常见的选择,特别是在处理不同设备(移动/控制台)的输入时。

入门

首先,我们需要我们的**LocalScript**,在本教程中,我将把它放在**StarterPlayerScripts**下,并将其命名为**Sprint**。但是,您可以将其放在LocalScript的任何有效位置:

有效的LocalScript位置:

  • 玩家的背包,例如工具的子级
  • 玩家角色模型
  • 玩家PlayerGui
  • 玩家PlayerScripts。
  • ReplicatedFirst服务

有趣的部分

现在我们有了我们的LocalScript,我们可以开始深入了解。

首先,我们需要创建对**UserInputService**的引用:

local UserInputService = game:GetService('UserInputService')
您可以在这里了解更多关于GetService的信息。

现在我们有了对**UserInputService**的引用,我们可以开始使用它的函数和事件。我们将使用InputBeganInputEnded

在创建事件之前,我将把我们的冲刺键定义为一个常量。使用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 (InputObject.KeyCode == SPRINT_KEY) then

然后在该**if语句**中,我们可以获取我们的CharacterHumanoid

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