はじめに
この記事は キー入力、マウス入力をIObservableに変換して使う の続編みたいなものです。
今回はUniTaskの新しい機能 IUniTaskAsyncEnumerable
に変換して使えるようにしてみました。
導入方法
PackageManagerを使用して git / OpenUMP / OpenUMP CLI からインストールできます。
詳しくはGitHubからどうぞ
実行環境
- Unity 2020.3.2f1
- UniTask 2.2.5
- InputAsAsyncEnumerable 1.0.0
概要
Unity の InputManager による入力の一部を IUniTaskAsynEnumerable
に変換して使うことができます。
using InputAsAE; // 名前空間の参照はコレ
InputAsAsyncEnumerable
.GetKey(KeyCode.Space) // Input.GetKey(KeyCode)に相当する
.ForEachAwaitWithCancellationAsync(async (_, ct) => {
Debug.Log("Space");
await UniTask.DelayFrame(100, cancellationToken : ct);
}, this.GetCancellationTokenOnDestroy());
InputAsAsyncEnumerable.AnyKeyDown.ForEachAsync(_ => Debug.Log("AnyKeyDown")); // anyKeyDown
InputAsAsyncEnumerable
.AxisRaw("Vertical") //AxisRaw
.Subscribe(async (y, ct) => {
await UniTask.Yield(ct);
Debug.Log("AxisRaw:" + y);
}, this.GetCancellationTokenOnDestroy());
対応しているメソッドは以下の通りです。
- GetKey, GetKeyDown, GetKeyUp
- anyKey, anyKeyDown
- Axis, AxisRaw
- GetMouseButton, GetMouseButtonDown, GetMouseButtonUp
- GetButton, GetButtonDown, GetButtonUp
おわりに
ここからはただの感想です。
UniTask が進化して v2 になり UniTask.Linq
が追加されました。
しかし使う機会があまり無いように思えます。実際素晴らしい機能なのですが、かなりマニア向けです。
私は ForEachAwaitAsync
の取りこぼしをする性質が好きでよく使っています。
取りこぼしとは、非同期なデリゲートを実行している間は流れてくるメッセージを無視する機能です。
UniTaskAsyncEnumerable.EveryUpdate()
や uGUIのイベントを UniTaskAsyncEnumerable に変換したとき等に発生します。
上記の例では、いくら高速でスペースキーを連打しても100フレームに1回しか入力を検知しません。
使いどころはまぁほぼ無いと言っていいかもしれないですが、任意のタイミングでささっと非同期処理をテストしたいときに少し使えるかもしれません。
最近は InputSystem
が出てきて、使ってる人はそもそも このライブラリを使うことすらできません。
InputManager を使ってて UniTaskAsyncEnumerable を好んで使う人。。。この世に何人いるでしょうか。。。。。
モノ好きは使ってみてはいかがでしょうか。