將用戶輸入連接到動作可以讓用戶對您體驗的功能有更好和更直觀的控制。在本教程中,您將把重載動作綁定到特定的按鍵。
開始
本教程使用在 創建玩家工具 中創建的 Blaster 工具。您可以按照那些說明來創建工具,或者您可以下載 Blaster 模型並將其插入到 StarterPack。
模型可以新增至您的庫存,以便在任何體驗中使用。要將模型新增至您的體驗:
- 在瀏覽器中,打開 模型 頁面,點擊 獲取 按鈕。這會將模型新增到您的庫存中。
- 確保下拉菜單設置為 我的模型。
- 選擇 Blaster 模型將其新增至體驗。
創建動作處理程序
首先,您需要一個函數來處理當偵測到用戶輸入時的情況。
打開 Blaster 中的 ToolController 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(開始狀態)。這很重要,因為這個函數會在每次 inputState 變更時運行,但重載只需要執行一次。
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 可以用來 綁定 一個函數到特定的輸入,使用 BindAction 函數,該函數接受多個參數:
- 動作的名稱。
- 處理該動作的函數(也稱為 "回調")。
- 是否應顯示觸屏按鈕。
- 任何數量的 Enum.KeyCodes 來偵測和關聯該動作。
KeyCodes 是表示不同輸入按鈕的值,例如鍵盤按鍵或控制器按鍵。完整的代碼列表可以在 這裡 獲得。
在腳本的頂部獲取 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 函數,然後在重載動畫完成後重新啟用它。