Actions

Action是將裝置控制(device control)與輸入(input)分開的一個重要概念。舉例來說,某個遊戲中某些輸入(input)的目的是讓遊戲角色移動,而與該動作(Action)相關的裝置控制(device control)可能是左搖桿。將動作(action)與執行這個輸入的裝置控制(左搖桿)關聯起來的稱作綁定(Binding)。你可以在Action Editor中建立這種綁定,當在程式碼中使用Actons時,你不需要去指定特定的裝置,因為Binding定義了哪些裝置可以執行這個Action。

透過Action Editor你可以為Action建立多個設備的對應,例如下圖,

Move對應了鍵盤與遊戲搖桿,之後你就可以在程式碼中取得這個Action的參考,並可以檢查它的值,或是為它附加callback方法

1
2
// 透過InputSystem API可以找到Move,注意不要在Update loop中使用,因為它是基於字串搜尋,因此會影響效能
InputAction moveAction = InputSystem.actions.FindAction("Move");

注意:

  • 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
    8
    using 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
2
3
4
5
// 啟用單一action
lookAction.Enable();

// 啟用整個action map.
gameplayActions.Enable();

當您啟用一個「動作」(Action)時,InputSystem會解析其綁定(bindings)。啟用後,「動作」會積極監控其綁定的「控件」(Control(s))。如果綁定的「控件」狀態改變,「動作」就會處理該變化。如果「控件」的變化代表「交互」(Interaction) 變化,則「動作」會創建一個響應。所有這些都發生在輸入系統的更新邏輯中。取決於輸入設置中選擇的「更新模式」,這可能每幀發生一次,每固定更新一次,或者如果更新設置為手動,則手動發生一次。

在「動作」啟用的情況下,有些配置無法更改,例如「動作綁定」。要停止ActionAction Map響應輸入,可以使用「停用」(Disable)方法。


上一篇:使用Action Editor編輯Action

下一篇:使用Action

Reference: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.8/manual/Actions.html

評論