模塊介紹
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 InputSystem 與 OxGKit.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.RegisterControlMap與Inputs.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 |
第三方庫 (需自行安裝)
- 使用 Unity New InputSystem v1.5.1 or higher,透過 Package Manager -> Add package by name com.unity.inputsystem 安裝
- 使用 OxGKit.LoggingSystem, Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/LoggingSystem/Scripts to Package Manager
Samples (Package Manager -> Samples)
- AI Agent Skills (參考 AI Agent Skills)
- InputSystem Demo
模塊 API
- Runtime
- Inputs (using OxGKit.InputSystem)
- IInputAction (using OxGKit.InputSystem)
Demo
InputSystem Demo