Reload Scene
Understand how disabling scene reload on enter Play mode affects your application and how you can compensate for these effects in your code.
読み終わるまでの所要時間 8 分最終更新 1ヶ月前
デフォルトでは、Reload Scene は有効になっています。つまり、再生モードに切り替えると、Unity は既存のシーンゲームオブジェクトをすべて破棄し、ディスクからシーンをリロードします。Unity がこれを行うのにかかる時間は、シーンが複雑になるほど長くなります。つまり、プロジェクトが複雑になるほど、再生ボタンを押してからエディターにシーンが完全に読み込まれるまでの待ち時間は長くなります。
シーンのリロードを無効にすると、処理時間が短縮されます。これにより、プロジェクトの開発をより速く繰り返すことができます。ディスクからシーンをリロードする代わりに、シーンの変更されたコンテンツのみがリセットされます。これにより、シーンのアンロードとリロードによる時間とパフォーマンスへの影響を回避できます。Unity は引き続き、新規にロードされたかのように、同じ初期化関数 (、、 など) を呼び出します。
OnEnableOnDisableOnDestroyシーンのリロードの無効化
Reload Scene を無効にすると、エディターでアプリケーションを起動するのにかかる時間は、ビルドされたバージョンの起動時間を表すものではなくなります。したがって、プロジェクトの起動時に何が起こっているのかを正確にデバッグまたはプロファイルしたい場合は、Reload Scene を有効にして、ビルドされたバージョンで発生する実際のロード時間とプロセスをより正確に表す必要があります。
詳細については、再生モードの設定方法を参照してください。
Reload Scene を無効にするには、以下を行います。
-
Edit > Project Settings の順に選択して Project Settings ウィンドウを開きます。
-
Editor タブをクリックします。
-
Enter Play Mode Settings セクションの When entering play mode ドロップダウンメニューで、以下のいずれかを行います。
- シーンのリロードを無効にしてドメインのリロードを有効にするには、Reload Domain only を選択します。
- ドメインのリロードとシーンのリロードの両方を無効にするには、Do not reload Domain or Scene を選択します。
シーンのリロードをスキップする場合の効果
Reload Scene を無効にしても、プロジェクトへの副作用はほとんどありません。ただし、Reload Scene は Reload Domain と密接に関連しているため、いくつかの重要な違いがあります。
-
シリアライズされていない ScriptableObject フィールドおよび MonoBehaviour フィールドは、編集モードに戻るときに再生モード中に割り当てられた値を維持します。これは、Unity が既存のオブジェクトを再作成せず、コンストラクターも呼び出さないためです。異なるコンテキストでシリアライズされるものとされないものを理解するには、Unity がシリアル化を使用する方法を参照してください。private フィールドは、通常のビルドパイプラインの一部としてシリアライズされるのではなく、エディターのスクリプトのホットリロードの一部としてシリアライズされることに****注意してください。再生モードで変更した private フィールドが、Enter 再生モードでのシーンとドメインのリロードが無効になっていても、再生モードで元の値にリセットされる場合があるのはこのためです。
-
Unity は、ドメインのリロード中に配列/リストタイプの null private フィールドと内部フィールドを空の配列/リストオブジェクトに変換し、ランタイム (エディター以外) のスクリプトでは null 以外を維持します。
-
を使用するスクリプト、または
ExecuteInEditModeスクリプトは、ExecuteAlwaysの呼び出しまたはOnDestroyの呼び出しを受信しません。Unity は Awake を呼び出さず、Awakeプロパティをチェックする Awake/OnEnable メソッドで再生モードの変更時にEditorApplication.isPlayingがすでに true の場合のみ OnEnable を呼び出します。ランタイム (編集不可) スクリプトの非シリアライズフィールドは編集モードではアクティブではないため、問題になりません。ただし、EditorApplication.isPlayingまたはExecuteInEditModeでマークされたスクリプトはそれら自体を変更したり、他のランタイムスクリプトのフィールドに接触したりする場合があります。これを回避するには、OnEnable コールバックの影響を受けるフィールドを独自に初期化します。ExecuteAlways