この記事でのバージョン
Unity 2020.3.25f1
はじめに
Unityである程度の規模の物を作っていると問題になってくるのが、コードを変更した後の待ち時間です。
コンパイルやドメインリロードを行うため、ある程度の時間はしょうがないのですが、
あまりに長くなると開発全体の効率に悪影響を及ぼすため、適度に最適化が必要です。
と言うことで今回は主に以下の記事を参考にプログラム変更後の待ち時間を短縮する方法のご紹介です!
ちなみにこの記事によると、ちゃんと最適化をすれば
ほとんどのプロジェクトは5秒でリロード出来るようになるそうです……!
Most projects should be able to achieve a 5 second reload time, almost regardless of overall size.
DeepL翻訳
ほとんどのプロジェクトでは、全体のサイズにほぼ関係なく、5秒のリロードタイムを実現できるはずです。
目次
- はじめに
- 目次
- Unityのアップデート
- Directory Monitoring
- Assembly Definition Files
- 大きなデータをシリアライズ可能にしない
- OnAfterDeserialize, OnBeforeSerialize, ExecuteInEditModeの乱用を避ける
- InitializeOnLoad, OnPostProcessAllAssetsの乱用も避ける
- シーンのサイズを減らす
- 必要のないウィンドウを閉じる
- Unityの再起動
Unityのアップデート
Unityのバージョンによってはアップデートするだけで待ち時間が短縮される場合があります。
例えばUnity 2020.2ではコンパイル時間最適化関連の要素も多く含まれています。
プロジェクトの複雑度が増してくると、新しくコードに変更を加えたときのコンパイルに時間がかかるようになってきて、チームのワークフローや生産性に影響を及ぼし始めます。Unity 2020.2 に向けて、コンパイル時間を最適化するために役立つ複数の機能を設計しました。
もちろん、アップデートした後にそれまでと同じようにプロジェクトが動作する保証は無いので、
アップデート後の対応作業は必要になるかもしれない点には注意が必要です。
Directory Monitoring
Unityはプロジェクト内のファイルが増えるほど、変更をチェックする時間が長くなりますが、
そのチェック時間を高速(ほぼ0)にするDirectory Monitoringという機能があります。
(※Windows限定の機能)
設定方法はEdit/Preferencesにある
GeneralのDirectory Monitoringにチェックを入れるだけ。
Assembly Definition Files
Assembly Definition Filesを使えばコンパイルする範囲を設定し、
狭い範囲のみコンパイルするようにして時間を短縮する事が出来ます。
詳しくは以前書いた以下の記事をご参照の事。
なお、どのアセンブリのコンパイルに時間がかかっているのかを測定するには
Compilation Time Visualizerがオススメです。
大きなデータをシリアライズ可能にしない
Unityはコンパイル後のドメインリロード時にシリアライズ可能なオブジェクトをシリアル化するため
大きなデータをシリアライズ可能にするのは出来るだけ避けましょう。
なお、ドメインリロードの計測にはEditor Iteration Profilerがオススメです。
OnAfterDeserialize, OnBeforeSerialize, ExecuteInEditModeの乱用を避ける
OnAfterDeserializeやOnBeforeSerialize、ExecuteInEditMode(が設定されているクラスのAwake)は
シリアル化時(≒ドメインリロード時)に実行されるため乱用したり、
重い処理を含めると待ち時間が増加してしまうため、これらを避けると待ち時間短縮に繋がります。
InitializeOnLoad, OnPostProcessAllAssetsの乱用も避ける
ドメインリロード後、Unityは変更されたC#ファイルのInitializeOnLoadやOnPostProcessAllAssets
を実行するため、こちらも乱用したり、
重い処理を含めると待ち時間が増加してしまうため、これらを避けると待ち時間短縮に繋がります。
シーンのサイズを減らす
シーンに最初から配置されているオブジェクトやスクリプトのサイズ
を減らしたり違うシーンに分割する事でも待ち時間を短縮出来る場合があります。
ただし、アセット(画像とかモデルとか)のサイズではなく重要なのはC#クラスのサイズです。
必要のないウィンドウを閉じる
Unityの標準機能のウィンドウにしろエディタ拡張のウィンドウにしろ
開いてる物はドメインリロード時にシリアル化されたりコンストラクタを実行されたりするので、
使わない物は出来るだけ閉じると待ち時間短縮に繋がります。
またウィンドウのコンストラクタの処理やUIの描画を軽くする(減らす)事も効果があります。
Unityの再起動
Unityは何日も起動しっぱなしにしているとドメインリロード時間が長くなる傾向があります。
なので、Unityを再起動する事で待ち時間が短縮される事があります。
また、再起動前にProjectウィンドウを右クリックしたメニューにある
Reimport Allを実行した方が良い場合もあります。