ドメインリロードとシーンリロードの無効化の詳細
Understand the work Unity performs during domain and scene reload
読み終わるまでの所要時間 6 分最終更新 1ヶ月前
ドメインリロードとシーンリロードが無効の時に Unity がスキップすること
大きくとらえると、再生モードに入るには、主に以下のような段階を経る必要があります。
- 現在のシーンをバックアップ。これは、シーンが修正されたときにのみ起こります。Unity が再生モードを終了したときのシーンを、再生モードを開始する前の状態に戻すことができます。
- ドメインのリロード。スクリプティングドメインをリロードすることで、スクリプトの状態をリセットします。
- シーンのリロード。シーンをリロードすることで、シーンの状態をリセットします。
- シーンの更新。これは、レンダリングなしで行う場合と、レンダリングありで行う場合の 2 回発生します。
ドメインリロード と シーンリロード を組み合わせたタスクは、スクリプティングドメインをリセットし、プレイヤーで実行されるようなアプリケーションの起動動作をシミュレートします。Project Settings でこれらを無効にすると、Unity はこれらのステップをスキップします。
以下の図は、ドメインリロードとシーンリロードが無効の場合に、Unity がスキップするイベントについての詳細情報を示しています。青色はドメインリロードが無効のときに Unity がスキップするイベント、緑色はシーンリロードが無効のときに Unity がスキップするイベントを示しています。
シーンリロードとドメインリロードの両方が有効な時に Unity が行うこと
以下は、再生モードになったときにシーンリロードとドメインリロードが有効な場合に、Unity が行う処理とイベントすべてのリストです。
-
AssemblyReloadEventイベントが発生します。
beforeAssemblyReload -
C# ドメインが停止します。a.がすべての ScriptableObject と MonoBehaviour に対して呼び出されます。
OnDisable()b.Unity はすべての非同期操作が終了するのを待ちます。 -
すべての MonoBehaviour と ScriptableObject の状態はシリアライズされます。a.が呼び出されます。
OnBeforeSerialize()b.プライベートとパブリックのフィールド値は、でマークされたもの以外はすべてシリアライズされます。[NonSerialized] -
マネージラッパーはネイティブの Unity オブジェクトから切り離されます。
-
Unity の子ドメインがリロードされます。a.Mono ドメインがアンロードされます。i.イベントが発生します。
AppDomain.DomainUnloadii. Unity の子ドメインが破棄されます。-
GC とファイナライザーが呼び出されます。
-
スレッドが終了します。
-
すべての JIT 情報が削除されます。
b.新しい Unity の子ドメインが作成されます。 -
-
アセンブリがロードされます。a.システムアセンブリがロードされます。b.Unity アセンブリがロードされます。c.ユーザーアセンブリがロードされます。
-
同期コンテキストが初期化されます。
-
スクリプトの状態が復元されます。a.すべての Unity オブジェクトのスクリプト可能な部分が再作成されます。i.コンストラクターが呼び出され、静的変数にデフォルト値が割り当てられます。b.すべての Unity オブジェクトの状態はデシリアライズされます。i.すべての Unity オブジェクトのシリアライズされた状態が復元されます。
- イベントが発生します。
OnAfterDeserialize
ii.が呼び出されます。OnValidate()iii.属性を使用するスクリプトの場合:[ExecuteInEditMode]-
が呼び出されます。
OnEnable() -
が呼び出されます。
OnDisable() -
が呼び出されます。
OnDestroy()
-
InitializeOnLoad および InitializeOnLoadMethod を持つメソッドが呼び出されます。
-
AssemblyReloadEventが呼び出されます。
afterAssemblyReload