将用户输入连接到行动中,给用户提供更好、更直观的控制过您的体验的功能。 在本教程中,您将为一个重新加载操作绑定到特定的键。
正在开始
本教程使用 创建玩家工具 创建的 冲击波 工具。您可以跟随那些说明创建工具或者您可以下载 1> 冲击波1> 模型并将其插入到 4> 新手包4> 中。
模型可以添加到您的库存中,以便在任何体验之间使用。要将模型添加到您的体验:
- 在浏览器中,打开模型页面,单击获取按钮。这将模型添加到您的道具。
- 在 Studio 中,去到视图选项卡,然后单击工具箱。
- 在工具箱窗口中,单击 物品栏 按钮。然后确保弹出菜单是在 我的模型 上。
- 选择 Blaster 模型,将其添加到体验。
创建一个动作处理器
首先,您需要一个处理用户输入时检测到的函数。
在 Blaster 中打开 工具控制器 LocalScript 内。
创建变量以存储操动作的名称。
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function toolEquipped()tool.Handle.Equip:Play()endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)创建一个名为 onAction 的函数,该函数接受三个参数:actionName、inputState和inputObject。 这将是检测用户输入时运行的函数。
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()end在函数内,检查 actionName 与 inputState 的重新加载名称匹配,并确保 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 thenendend要让用户重新加载时显得明显,请将工具的 TextureId 修改为 "rbxassetid://6593020923" ,然后将其重置为其原始值 "rbxassetid://92628145"。
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endend
绑定动作
ContextActionService 可以用于 使用 Class.ContextActionService:BindAction()|BindAction 函数将函数绑定到特定输入上, 使用 Class.ContextActionService:BindAction 函数,这接受了几个参数:
- 动作的名称
- 处理操作的函数(也称为“回调”)
- 是否显示触摸屏按钮
- 任何量的 Enum.KeyCodes 以检测并与操动作关联。
键码是代表不同输入按钮的值,例如键盘按钮或控制器按钮。一个完整列表的代码可用 here 。
在脚本的顶部获得 ContextActionService。
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"在 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 thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()end装备工具并按下键盘上的 R 按钮,以进行游戏测试。背包图标应该立即更改为等待符号,表示武器正在重新加载:
解锁操作
当用户卸下工具时,操作需要 解除绑定 ,以便他们在没有工具的情况下无法重新加载。
创建一个名为 toolUnequipped 的新函数,并调用 UnbindAction,通过传递参数名称。
local function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)将 toolUnequipped 函数连接到 Unequipped 事件,以便函数在事件发生时运行。
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Unequipped:Connect(toolUnequipped)tool.Activated:Connect(toolActivated)进行游戏测试以确认所有东西正常运行。你应该能够在装备工具时重新加载,但不能在卸下工具时重新加载。
您的重新加载动画已完成 - 为了额外的挑战,请试着每次发射冲击波时计数一个弹药计数器。然后,在冲击波发生时恢复toolActivated 功能,然后在重新加载动画结束后重新激活它。