Version: 2023.1
言語: 日本語
Reload Scene
起動時エディタースクリプト実行

Reload Domain と Reload Scene の無効化の詳細

Reload Domain と Reload Scene が無効の時に Unity がスキップするもの

再生モードに入るには、主に次のような段階を経る必要があります。

  • 現在のシーンをバックアップ。これは、シーンが修正されたときにのみ起こります。Unity が Play Mode を終了したときのシーンを、再生モードを開始する前の状態に戻すことができます。
  • ドメインの再ロード (Reload Domain)。スクリプティングドメインを再読み込みすることで、スクリプトの状態をリセットします。
  • シーンの再ロード (Reload Scene)。シーンを再読み込みすることで、シーンの状態をリセットします。
  • シーンの更新。これは、レンダリングなしに行う場合と、レンダリングありで行う場合の 2 回発生します。

Reload DomainReload Scene を組み合わせたタスクは、スクリプティングドメインをリセットし、プレイヤーで実行されるようなアプリケーションの起動動作をシミュレートします。Project Settings でこれらを無効にすると、Unity はこれらのステップをスキップします。

下の図は、Reload Domain と Reload Scene が無効の場合に、Unity がスキップするイベントについての詳細情報を示しています。青色は Reload Domain が無効のときに Unity がスキップするイベント、緑色は Reload Scene が無効のときに Unity がスキップするイベントを示しています。

Reload Scene と Reload Domain の両方が有効な場合に Unity が行うこと

以下は、Enter Play Mode で Reload Scene と Reload Domain が有効な場合に、Unity が行う処理とイベントすべてのリストです。

  1. AssemblyReloadEventbeforeAssemblyReload イベントが発生します。
  2. C# ドメインが停止します。 a. OnDisable() がすべての ScriptableObjects と MonoBehaviours に対して呼び出されます。
    b. Unity はすべての非同期操作が終了するのを待ちます。
  3. すべての MonoBehaviours と ScriptableObjects の状態はシリアライズされます。 a. OnBeforeSerialize() が呼び出されます。
    b. プライベートとパブリックのフィールド値は、[NonSerialized] でマークされたもの以外はすべてシリアライズされます。
  4. マネージラッパーはネイティブの Unity オブジェクトから切り離されています。
  5. Unity Child Domain は再ロードされます。 a. Mono ドメインはアンロードされます。
    i. AppDomain.DomainUnload イベントが発生します。
    ii. Unity Child Domain が除去されます。
    1. GC とファイナライザーが呼び出されます。
    2. スレッドは終了されます。 3. すべての JIT 情報は削除されます。 b. 新しい Unity Child Domain が作成されます。
  6. アセンブリがロードされます。
    a. システムアセンブリがロードされます。
    b. Unity アセンブリがロードされます。
    c. ユーザーアセンブリがロードされます。
  7. 同期コンテキストが初期化されます。
  8. スクリプトの状態が復元されます。
    a. すべての Unity オブジェクトのスクリプト可能な部分が再作成されます。
    i. コンストラクターが呼び出され、静的変数はそのデフォルト値を割り当てられます。
    b. すべての Unity オブジェクトの状態はデシリアライズされます。 i. すべての Unity オブジェクトのシリアライズされた状態は復元されます。
    1. OnAfterDeserialize イベントが発生します。
    ii. OnValidate() が呼び出されます。
    iii. [ExecuteInEditMode] 属性を使うスクリプトに対して
    1. OnEnable() が呼び出されます。 2. OnDisable() が呼び出されます。
    3. OnDestroy() が呼び出されます。
  9. InitializeOnLoadInitializeOnLoadMethod を持つメソッドが呼び出されます。
  10. AssemblyReloadEventafterAssemblyReload が呼び出されます。
Reload Scene
起動時エディタースクリプト実行