ObservableStateMachineTriggerのUniTask実装『UniTaskStateMachineTrigger』
※この記事は2022年に執筆したものです
UniRx には ObservableStateMachineTrigger という機能が搭載されています。 今回はそれのUniTask実装版が欲しくなったので自作してみました。
使い方は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);
});