Reactive Extensions for Unity Input System
ReactiveInputSystemはInput Systemのイベントやデバイス入力をObservableに変換する機能を提供するライブラリです。
- Unity 2021.3 以上 (Unity 2022.2 以上を推奨)
- Input System 1.0.0 以上
- R3 0.1.0 以上
- Window > Package ManagerからPackage Managerを開く
- 「+」ボタン > Add package from git URL
- 以下のURLを入力する
https://github.com/AnnulusGames/ReactiveInputSystem.git?path=src/ReactiveInputSystem/Assets/ReactiveInputSystem
あるいはPackages/manifest.jsonを開き、dependenciesブロックに以下を追記
{
"dependencies": {
"com.annulusgames.reactive-input-system": "https://github.com/AnnulusGames/ReactiveInputSystem.git?path=src/ReactiveInputSystem/Assets/ReactiveInputSystem"
}
}ReactiveInputSystemを導入することで、InputActionやPlayerInput, PlayerInputManagerなどのイベントをObservableに変換する拡張メソッドが追加されます。
using UnityEngine.InputSystem;
using R3;
using ReactiveInputSystem;
InputAction inputAction;
inputAction.StartedAsObservable(cancellationToken)
.Subscribe(x => ...);
inputAction.PerformedAsObservable(cancellationToken)
.Subscribe(x => ...);
inputAction.CanceledAsObservable(cancellationToken)
.Subscribe(x => ...);
PlayerInput playerInput;
playerInput.OnActionTriggeredAsObservable(cancellationToken)
.Subscribe(x => ...)InputRxクラスからあらゆるデバイスの入力をObservableとして取得することができます。
InputRx.OnKeyDown(Key.Space)
.Subscribe(_ => ...);
InputRx.OnMousePositionChanged()
.Subscribe(x => ...);
InputRx.OnGamepadButtonDown(GamepadButton.North, cancellationToken)
.Subscribe(_ => ...);また、OnAny**系のメソッドを使用することで、入力されたボタンの情報を取得できます。
InputRx.OnAnyKeyDown()
.Subscribe(key => ...);
InputRx.OnAnyMouseButtonUp()
.Subscribe(mouseButton => ...);
InputRx.OnAnyGamepadButton()
.Subscribe(gamepadButton => ...);InputRxではInputSystemクラスのイベントやInputUserのイベントをObservableに変換するメソッドも提供されています。
// InputSystem.onAfterUpdate
InputRx.OnAfterUpdate()
.Subscribe(_ => ...);
// InputSystem.onAnyButtonPress
InputRx.OnAnyButtonPress()
.Subscribe(control => ...);
// InputUser.onChange
InputRx.OnUserChange()
.Subscribe(x => ...);Control Path関連のユーティリティとしてInputControlPathExクラスが用意されています。
InputControlPathEx.GetControlPath()を用いることでKeyやMouseButton、GamepadButtonなどの列挙型からControl Pathを取得することができます。これはInputRx.OnAny**()と組み合わせてインタラクティブなリバインディングを実装する際などに便利です。
InputAction inputAction;
async Task RebindAsync(CancellationToken cancellationToken)
{
inputAction.Disable();
var path = await InputRx.OnAnyKeyDown(cancellationToken)
.Select(x => InputControlPathEx.GetControlPath(x))
.FirstAsync();
inputAction.ApplyBindingOverride(0, path);
inputAction.Enable();
}