【Unity】開発時のマルチシーンの管理

2024年4月25日

Unityのヒエラルキーのマルチシーン機能自体はGitで直接管理されるものではありません。Unityのプロジェクトでマルチシーンを使用する場合、各シーンファイル(.unityファイル)はGitで管理することができますが、ヒエラルキー内のシーンの積み重ねや組み合わせの状態(どのシーンがロードされているかなど)は、通常、シーンファイルには保存されません。これらの状態はUnityエディタのセッション情報の一部であり、プロジェクトの設定やエディタの状態に依存するため、Gitでのバージョン管理の対象外となります。

シーンの状態は、個別の開発PCに保存されている

Gitのリポジトリに反映されません。つまり、開発メンバーにも反映されません

このまま、一度Unityを終了しても状態は保持されます
Unityエディタの状態が再起動後に復元される理由は、Unityがエディタの状態を内部的に一時ファイルに保存しているためです。これにより、エディタのセッション情報が保存され、Unityを閉じて再起動しても、前回の作業状態に近い形でエディタが開かれます。

Unityが保存する情報

オープンされているシーンの状態

どのシーンが開かれていたか、およびそれらのシーンの積み重ねの順序。

ヒエラルキーウィンドウの状態

オブジェクトの展開状態や選択されていたオブジェクト。

インスペクターウィンドウの状態

編集中だったコンポーネントの詳細。

その他のレイアウト設定

エディタのウィンドウレイアウトやカスタム設定。

保存場所

この情報は通常、Unityのローカルキャッシュや設定ファイルに保存されます。具体的には以下の場所にデータが保持されることが多いです:

Library フォルダ

Unityプロジェクトディレクトリ内のLibraryフォルダには、プロジェクトの状態やエディタセッションのキャッシュが含まれています。このフォルダはプロジェクト固有の情報を保持し、プロジェクトの再読み込みや再起動時にUnityエディタによって参照されます。

Unityはこれらのデータを利用して、ユーザーが前回終了した時の作業環境を可能な限り再現します。ただし、これらの情報は通常Gitなどのバージョン管理システムには含まれないため、異なるマシン間でエディタの状態を共有することはできません。

UnityプロジェクトのLibraryフォルダは、プロジェクトの内部処理やエディタの効率的な運用に必要なデータを管理する重要な役割を担います。以下は、Libraryフォルダに保存されている主な内容です:

  1. メタデータファイル:
    • 各アセットのメタデータやインポート設定が保存されます。これにはアセットのGUIDや、アセットをインポートする際のオプションなどが含まれ、アセットの管理と参照のために使われます。
  2. アセットインポートデータ:
    • アセットのインポートプロセス中に生成される中間ファイルやプロセス後のデータがここに保存されます。これはテクスチャ、オーディオクリップ、3Dモデルなど、異なる形式のファイルがどのようにUnity内で扱われるかを定義します。
  3. コンパイルされたスクリプト:
    • プロジェクト内のC#スクリプトがコンパイルされた後のアセンブリ(DLLファイルなど)が保存されます。これにより、エディタやゲームの実行時にスクリプトが効率的にロードされます。
  4. アセットデータベース:
    • プロジェクト内の全アセットに関するデータベースが含まれます。これはアセットの参照、検索、および管理を助けるためのもので、アセットの一覧、状態、依存関係などが記録されています。
  5. エディタの状態キャッシュ:
    • エディタの各種設定や最近のプロジェクト履歴、オープンされたシーンのリストなど、セッション間でのエディタの状態を保存するためのファイルが含まれます。
  6. ビルド設定とプラットフォームデータ:
    • プロジェクトのビルド設定やプラットフォーム固有の設定が保存されます。これにより、異なるターゲットプラットフォームへのビルドが容易になります。

Libraryフォルダはこれらの情報をキャッシュとして保持し、Unityエディタやビルドプロセスの効率を大幅に向上させます。このフォルダはプロジェクト固有の情報が集中しているため、バージョン管理システム(例えばGit)には通常含めないことが推奨されています。これは、異なる開発環境間での互換性の問題を避けるためです。

UserSettings フォルダ

エディタのウィンドウレイアウトと配置が保存されています
ユーザーがカスタマイズしたエディタのウィンドウの配置やサイズなど、個々の開発者の環境設定がここに保存されます。
エディタのユーザー設定も保存されます
エディタのテーマ、フォントサイズ、その他のユーザーインターフェイス設定など、個々のユーザーにカスタマイズされた設定が保存されます。

マルチシーンの配置状態を保存する方法

