【Unity】【UniTask】 UniTaskをエディタ(Edit Mode)で使うときに気を付けること

UniTaskをEdit Modeで使うときに気を付けることについてまとめました。

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にフォールバックされるようになったとのことです!

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のタイミングに変換されます。

参考

github.com