检测用户输入

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

将用户输入连接到行动中,给用户提供更好、更直观的控制过您的体验的功能。 在本教程中,您将为一个重新加载操作绑定到特定的键。

正在开始

本教程使用 创建玩家工具 创建的 冲击波 工具。您可以跟随那些说明创建工具或者您可以下载 1> 冲击波1> 模型并将其插入到 4> 新手包4> 中。

模型可以添加到您的库存中,以便在任何体验之间使用。要将模型添加到您的体验:

  1. 在浏览器中,打开模型页面,单击获取按钮。这将模型添加到您的道具。
  2. 在 Studio 中,去到视图选项卡,然后单击工具箱。
  3. 在工具箱窗口中,单击 物品栏 按钮。然后确保弹出菜单是在 我的模型 上。
  4. 选择 Blaster 模型,将其添加到体验。

创建一个动作处理器

首先,您需要一个处理用户输入时检测到的函数。

  1. 在 Blaster 中打开 工具控制器 LocalScript 内。

  2. 创建变量以存储操动作的名称。


    local tool = script.Parent
    local RELOAD_ACTION = "reloadWeapon"
    local function toolEquipped()
    tool.Handle.Equip:Play()
    end
    local function toolActivated()
    tool.Handle.Activate:Play()
    end
    tool.Equipped:Connect(toolEquipped)
    tool.Activated:Connect(toolActivated)
  3. 创建一个名为 onAction 的函数,该函数接受三个参数:actionNameinputStateinputObject。 这将是检测用户输入时运行的函数。


    local tool = script.Parent
    local RELOAD_ACTION = "reloadWeapon"
    local function onAction(actionName, inputState, inputObject)
    end
    local function toolEquipped()
    tool.Handle.Equip:Play()
    end
  4. 在函数内,检查 actionNameinputState 的重新加载名称匹配,并确保 UserInputState.Begin 是 2>Enum.UserInputState|Enum.UserInputState.Begin2> (开始状态)。这很重要,因为函数将在 5>inputState5> 每次变更时执行,但重新加载只需要发生一次


    local function onAction(actionName, inputState, inputObject)
    if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin then
    end
    end
  5. 要让用户重新加载时显得明显,请将工具的 TextureId 修改为 "rbxassetid://6593020923" ,然后将其重置为其原始值 "rbxassetid://92628145"


    local function onAction(actionName, inputState, inputObject)
    if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin then
    tool.TextureId = "rbxassetid://6593020923"
    task.wait(2)
    tool.TextureId = "rbxassetid://92628145"
    end
    end

绑定动作

ContextActionService 可以用于 使用 Class.ContextActionService:BindAction()|BindAction 函数将函数绑定到特定输入上, 使用 Class.ContextActionService:BindAction 函数,这接受了几个参数:

  • 动作的名称
  • 处理操作的函数(也称为“回调”)
  • 是否显示触摸屏按钮
  • 任何量的 Enum.KeyCodes 以检测并与操动作关联。

键码是代表不同输入按钮的值,例如键盘按钮或控制器按钮。一个完整列表的代码可用 here

  1. 在脚本的顶部获得 ContextActionService


    local ContextActionService = game:GetService("ContextActionService")
    local tool = script.Parent
    local RELOAD_ACTION = "reloadWeapon"
  2. toolEquipped 函数的内部,调用 BindAction 并通过以下参数传递:

    • 操作的名称 ( RELOAD_ACTION )
    • 动作处理器(onAction
    • 一个值,用于创建触摸按钮(true )
    • 按键检测( Enum.KeyCode.R )

    local RELOAD_ACTION = "reloadWeapon"
    local function onAction(actionName, inputState, inputObject)
    if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin then
    tool.TextureId = "rbxassetid://6593020923"
    task.wait(2)
    tool.TextureId = "rbxassetid://92628145"
    end
    end
    local function toolEquipped()
    ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)
    tool.Handle.Equip:Play()
    end
  3. 装备工具并按下键盘上的 R 按钮,以进行游戏测试。背包图标应该立即更改为等待符号,表示武器正在重新加载:

解锁操作

当用户卸下工具时,操作需要 解除绑定 ,以便他们在没有工具的情况下无法重新加载。

  1. 创建一个名为 toolUnequipped 的新函数,并调用 UnbindAction,通过传递参数名称。


    local function toolEquipped()
    ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)
    tool.Handle.Equip:Play()
    end
    local function toolUnequipped()
    ContextActionService:UnbindAction(RELOAD_ACTION)
    end
    local function toolActivated()
    tool.Handle.Activate:Play()
    end
    tool.Equipped:Connect(toolEquipped)
    tool.Activated:Connect(toolActivated)
  2. toolUnequipped 函数连接到 Unequipped 事件,以便函数在事件发生时运行。


    local ContextActionService = game:GetService("ContextActionService")
    local tool = script.Parent
    local RELOAD_ACTION = "reloadWeapon"
    local function onAction(actionName, inputState, inputObject)
    if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin then
    tool.TextureId = "rbxassetid://6593020923"
    task.wait(2)
    tool.TextureId = "rbxassetid://92628145"
    end
    end
    local function toolEquipped()
    ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)
    tool.Handle.Equip:Play()
    end
    local function toolUnequipped()
    ContextActionService:UnbindAction(RELOAD_ACTION)
    end
    local function toolActivated()
    tool.Handle.Activate:Play()
    end
    tool.Equipped:Connect(toolEquipped)
    tool.Unequipped:Connect(toolUnequipped)
    tool.Activated:Connect(toolActivated)
  3. 进行游戏测试以确认所有东西正常运行。你应该能够在装备工具时重新加载,但不能在卸下工具时重新加载。

您的重新加载动画已完成 - 为了额外的挑战,请试着每次发射冲击波时计数一个弹药计数器。然后,在冲击波发生时恢复toolActivated 功能,然后在重新加载动画结束后重新激活它。