Unityでマルチシーン開発を行う場合、シーンの配置状態を効率よく管理する方法がいくつかあります。以下の手順でシーンの配置を保存し、一貫性を保つことができます。

1. シーンのセットアップ

開発に必要な全てのシーンを開いてください。

2. シーンマネージャーの使用

Unityでは複数のシーンを同時にロードして管理するためのシーンマネージャーを使用できます。SceneManagerクラスを使ってシーンのロード、アンロード、および切り替えをプログラムで制御できます。これをスクリプトで管理することで、毎回同じシーン構成をロードできます。

UnityでSceneManagerクラスを使って、複数のシーンを同時にロードして管理するサンプルスクリプトをここに示します。このスクリプトは、プログラムによってシーンのロード、アンロード、および切り替えを制御する方法を提供します。これを利用して、一定のシーン構成を自動的にロードし、動的なシーン管理を実現できます。

SceneManager を使用したシーン管理スクリプト

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneController : MonoBehaviour
{
    void Start()
    {
        LoadInitialScenes();
    }

    // 初期シーンをロードするメソッド
    void LoadInitialScenes()
    {
        SceneManager.LoadScene("MainScene", LoadSceneMode.Single); // メインシーンをシングルモードでロード
        SceneManager.LoadScene("UI", LoadSceneMode.Additive); // UIシーンをアディティブモードでロード
        SceneManager.LoadScene("Environment", LoadSceneMode.Additive); // 環境シーンもアディティブモードでロード
    }

    // シーンをアンロードするメソッド
    public void UnloadScene(string sceneName)
    {
        SceneManager.UnloadSceneAsync(sceneName);
    }

    // 新しいシーンをロードするメソッド
    public void LoadNewScene(string sceneName)
    {
        SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
    }
}

スクリプトの使用方法

  1. スクリプトの保存: このSceneControllerスクリプトをUnityプロジェクトの任意のスクリプトファイルとして保存します。
  2. コンポーネントとして追加: このスクリプトをゲームオブジェクトにコンポーネントとして追加します。これがシーン制御の中心となります。
  3. スクリプトのカスタマイズ: 必要に応じてシーン名を変更し、特定のゲームの要件に合わせてロードおよびアンロードするシーンを調整します。

機能説明

  • LoadInitialScenesメソッドでは、最初にロードするシーンを定義しています。MainSceneをシングルロードモードでロードし、その後に他のシーン(例:UI, Environment)をアディティブモードで追加しています。
  • UnloadSceneメソッドでは、不要になったシーンを非同期でアンロードします。
  • LoadNewSceneメソッドでは、新たにシーンをアディティブモードで追加します。

このようにSceneManagerを使用することで、Unityでの複数シーンの管理が非常に柔軟かつ効率的に行えます。

3. エディタースクリプトを使用

Unityのエディタースクリプティング機能を使用して、特定のシーン構成を保存し、エディタで簡単にアクセスできるようにすることが可能です。たとえば、カスタムメニューアイテムを作成して、そのメニューから特定のシーン構成をロードするスクリプトを実行することができます。

4. シーンのプリセット

よく使うシーンの組み合わせがある場合、その組み合わせをプリセットとして保存しておくことも有効です。例えば、エディタスクリプトでEditorBuildSettings.scenesに必要なシーンを登録し、それを簡単に切り替えられるようにする方法です。

Unityにおいて、特定のシーン構成を「プリセット」として保存し、簡単にアクセスできるようにするための方法を詳しく説明します。この方法は、エディタースクリプトを使って、ビルド設定にシーンを登録することにより実現されます。

ステップ 1: エディタースクリプトの作成

まず、Unityエディターにカスタムメニューオプションを追加し、そこから特定のシーン構成を選択してロードできるようにするスクリプトを作成します。以下はその一例です。

using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;

public class ScenePresetLoader : MonoBehaviour
{
    [MenuItem("Scene Presets/Load Default Set")]
    private static void LoadDefaultSceneSet()
    {
        string[] scenePaths = {
            "Assets/Scenes/Scene1.unity",
            "Assets/Scenes/Scene2.unity",
            "Assets/Scenes/Scene3.unity"
        };

        foreach (string path in scenePaths)
        {
            EditorSceneManager.OpenScene(path, OpenSceneMode.Additive);
        }
    }
}

このスクリプトは、Scene Presetsという新しいメニュー項目をエディターに追加します。Load Default Setを選択すると、定義されたシーンが追加モードで開かれます。

ステップ 2: ビルド設定の活用

