跳至主要内容

模塊介紹

重要 注意 提醒

Coding Style wiki


基本說明

輸入控制系統,支援 Unity New InputSystem,如果使用 Unity New InputSystem 需自行建立 Unity New InputSystem 的控制表 (Control Maps),並且還有提供使用於 Unity New InputSystem 的 Binding Composite 腳本模板,最後再由 Input Action 派送輸入訊號控制由訂閱者訂閱,進而做到遊戲中的控制邏輯不需要知道平台裝置區分,皆由 Input Action 進行整合,當然 Input Action 也支援其他輸入控制插件,作為單純的輸入控制派送者。

  • 版本:v1.0.4 (com.michaelo.oxgkit.inputsystem)
  • 命名空間:OxGKit.InputSystem

注意 本模組依賴 Unity New InputSystemOxGKit.LoggingSystem (作為日誌輸出),需先安裝依賴庫。


應用說明

主要層級驅動區分

  • For Unity New InputSystem
    • Control Maps (Input Action Asset)
    • Binding Composites
  • For Any Inputs
    • Input Actions (此為獨立作為通用訊號派送者,不依賴任何輸入控制插件,皆可自由實現)

腳本模板 (Right-Click)

  • 透過 Right-Click Create/OxGKit/Input System/Template Input Action.cs (Input Interface For Any) 實作 InputAction 介面 (通用訊號派送者);建立後於遊戲開始時依序註冊 Inputs.CM.RegisterControlMapInputs.IA.RegisterInputAction 即可生效 (參考下方「簡單使用」)。
  • 透過 Right-Click Create/OxGKit/Input System/New Input System (Extension)/Template Input Binding Composite.cs (For Unity New Input System)自行實現自定義的 Binding Composite (將多個輸入部件組合成單一輸入值);模板已內建啟動時自動註冊機制,建立後即可於 Input Action Asset 的 Binding 清單中選用 (詳見 IInputAction - 腳本模板)。

提醒 本模組的 Editor 部分僅提供以上腳本模板 MenuItems (InputSystemCreateScriptEditor),作為腳本建立輔助,無其他 Editor API。

調用 Inputs API

  • 調用 Inputs API (using OxGKit.InputSystem),透過 Inputs.CM (Control Maps) 與 Inputs.IA (Input Actions) 進行註冊、取得、開關與驅動更新。

模組日誌

  • 本模組的日誌透過 OxGKit.LoggingSystem 輸出,日誌器名稱為 OxGKit.InputSystem.Logger,可於 LoggingLauncher 進行開關與級別配置。

簡單使用

實作 Input Action (訊號派送者)

using System;
using OxGKit.InputSystem;
using UnityEngine.InputSystem;

public class PlayerAction : IInputAction
{
// 自定義輸入事件 (由訂閱者訂閱)
public event Action<MoveInputComposite.MoveInput> onMoveAction;

public void OnCreate()
{
// 註冊時取得已註冊的 Control Map 進行事件綁定
var ctrls = Inputs.CM.GetControlMap<PlayerControls>();
if (ctrls != null)
{
// add move input performed (player move)
ctrls.Player.Move.performed += this.OnMoveAction;
// add move input canceled to reset input data
ctrls.Player.Move.canceled += this.OnMoveAction;
}
}

public void OnUpdate(float dt)
{
// 可於此進行輪詢式輸入檢測 (由 Inputs.IA.DriveUpdate 驅動)
}

public void RemoveAllListeners()
{
this.onMoveAction = null;
}

protected void OnMoveAction(InputAction.CallbackContext context)
{
// If there is a special input can make composite by yourself
// Read your composite values
var moveInput = context.ReadValue<MoveInputComposite.MoveInput>();
this.onMoveAction?.Invoke(moveInput);
}
}

註冊與驅動更新

using OxGKit.InputSystem;
using UnityEngine;

public class InputDemo : MonoBehaviour
{
private void Awake()
{
// If use Unity New Input System must register control maps
Inputs.CM.RegisterControlMap<PlayerControls>();

// Register an input action (after control maps registered)
Inputs.IA.RegisterInputAction<PlayerAction>();
}

private void OnEnable()
{
// Add handle event
Inputs.IA.GetInputAction<PlayerAction>().onMoveAction += this._OnMoveAction;
}

private void OnDisable()
{
// Del handle event
Inputs.IA.GetInputAction<PlayerAction>().onMoveAction -= this._OnMoveAction;
}

private void Update()
{
// Call by Main MonoBehaviour (Main Program)
Inputs.IA.DriveUpdate(Time.unscaledDeltaTime);
}

private void _OnMoveAction(MoveInputComposite.MoveInput moveInput)
{
// Records move input signals and input data
}
}

重要 註冊順序:先註冊 Control Maps,再註冊 Input Actions (Input Action 的 OnCreate 通常會取得 Control Map 進行綁定)。

開關控制表 (Control Map)

// 停用整組控制表 (例如 UI 模式或過場動畫時)
Inputs.CM.SetActive<PlayerControls>(false);

// 檢查控制表啟用狀態
bool isActive = Inputs.CM.IsActive<PlayerControls>();

[參考 Example]


Installation

Install via git URL
Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/InputSystem/Scripts to Package Manager

第三方庫 (需自行安裝)

Samples (Package Manager -> Samples)


模塊 API


Demo

InputSystem Demo