UniTaskをEdit Modeで使うときに気を付けることについてまとめました。
- UniTask.DelayにはDelayType.Realtimeを
- UniTask.DelayFrameは使わない
- PlayerLoopTimingはEditorApplication.updateになる
- 参考
Unity2020.1.10
UniTask 2.0.37
UniTask.DelayにはDelayType.Realtimeを
UniTask.DelayはTime.deltaTimeを使って経過時間を計測しています。
このTime.deltaTimeはエディタでは動かないため、正確に時間を測定できません。
await UniTask.Delay(1000);
エディタでDelayを使う場合には第二引数にDelayType.Realtimeを指定します。
これはStopwatchクラスを使った実装になっているためエディタでも時間を測定できます。
await UniTask.Delay(1000, DelayType.Realtime);
EditModeと使い分けるならこんな感じでしょうか。
#if UNITY_EDITOR if (Application.isPlaying) { await UniTask.Delay(1000); } else { await UniTask.Delay(1000, DelayType.Realtime); } #else await UniTask.Delay(1000); #endif
追記: 最新バージョンは自動的にRealtimeに
こちら最新のUniTaskでは自動的にRealtimeにフォールバックされるようになったとのことです!
最新のversionは自動的にRealtimeにフォールバックされるようになりました! https://t.co/M76GpNudfR
— neuecc (@neuecc) 2021年4月8日
Taskでもいい
また、ここだけTaskに置き換えることでも対応できます。
await Task.Delay(1000);
UniTask.DelayFrameは使わない
UniTask.DelayFrameにはTime.frameCountを使っているため、これもエディタでは動きません。
UniTask.DelayFrameはEdit Mode用スクリプトでは使わないようにするべきです。
PlayerLoopTimingはEditorApplication.updateになる
UniTaskにはPlayerLoopTimingを指定できる機能があります。
// 次のPostLateUpdate後まで待つ
await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate);
これらに関してもEdit ModeにはPlayer Loopの概念がないので機能しません。
Edit Modeの場合、UniTaskはEditorApplication.updateで更新されるため、
全てのPlayerLoopTimingはEditorApplication.updateのタイミングに変換されます。