LoginSignup
3
1

More than 1 year has passed since last update.

キー入力、マウス入力をIUniTaskAsyncEnumerable<T>に変換して使う

Last updated at Posted at 2021-08-24

はじめに

この記事は キー入力、マウス入力をIObservableに変換して使う の続編みたいなものです。
今回はUniTaskの新しい機能 IUniTaskAsyncEnumerable に変換して使えるようにしてみました。

導入方法

PackageManagerを使用して git / OpenUMP / OpenUMP CLI からインストールできます。

詳しくはGitHubからどうぞ

実行環境

概要

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 を好んで使う人。。。この世に何人いるでしょうか。。。。。

モノ好きは使ってみてはいかがでしょうか。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1