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); });