シーンのプリセットを利用する別の方法として、EditorBuildSettings.scenesを使用して、特定のシーン構成をビルド設定に登録する方法があります。以下のスクリプトはその設定を行います。

このスクリプトはBuild Settings/Set Scene Presetメニューを追加し、選択すると指定されたシーンがビルド設定に追加されます。これにより、開発中やビルド時に同じシーン構成を簡単に使用できます。

まとめ

これらの方法を利用することで、Unityのマルチシーン開発で必要なシーン構成を素早く設定し、効率的に作業を行うことが可能です。特に、複数のシーンを頻繁に切り替える作業が必要な場合に役立ちます。

5. シーンの自動ロード

アプリケーションの開始時に自動的に複数のシーンをロードするスクリプトを作成することもできます。これにより、アプリケーションの実行開始時に毎回同じシーン構成を保証することが可能になります。

Unityでアプリケーションの開始時に自動的に複数のシーンをロードするスクリプトを作成することで、実行開始時に毎回同じシーン構成を保証することができます。以下にそのためのスクリプトのサンプルを示します。このスクリプトは、アプリケーションの開始時に指定されたシーンを自動的にロードします。

AutoLoadScenes スクリプト

using UnityEngine;
using UnityEngine.SceneManagement;

public class AutoLoadScenes : MonoBehaviour
{
    // 最初にロードするシーンのリスト
    public string[] scenesToLoad;

    void Start()
    {
        // 既存のシーン以外のシーンをロードする
        foreach (string sceneName in scenesToLoad)
        {
            SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
        }
    }
}

スクリプトの使用方法

  1. スクリプトの保存: 上記のAutoLoadScenesスクリプトをUnityプロジェクトの任意のスクリプトファイルとして保存します。
  2. コンポーネントとして追加: このスクリプトをゲームのメインカメラや専用のマネージャーオブジェクトなど、シーンの初期化時に存在するゲームオブジェクトにアタッチします。
  3. シーン名の設定: インスペクターでscenesToLoad配列にロードしたいシーンの名前を入力します。

機能説明

  • scenesToLoad 配列を通じて、開始時にロードしたいシーンの名前を設定します。これにより、アプリケーションの初期化フェーズでこれらのシーンが自動的にロードされます。
  • LoadSceneMode.Additive を使用して、メインシーンに追加的に他のシーンをロードします。これにより、メインシーンの内容を保持したまま、他のコンテンツを追加できます。

このスクリプトにより、特定のシーン構成をアプリケーションの起動時に自動的に設定することができ、開発やテストの効率を向上させることができます。

マルチシーンの配置状態を保存しておくメリット

マルチシーンの配置状態を保存しておくことには、Unityでの開発において多くのメリットがあります。以下はその主な利点です:

1. 開発の効率化

シーンの構成を保存しておくことで、開発プロセスが効率化されます。プロジェクトを開くたびに必要なシーンを手動でロードする手間が省け、すぐに作業を開始できます。

2. エラーの低減

複数のシーンにわたってコンポーネントやデータを共有する場合、一貫したシーン構成を維持することで、シーン間の依存関係によるエラーや問題の発生を防ぎます。これにより、開発中のデバッグが容易になり、安定した動作が保証されます。

3. チーム内での一貫性の確保

大規模なチームや複数人でのプロジェクト作業において、シーンの構成を共有しておくことで、全員が同じ環境で作業できるようになります。これは、誤解やコミュニケーションの問題を減少させ、プロジェクトの整合性を高めます。

4. テストとデバッグの容易化

特定のシーン構成を素早くロードできることで、特定の機能やバグのテストが簡単になります。また、シーンを迅速に切り替えることで、異なるゲームの状態や条件下でのテストが効率的に行えます。

5. ビルドプロセスの自動化

シーンの配置状態を事前に定義しておくことで、ビルドプロセスを自動化しやすくなります。必要なシーンが予め設定されているため、ビルドの際にシーンの選択ミスが減り、安定したビルドプロセスを維持できます。

6. 複数のプラットフォームへの対応

異なるプラットフォーム向けに異なるシーン構成が必要な場合でも、プリセットを使って効率的に管理できます。これにより、プラットフォームごとの特有の設定や最適化を柔軟に行うことが可能です。

これらのメリットにより、Unityでのマルチシーンの開発がよりスムーズに、かつ効率的に行えるようになります。特に複雑なプロジェクトや大規模なチームでの作業において、このような管理方法は大きなアドバンテージとなります。

Unity

Posted by hidepon