ObservableStateMachineTriggerのUniTask実装『UniTaskStateMachineTrigger』

※この記事は2022年に執筆したものです

UniRx には ObservableStateMachineTrigger という機能が搭載されています。 今回はそれのUniTask実装版が欲しくなったので自作してみました。

github.com

使い方はObservableStateMachineTriggerとほぼ一緒です。

単発で結果が欲しい場合は OnState~~Async を await することで結果が得られます。

var animator = GetComponent<Animator>();
var trigger = animator.GetBehaviour<UniTaskStateMachineTrigger>();
await trigger.OnStateEnterAsync();

これだと意図しない State で タスクが完了してしまうことがあるので デリゲートで完了条件を指定できます。

await trigger.OnStateEnterAsync(info => info.StateInfo.IsName("Walk"));

複数の結果を受け取るには ~~AsAsyncEnumerable を使えます。 返り値が IUniTaskAsyncEnumerable<T> なので await foreach で処理できます。

trigger.OnStateExitAsAsyncEnumerable()
       .Where(info => info.StateInfo.fullPathHash == lastStateHash)
       .Where(info => info.StateInfo.normalizedTime <= 1.0f)
       .ForEachAwaitAsync(async info =>
       {
           Debug.Log("exit state");
           await UniTask.Delay(1000);
       });