Version: Unity 6.0 (6000.0)
言語 : 日本語
Reload Scene
スクリプトのシリアル化

ドメインリロードとシーンリロードの無効化の詳細

ドメインリロードとシーンリロードが無効の時に Unity がスキップすること

大きくとらえると、再生モードに入るには、主に以下のような段階を経る必要があります。

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

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

以下の図は、ドメインリロードとシーンリロードが無効の場合に、Unity がスキップするイベントについての詳細情報を示しています。青色はドメインリロードが無効のときに Unity がスキップするイベント、緑色はシーンリロードが無効のときに Unity がスキップするイベントを示しています。

シーンリロードとドメインリロードの両方が有効な時に Unity が行うこと

以下は、再生モードになったときにシーンリロードとドメインリロードが有効な場合に、Unity が行う処理とイベントすべてのリストです。

  1. AssemblyReloadEvent beforeAssemblyReload イベントが発生します。
  2. C# ドメインが停止します。
    a. OnDisable() がすべての ScriptableObject と MonoBehaviour に対して呼び出されます。
    b.Unity はすべての非同期操作が終了するのを待ちます。
  3. すべての MonoBehaviour と ScriptableObject の状態はシリアライズされます。
    a. OnBeforeSerialize() が呼び出されます。
    b.プライベートとパブリックのフィールド値は、[NonSerialized] でマークされたもの以外はすべてシリアライズされます。
  4. マネージラッパーはネイティブの Unity オブジェクトから切り離されます。
  5. Unity の子ドメインがリロードされます。
    a.Mono ドメインがアンロードされます。
    i.AppDomain.DomainUnload イベントが発生します。
    ii. Unity の子ドメインが破棄されます。
    1. GC とファイナライザーが呼び出されます。
    2. スレッドが終了します。
    3. すべての JIT 情報が削除されます。
    b.新しい Unity の子ドメインが作成されます。
  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. InitializeOnLoad および InitializeOnLoadMethod を持つメソッドが呼び出されます。
  10. AssemblyReloadEvent afterAssemblyReload が呼び出されます。

追加リソース

Reload Scene
スクリプトのシリアル化