允許體驗將玩家輸入綁定到上下文行動或只有在某些條
概要和行動
上下文 是指在玩家執行某些操動作時的條件。一些範例包括持有 Tool 、坐在汽車上或站在門附近等。無論
行動 是指玩家
處理行動中的動作上下文
您最好使用 <
檢查限定動作
要查看一個清單的動作和其對應輸入,您可以在開發者控制台 (F9 在遊戲中) 中檢視「行動綁定」標籤。這會
鍵盤輸入
這種服務對遊戲手柄和觸摸輸入特別有用。 對於遊戲手柄輸入,您可以選擇將 B 按鈕綁定到返回用戶到另一個菜單時返回上一
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_RELOAD = "Reload"
local tool = script.Parent
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_RELOAD and inputState == Enum.UserInputState.Begin then
print("Reloading!")
end
end
tool.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_RELOAD, handleAction, true, Enum.KeyCode.R)
end)
tool.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_RELOAD)
end)
概要
方法
- BindAction(actionName : string,functionToBind : function,createTouchButton : bool,inputTypes : Tuple):void
將使用者輸入綁定到一個行動處理功能。
行為像 BindAction 但也允許優先權被分配至綁定的動作對於交叉輸入類型 (更高的前提)。
將 Class.Tool.Activation 和 1> Class.ClickDetector1> 事件綁定到一起,以啟動 4> Class.Tool.Activation4> 和 7>Class.ClickDetector7> 事件。
取得所有綁定操作的資訊表 (鍵是傳送到 BindAction 的名稱,值是由 GetBoundActionInfo 來調用時的表)。
取得一個名為 BindAction 的表,其內容包含原來傳送至 Class.ContextActionService:BindAction()|BindAction 的資訊。
將 BackpackItem.TextureId 的 Tool 返回 equipped 的 2>Class.Tool.Equipped|equipped2> 。
提供一個有觸摸按鈕的關聯動作的名稱,設置動作的說明。
如果 actionName 鍵包含一個綁定操動作,則 image 設為碰觸按鈕的圖像。
提供一個有觸摸按鈕的關聯動作的名稱,設定按鈕在 ContextButtonFrame 中的位置。
提供一個有觸摸按鈕的關聯動作的名稱,設定按鈕上顯示的文字。
從輸入中取消行動的綁定。
- UnbindActivate(userInputTypeForActivation : Enum.UserInputType,keyCodeForActivation : Enum.KeyCode):void
將 Enum.KeyCode 與特定 Enum.UserInputType 從 Tool.Activation 中解除綁定時,發生錯誤。
移除所有綁定功能。所有 actionNames 將不會剩餘。所有 touch 按鈕將被移除。
取回 ImageButton 的 Class.ContextActionService:BindAction()|bound 行動,該行動有一個已建立的觸輸入按鈕。
活動
屬性
方法
BindAction
將一個行動綁定給指定的使用者輸入的行動處
下面的代碼示例顯示了如何使用 Sound 來在 played 鍵 ( H ) 、遊戲控制器按鈕或觸摸屏幕按鈕時按下。
local ContextActionService = game:GetService("ContextActionService")
-- 一輛車的喇叭聲
local honkSound = Instance.new("Sound", workspace)
honkSound.Looped = true
honkSound.SoundId = "rbxassetid://9120386436"
local function handleAction(actionName, inputState, inputObject)
if actionName == "HonkHorn" then
if inputState == Enum.UserInputState.Begin then
honkSound:Play()
else
honkSound:Pause()
end
end
end
-- 玩家坐在車輛上時:
ContextActionService:BindAction("HonkHorn", handleAction, true, Enum.KeyCode.H, Enum.KeyCode.ButtonY)
-- 玩家退出時:
ContextActionService:UnbindAction("HonkHorn")
行動處理器參數
動作處理器會以下參數來啟動:
<tr><td>1</td><td><code>字串</code></td><td>與原始傳入 BindAction 的相同串</td></tr><tr><td>2</td><td><code>枚列使用者輸入狀態</code></td><td>輸入狀態 (開始、變更、結束或取消)\*</td></tr><tr><td>3</td><td><code>輸入對象</code></td><td>一個包含輸入資訊的對象(視乎使用者輸入類型而異)</td></tr>
# | 類型 | 說明 |
※這允許一個功能處理多個操作,如有需要。*取消是發生在有輸入進行中,或是在有輸入和其他操作綁定在進行中,或是有進度操作綁定在進行中,或是有進度操作綁定在進行中,或是有進度操作綁定在進行中,或是有進度操作綁定在進行中,或是有進度操作綁定在進行中,或是有進度操作綁定在進行中,或是有進度操
動作綁定堆疊
觸摸按鈕
除了輸入類型外,此功能的第三個參數控制按鈕是否為 Class.UserInputService.TouchEnabled|TouchEnabled
參數
代表要執行的動作的字串(例如「HonkHorn」或「OpenDoor」)。
當綁定輸入啟動時,會呼叫以下參數:string (actionName)、Enum.UserInputState 和輸入對象。
是否需要為觸摸輸入設備創建按鈕。
任何數字的 Enum.KeyCode 或 Enum.UserInputType 代表輸入以綁定操動作。
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_RELOAD = "Reload"
local tool = script.Parent
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_RELOAD and inputState == Enum.UserInputState.Begin then
print("Reloading!")
end
end
tool.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_RELOAD, handleAction, true, Enum.KeyCode.R)
end)
tool.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_RELOAD)
end)
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObj)
if inputState == Enum.UserInputState.Begin then
print("Handling action: " .. actionName)
print(inputObj.UserInputType)
end
-- Since this function does not return anything, this handler will
-- "sink" the input and no other action handlers will be called after
-- this one.
end
ContextActionService:BindAction("BoundAction", handleAction, false, Enum.KeyCode.F)
local ContextActionService = game:GetService("ContextActionService")
-- Define an action handler for FirstAction
local function actionHandlerOne(actionName, inputState, _inputObj)
if inputState == Enum.UserInputState.Begin then
print("Action Handler One: " .. actionName)
end
-- This action handler returns nil, so it is assumed that
-- it properly handles the action.
end
-- Binding the action FirstAction (it's on the bottom of the stack)
ContextActionService:BindAction("FirstAction", actionHandlerOne, false, Enum.KeyCode.Z, Enum.KeyCode.X, Enum.KeyCode.C)
-- Define an action handler for SecondAction
local function actionHandlerTwo(actionName, inputState, inputObj)
if inputState == Enum.UserInputState.Begin then
print("Action Handler Two: " .. actionName)
end
if inputObj.KeyCode == Enum.KeyCode.X then
return Enum.ContextActionResult.Pass
else
-- Returning nil implicitly Sinks inputs
return Enum.ContextActionResult.Sink
end
end
-- Binding SecondAction over the first action (since it bound more recently, it is on the top of the stack)
-- Note that SecondAction uses the same keys as
ContextActionService:BindAction("SecondAction", actionHandlerTwo, false, Enum.KeyCode.Z, Enum.KeyCode.X)
BindActionAtPriority
BindActionAtPriority 與 BindAction 相似,但也允許指定優先權。如果多個操作綁定到同一個輸入,則優先權高度函數無視不同操作的訂單。在其他 words,這個函數會重新定義 BindAction 的預期行為。
參數
代表要執行的動作的字串(例如「HonkHorn」或「OpenDoor」)。
當綁定輸入啟動時,會呼叫以下參數:string (actionName)、Enum.UserInputState 和輸入對象。
是否需要為觸摸輸入設備創建按鈕。
行動應該綁定的優先級等級(最高值在下方)。
任何數字的 Enum.KeyCode 或 Enum.UserInputType 代表輸入以綁定到操動作。
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local INPUT_KEY1 = Enum.KeyCode.Q
local INPUT_KEY2 = Enum.KeyCode.E
local function handleThrow(actionName: string, inputState: Enum.UserInputState, inputObject: InputObject)
if inputState ~= Enum.UserInputState.Begin then
return Enum.ContextActionResult.Pass
end
print(`Action [{actionName}] occurred. KeyCode [{inputObject.KeyCode}] pressed.`)
return Enum.ContextActionResult.Sink
end
local function handlePunch(actionName: string, inputState: Enum.UserInputState, inputObject: InputObject)
if inputState ~= Enum.UserInputState.Begin then
return Enum.ContextActionResult.Pass
end
print(`Action [{actionName}] occurred. KeyCode [{inputObject.KeyCode}] pressed.`)
return Enum.ContextActionResult.Sink
end
-- Without specifying priority, the most recently bound action is called first,
-- so pressing INPUT_KEY1 prints "Punch" and then sinks the input.
ContextActionService:BindAction("DefaultThrow", handleThrow, false, INPUT_KEY1)
ContextActionService:BindAction("DefaultPunch", handlePunch, false, INPUT_KEY1)
-- Here we bind both functions in the same order as above, but with explicitly swapped priorities.
-- That is, we give "Throw" a higher priority of 2 so it will be called first,
-- despite "Punch" still being bound more recently.
-- Pressing INPUT_KEY2 prints "Throw" and then sinks the input.
ContextActionService:BindActionAtPriority("PriorityThrow", handleThrow, false, 2, INPUT_KEY2)
ContextActionService:BindActionAtPriority("PriorityPunch", handlePunch, false, 1, INPUT_KEY2)
BindActivate
將 Enum.KeyCode 綁定到 Enum.UserInputType 使用 ClickDetector 事件,2> Class.Tool|Tools2> 和 5> Class.GuiButton|GuiButtons
注意,Enum.UserInputType 指定必須為 Keyboard 或 Gamepad1 通過 1>Gamepad81> 以獲得有效。
參數
必須是鍵盤或 Gamepad1 通過 Gamepad8。
返回
GetAllBoundActionInfo
GetAllBindActioninfo 返回一個表,其中將所有行動的名稱 (原來傳送至 Class.ContextActionService:BindAction()|BindAction) 映射到表 (使用此函數時,您可以檢查所有正在綁定的行動) 返回 Class.ContextActionService:GetBindActionInfo()|GetBindAction 時。使用此功能,您可以檢查所有現
返回
GetBoundActionInfo
GetBoundActionInfo 返回一個包含以下鍵描述鍵定義的動作的表。要獲得所有動作的相同資訊,請使用 GetAllBoundActionInfo 。
<tr><td><code>stackOrder</code></td><td>數字</td><td>描述堆叠中的行動索引(增加)</td></tr><tr><td><code>優先級等級</code> \*</td><td>數字</td><td>描述<code>Class.ContextActionService:BindActionAtPriority()|priority</code>級的動作動</td></tr><tr><td><code>建立按鈕</code></td><td>boolean</td><td>描述是否在 <code>Class.UserInputService.TouchEnabled|TouchEnabled</code> 裝置上需要創建觸摸按鈕</td></tr><tr><td><code>輸入類型</code></td><td>表</td><td>輸入類型傳送至 <code>Class.ContextActionService:BindAction()|BindAction</code> 以啟動此操作</td></tr><tr><td><code>說明</code> †</td><td>字串</td><td>Class.ContextActionService:SetDescription()|SetDescription的描述</td></tr><tr><td><code>標題</code> ※</td><td>字串</td><td>由 <code>Class.ContextActionService:SetTitle()|SetTitle</code> 設定的行動集合的標題</td></tr><tr><td><code>圖像</code> ※</td><td>字串</td><td>Class.ContextActionService:SetImage()|SetImage 設定的動作按鈕圖像</td></tr>
名稱 | 類型 | 說明 |
※優先級等級仍會包含,即使 BindActionAtPriority 未使用 - 預設為 2000。
※ 指示此欄位將會是 nil 如果沒有呼叫指定的動作法。
參數
返回
GetCurrentLocalToolIcon
GetCurrentLocalToolIcon 將返回 BackpackItem.TextureId 的 Class.Tool 目前 Tool 由 equipped 或 1> nil1> 如果沒有此工具或玩家沒有足夠的工具即可 從
返回
來自工具的 TextureId 的內容字串,或零,如果沒有找到。
SetDescription
將描述設定將螢幕描述的描述BindAction 。在可用的動作列表中,這是描述提供的動作的文字。
雖然名稱可能暗示此方法與相關的功能家族有關(SetTitle、SetImage 和SetPosition),此方法對此按鈕不起作用。此方法只是設置一個
參數
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_INSPECT = "Inspect"
local INPUT_INSPECT = Enum.KeyCode.E
local IMAGE_INSPECT = "rbxassetid://1826746856" -- Image of a speech bubble with ? in it
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_INSPECT and inputState == Enum.UserInputState.End then
print("Inspecting")
end
end
-- For touch devices, a button is created on-screen automatically via the 3rd parameter
ContextActionService:BindAction(ACTION_INSPECT, handleAction, true, INPUT_INSPECT)
-- We can use these functions to customize the button:
ContextActionService:SetImage(ACTION_INSPECT, IMAGE_INSPECT)
ContextActionService:SetTitle(ACTION_INSPECT, "Look")
ContextActionService:SetDescription(ACTION_INSPECT, "Inspect something.")
ContextActionService:SetPosition(ACTION_INSPECT, UDim2.new(0, 0, 0, 0))
-- We can manipulate the button directly using ContextActionService:GetButton
local imgButton = ContextActionService:GetButton(ACTION_INSPECT)
if imgButton then -- Remember: non-touch devices won't return anything!
imgButton.ImageColor3 = Color3.new(0.5, 1, 0.5) -- Tint the ImageButton green
end
SetImage
此方法設定 BindAction() 的圖像,創建於 ImageLabel.Image 內的 ImageLabel 屬性。它的具體設置如下 2>Class.ImageLabel.Image2> 內
此功能是自訂動作按鈕的觸摸按鈕的一個家族的方法。其他方法在此家族中包括 SetPosition 和 SetTitle。
參數
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_INSPECT = "Inspect"
local INPUT_INSPECT = Enum.KeyCode.E
local IMAGE_INSPECT = "rbxassetid://1826746856" -- Image of a speech bubble with ? in it
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_INSPECT and inputState == Enum.UserInputState.End then
print("Inspecting")
end
end
-- For touch devices, a button is created on-screen automatically via the 3rd parameter
ContextActionService:BindAction(ACTION_INSPECT, handleAction, true, INPUT_INSPECT)
-- We can use these functions to customize the button:
ContextActionService:SetImage(ACTION_INSPECT, IMAGE_INSPECT)
ContextActionService:SetTitle(ACTION_INSPECT, "Look")
ContextActionService:SetDescription(ACTION_INSPECT, "Inspect something.")
ContextActionService:SetPosition(ACTION_INSPECT, UDim2.new(0, 0, 0, 0))
-- We can manipulate the button directly using ContextActionService:GetButton
local imgButton = ContextActionService:GetButton(ACTION_INSPECT)
if imgButton then -- Remember: non-touch devices won't return anything!
imgButton.ImageColor3 = Color3.new(0.5, 1, 0.5) -- Tint the ImageButton green
end
SetPosition
此方法設置 BindAction() 的位置,由 GuiObject.Position 創建。 它的具體位置是 ImageButton 的 2>Class.Button2> 將被返回 5>Class.ContextActionService:GetButton()
此功能是自訂動作按鈕的家族的方法的一部分。其他方法包括 SetImage 和 SetTitle。
參數
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_INSPECT = "Inspect"
local INPUT_INSPECT = Enum.KeyCode.E
local IMAGE_INSPECT = "rbxassetid://1826746856" -- Image of a speech bubble with ? in it
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_INSPECT and inputState == Enum.UserInputState.End then
print("Inspecting")
end
end
-- For touch devices, a button is created on-screen automatically via the 3rd parameter
ContextActionService:BindAction(ACTION_INSPECT, handleAction, true, INPUT_INSPECT)
-- We can use these functions to customize the button:
ContextActionService:SetImage(ACTION_INSPECT, IMAGE_INSPECT)
ContextActionService:SetTitle(ACTION_INSPECT, "Look")
ContextActionService:SetDescription(ACTION_INSPECT, "Inspect something.")
ContextActionService:SetPosition(ACTION_INSPECT, UDim2.new(0, 0, 0, 0))
-- We can manipulate the button directly using ContextActionService:GetButton
local imgButton = ContextActionService:GetButton(ACTION_INSPECT)
if imgButton then -- Remember: non-touch devices won't return anything!
imgButton.ImageColor3 = Color3.new(0.5, 1, 0.5) -- Tint the ImageButton green
end
SetTitle
設定稱號會設定顯示在 BindAction 內的文字。Specifically, this 設定在 TextLabel.Text 內的 TextLabel 屬性。2>Class.TextLabel.Text
此功能是自訂動作按鈕的觸摸按鈕的一個家族的方法。其他方法在此家族中包括 SetImage 和 SetPosition。
參數
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_INSPECT = "Inspect"
local INPUT_INSPECT = Enum.KeyCode.E
local IMAGE_INSPECT = "rbxassetid://1826746856" -- Image of a speech bubble with ? in it
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_INSPECT and inputState == Enum.UserInputState.End then
print("Inspecting")
end
end
-- For touch devices, a button is created on-screen automatically via the 3rd parameter
ContextActionService:BindAction(ACTION_INSPECT, handleAction, true, INPUT_INSPECT)
-- We can use these functions to customize the button:
ContextActionService:SetImage(ACTION_INSPECT, IMAGE_INSPECT)
ContextActionService:SetTitle(ACTION_INSPECT, "Look")
ContextActionService:SetDescription(ACTION_INSPECT, "Inspect something.")
ContextActionService:SetPosition(ACTION_INSPECT, UDim2.new(0, 0, 0, 0))
-- We can manipulate the button directly using ContextActionService:GetButton
local imgButton = ContextActionService:GetButton(ACTION_INSPECT)
if imgButton then -- Remember: non-touch devices won't return anything!
imgButton.ImageColor3 = Color3.new(0.5, 1, 0.5) -- Tint the ImageButton green
end
UnbindAction
UnbindAction 會從使用者輸入中的名稱解除一個行動的綁定,因此行動處理器功能將不再呼叫。當某個行動的上下文不再適用時,例如關閉用戶界面、退出車輛或 unequipping 一個 Tool 。 請
此功能 不會 發生錯誤,如果沒有此鍵與指定的字串相關。使用 GetAllBoundActionInfo 或開發者控制台的「綁定動作」標籤,您可以查看目前綁定的動作。
參數
返回
範例程式碼
local ContextActionService = game:GetService("ContextActionService")
local ACTION_RELOAD = "Reload"
local tool = script.Parent
local function handleAction(actionName, inputState, _inputObject)
if actionName == ACTION_RELOAD and inputState == Enum.UserInputState.Begin then
print("Reloading!")
end
end
tool.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_RELOAD, handleAction, true, Enum.KeyCode.R)
end)
tool.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_RELOAD)
end)
UnbindActivate
解除雙綁Activate 使用 Enum.KeyCode (或 Enum.UserInputType ) 以啟動 Tool (或 1> Class.HopperBin1> ) 的任何操作。此功能通常會解除該功能所執行的操作。
參數
同一個 UserInputType 最初傳送至 BindActivate。
原本的 KeyCode 已傳送至 BindActivate。
返回
UnbindAllActions
移除所有綁定的功能。所有 actionNames 將不會剩餘。所有觸摸按鈕將被移除。如果按鈕被手動操作,就沒有保證它會被清理。
返回
GetButton
GetButton 返回由 ImageButton 創建的, BindAction 如果其第三個參數是真的,並且設備是 TouchEnabled 。 此函數的唯一參數必須與原來發送到 BindAction 的動作名稱完全一致。
如果沒有此動作的指定或按鈕沒有創建,此函數將返回 nil。
參數
原來此操作的名稱為「BindAction」。
返回
一個由 BindAction 創建的圖像按鈕。