Actions
Action是將裝置控制(device control)與輸入(input)分開的一個重要概念。舉例來說,某個遊戲中某些輸入(input)的目的是讓遊戲角色移動,而與該動作(Action)相關的裝置控制(device control)可能是左搖桿。將動作(action)與執行這個輸入的裝置控制(左搖桿)關聯起來的稱作綁定(Binding)。你可以在Action Editor中建立這種綁定,當在程式碼中使用Actons時,你不需要去指定特定的裝置,因為Binding定義了哪些裝置可以執行這個Action。
透過Action Editor你可以為Action建立多個設備的對應,例如下圖,Move
對應了鍵盤與遊戲搖桿,之後你就可以在程式碼中取得這個Action的參考,並可以檢查它的值,或是為它附加callback方法
1 | // 透過InputSystem API可以找到Move,注意不要在Update loop中使用,因為它是基於字串搜尋,因此會影響效能 |
注意:
- Action只可在runtime使用,不可以在Edit Window code中使用。
- 也可以不使用Action和Binding來直接取得裝置控制的值
var gamepad = Gamepad.current;
,但是彈性會比較差。 - Action Editor 中顯示的動作順序僅供視覺參考,並不代表實際程式碼執行的順序。多個動作可能在同一幀中執行,Input system的動作順序是不確定的。為了避免潛在問題,請勿在程式碼中假設動作會按特定順序執行。
當您在InputSystem中使用Action進行Script編寫時,可以利用以下一些重要的API,
API 名稱 | 描述 |
---|---|
InputAction | 一個命名Action,它可以回傳與其綁定的裝置控制的值,或是觸發callback。這個API就是Action Editor中Action 那一欄的值 |
InputActionMap | 命名的Action集合。這個API持有的集合就是Action Editor中Action Map 那一欄的值 |
InputSystem.actions | 是一個專案範圍內動作集合(ProjectWideActions)的引用(reference) |
InputBinding | 動作(Action)與其接收輸入的特定設備控制(device control)之間的關係,ActionBindings |
Action
:每個Action
都有一個名稱(InputAction.name
),在一個Action Map中,這個Action
的名稱必須是獨一無二的,每個Action
也會有一個獨一無二的ID(InputAction.id
),可以用它們來找到這個Action
的引用。當ID產生之後,就算名稱改變ID也不會變。Action Map
:每個Action Map
都有一個名稱(InputActionMap.name
),這個Action Map
的名稱必須是獨一無二的,每個Action Map
也會有一個獨一無二的ID(InputActionMap.id
),可以用它們來找到這個Action Map
的引用。當ID產生之後,就算名稱改變ID也不會變。
建立Action
建立Action有好幾種方式
- 方法一:使用Action Editor建立Action:最簡單的方式是使用Action Editor建立
- 方法二:在
MonoBehaviours
中宣告Action,此方法與方法一
類似,差異在於它將Actions定義在GameObject的屬性中,並儲存為Scene或是Prefab。並且它不是project-wide action,因此在使用時需要手動的啟用,停用這些Action。1
2
3
4
5
6
7
8using UnityEngine;
using UnityEngine.InputSystem;
public class ExampleScript : MonoBehaviour
{
public InputAction move;
public InputAction jump;
} - 方法三:在JSON中載入
1
2
3
4
5// Load a set of action maps from JSON.
var maps = InputActionMap.FromJson(json);
// Load an entire InputActionAsset from JSON.
var asset = InputActionAsset.FromJson(json); - 方法四:使用程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// Create free-standing Actions.
var lookAction = new InputAction("look", binding: "<Gamepad>/leftStick");
var moveAction = new InputAction("move", binding: "<Gamepad>/rightStick");
lookAction.AddBinding("<Mouse>/delta");
moveAction.AddCompositeBinding("Dpad")
.With("Up", "<Keyboard>/w")
.With("Down", "<Keyboard>/s")
.With("Left", "<Keyboard>/a")
.With("Right", "<Keyboard>/d");
// Create an Action Map with Actions.
var map = new InputActionMap("Gameplay");
var lookAction = map.AddAction("look");
lookAction.AddBinding("<Gamepad>/leftStick");
// Create an Action Asset.
var asset = ScriptableObject.CreateInstance<InputActionAsset>();
var gameplayMap = new InputActionMap("gameplay");
asset.AddActionMap(gameplayMap);
var lookAction = gameplayMap.AddAction("look", "<Gamepad>/leftStick");
對於非專案範圍(project-wide)的Actions,在使用前需要先啟用(Enable)
1 | // 啟用單一action |
當您啟用一個「動作」(Action)時,InputSystem會解析其綁定(bindings)。啟用後,「動作」會積極監控其綁定的「控件」(Control(s))。如果綁定的「控件」狀態改變,「動作」就會處理該變化。如果「控件」的變化代表「交互」(Interaction) 變化,則「動作」會創建一個響應。所有這些都發生在輸入系統的更新邏輯中。取決於輸入設置中選擇的「更新模式」,這可能每幀發生一次,每固定更新一次,或者如果更新設置為手動,則手動發生一次。
在「動作」啟用的情況下,有些配置無法更改,例如「動作綁定」。要停止Action
或Action Map
響應輸入,可以使用「停用」(Disable)方法。
下一篇:使用Action
Reference: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.8/manual/Actions.html