ドキュメント

Unity Engine

Unity Engine

シーン リロードが無効な状態で再生モードに入る

Enter 再生モードでシーンのリロードを無効にするとアプリケーションにどのような影響があり、コードでこれらの影響を補うことができるかを理解します。
読み終わるまでの所要時間 7 分最終更新 3日前

再生モード開始時のシーン リロードはデフォルトでイネーブルです。つまり、再生モードに入ると、Unity は既存のシーンGameObjectsオブジェクトをすべて破棄し、ディスクからシーンを再ロードします。プロジェクトが複雑になると、再生ボタンを押してからシーンがエディタに完全に読み込まれるまでの時間が長くなります。
シーンの再ロードを使用不可にすると、処理にかかる時間が短縮されます。ディスクからシーンを再ロードする代わりに、Unity はシーンの変更内容のみをリセットする。Unity は、シーンがロードされたばかりの場合と同じイベント関数 (
OnEnable
、
OnDisable
、
OnDestroy
など) を呼び出します。

再生モードに入るときのシーンリロードの無効化の影響

シーンリロードを使用不可にすると、エディターでのアプリケーションの開始時間が、ビルドバージョンでの起動時間ではなくなります。プロジェクトの起動時に発生することを正確にデバッグまたはプロファイルする場合は、シーンの再ロードを有効にして、アプリケーションのビルドバージョンで発生する true の読み込み時間とプロセスをより正確に表す必要があります。
そうしないと、シーンリロードを無効にしてもプロジェクトへの影響は最小限に抑えられます。ただし、シーンのリロードはドメインリロードと密接に関連しているため、いくつかの重要な違いがあります。
  • Unity は既存のオブジェクトやコールコンストラクターを再作成しません。つまり、編集モードに戻ったときに再生モード中に割り当てられた値が、シリアライズされていないフィールドによって維持されます。これは、MonoBehaviour、ScriptableObject、独自のカスタム C# タイプなど、すべてのスクリプトタイプのフィールドに適用されます。異なるコンテキストでシリアライズされるものとされないものの詳細については、シリアル化規則 を参照してください。
    • 注
      private
      フィールドは、通常のビルドパイプラインの一部としてシリアライズされるのではなく、**エディターの スクリプトのホットリロード の一部としてシリアライズされます。再生モードで変更した
      private
      フィールドが、Enter 再生モードでのシーンとドメインのリロードが無効になっていても、再生モードで元の値にリセットされる場合があるのはこのためです。
  • Unity は、ドメイン リロード中に配列および
    List
    型の null
    private
    および
    internal
    フィールドを空の配列または
    List
    オブジェクトに変換し、ランタイム(エディター以外)のスクリプトでは null 以外のままにします。
  • [ExecuteInEditMode]
    または
    [ExecuteAlways]
    で装飾されたスクリプトは、
    OnDestroy
    コールまたは
    Awake
    コールを受信しません。編集モードでは、これらのスクリプトは独自のフィールドや他のランタイムスクリプトのフィールドを変更できます。これを軽減するには、
    OnEnable
    コールバックの影響を受けるフィールドを、
    EditorApplication.isPlaying
    の値をチェックする条件内のコードで初期化します。再生モードと編集モードコードを分けることの重要性に関する詳細なコンテキストの例については、
    [ExecuteAlways]
    API の説明 を参照してください。
シーン リロードがディセーブルでスキップされるイベントの詳細は、『 ドメインとシーン リロードのディセーブル化の詳細 』を参照してください。

追加リソース