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