この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:12:00

タイトル: シーン(Scene)
SEOタイトル: Unity シーン(Scene) 完全ガイド | SceneManager / Additive / Build Settings

この記事の要点
  • シーン (Scene) は Unity でゲームの1 つの状態・場面(タイトル / ステージ1 / ゲームオーバー等)を表す単位
  • ファイル拡張子は .unity、Assets フォルダ配下の任意の場所に置ける
  • 実行時の切替は SceneManager.LoadScene()、ビルドに含めるには Build Settings → Scenes In Build に登録必須
  • Additive (加算ロード) で複数シーンを同時にアクティブ化できる → UI 専用シーン / オーディオ専用シーンを分離する設計が一般的
  • 大規模シーンには Multi-Scene Editing / Streaming (Addressables / World Streaming) が有効

シーンとは

Unity におけるシーン (Scene) とは、ゲームを構成する個々の場面・画面状態を表すデータ単位です。タイトル画面・ステージ 1・ステージ 2・ショップ画面・ゲームオーバー画面など、ユーザーから見て1 つの独立した世界がシーンに対応します。

シーンはGameObject の集合と、そのプロパティ・コンポーネント設定を全て保存したファイルで、拡張子は .unity です。Assets フォルダ配下の任意の場所に置けます(一般的には Assets/Scenes/)。

シーンに含まれるもの

  • GameObject の階層構造(Hierarchy ウィンドウに見えるもの全て)
  • 各 GameObject の Transform / Component(位置、回転、コライダー、スクリプト等)
  • ライト(Directional Light / Point Light など)
  • カメラ
  • ベイク済 Lighting データ(ライトマップ)
  • NavMesh データ
  • シーンの環境設定(Skybox、Fog、Ambient Light、Lighting Settings)

シーンの新規作成と保存

操作手順
新規シーン作成File → New Scene、テンプレートを選択(Basic / 3D / 2D / VR / HD-RP / URP)
シーンを保存File → Save (Ctrl+S)、初回は名前と保存場所を指定
別名で保存File → Save As (Ctrl+Shift+S)
シーンを開くProject ウィンドウで .unity をダブルクリック、または File → Open Scene
シーンの追加(Additive)Project ウィンドウから Hierarchy にドラッグ&ドロップ

Build Settings への登録

ビルドに含めたいシーンは File → Build Settings → Scenes In Build に追加します。登録されていないシーンは実行時 LoadScene() で読み込めません(インデックス参照のとき)。

File → Build Settings... を開く
  ↓
Scenes In Build に必要なシーンをドラッグ&ドロップ
  ↓
順序を整える(インデックス 0 が最初に起動するシーン)
  ↓
チェックボックスで「ビルドに含む / 含まない」を切替可能

例:
[✓] 0   Assets/Scenes/Title.unity
[✓] 1   Assets/Scenes/Stage1.unity
[✓] 2   Assets/Scenes/Stage2.unity
[✓] 3   Assets/Scenes/GameOver.unity
[ ] 4   Assets/Scenes/DebugRoom.unity   ← デバッグ用、本番には含めない

SceneManager API(実行時のシーン切替)

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneTransition : MonoBehaviour
{
    // インデックスでロード(同期)
    public void LoadStage1ByIndex()
    {
        SceneManager.LoadScene(1);
    }

    // 名前でロード(推奨:インデックス変更に強い)
    public void LoadStage1ByName()
    {
        SceneManager.LoadScene("Stage1");
    }

    // 非同期ロード(読み込み中に進捗表示が可能)
    public void LoadStage1Async()
    {
        var op = SceneManager.LoadSceneAsync("Stage1");
        op.completed += _ => Debug.Log("読込完了");
    }

    // Additive ロード(既存シーンに加算)
    public void LoadUIScene()
    {
        SceneManager.LoadScene("UI", LoadSceneMode.Additive);
    }

    // シーンのアンロード
    public void UnloadUIScene()
    {
        SceneManager.UnloadSceneAsync("UI");
    }

    // 現在のシーン情報取得
    public void PrintCurrentScene()
    {
        var scene = SceneManager.GetActiveScene();
        Debug.Log($"Name: {scene.name}, Index: {scene.buildIndex}, GO count: {scene.rootCount}");
    }
}

LoadSceneMode.Single と Additive の使い分け

モード挙動用途
Single (既定)既存シーンを全て破棄して新シーンをロードステージ切替、タイトル → ゲーム
Additive既存シーンを残して新シーンを追加UI / オーディオ / マネージャー / 街の区画ストリーミング

Additive を活用すると、たとえば「常駐管理シーン」+「現在のステージ」+「共通 UI シーン」 という構成にでき、保守性とロード時間の両方を改善できます。

Multi-Scene Editing(エディタでの複数シーン編集)

Hierarchy で複数のシーンを同時に開いて編集できます。役割分担の例:

  • Lighting シーン: ライト / Sky / Reflection Probe など見た目専用
  • Logic シーン: GameManager / SaveLoad / Audio など機能専用
  • Level シーン: 床 / 壁 / 障害物などのレベル本体
  • UI シーン: HUD / メニュー

これにより、複数人開発時のマージコンフリクトが発生しにくくなります(同じシーンを 2 人で編集するとシーンファイル全体が衝突する)。

シーン間のデータ受け渡し

シーン切替時、デフォルトでは全 GameObject が破棄されます。情報を持ち越すには以下の方法があります。

// 方法1: DontDestroyOnLoad
public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public int score;

    void Awake()
    {
        if (Instance != null) { Destroy(gameObject); return; }
        Instance = this;
        DontDestroyOnLoad(gameObject);   // ★ シーン切替でも破棄されない
    }
}

// 方法2: ScriptableObject に保存
[CreateAssetMenu]
public class PlayerData : ScriptableObject
{
    public int hp;
    public int gold;
    // → エディタで作成しておけばシーン間で共有可能
}

// 方法3: PlayerPrefs / セーブファイル
PlayerPrefs.SetInt("Score", 12345);
PlayerPrefs.Save();
// 次のシーンで
int score = PlayerPrefs.GetInt("Score", 0);

ストリーミングロード(大規模ワールド)

オープンワールド系では、プレイヤー周辺だけ動的にロード/アンロードするシーンストリーミングが必要です。Unity では以下のアプローチがあります。

  • Addressables: アセットの遅延ロード / 動的ダウンロード
  • Scene Streaming: 自前で Additive ロード / Unload を制御
  • Entities (DOTS) + SubScene: ECS ベースで超大規模ワールドに対応

シーンキー / イベント連携

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneEvents : MonoBehaviour
{
    void OnEnable()
    {
        SceneManager.sceneLoaded   += OnSceneLoaded;
        SceneManager.sceneUnloaded += OnSceneUnloaded;
    }

    void OnDisable()
    {
        SceneManager.sceneLoaded   -= OnSceneLoaded;
        SceneManager.sceneUnloaded -= OnSceneUnloaded;
    }

    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        Debug.Log($"Loaded: {scene.name} ({mode})");
        // BGM を切替、UI を出すなど
    }

    void OnSceneUnloaded(Scene scene)
    {
        Debug.Log($"Unloaded: {scene.name}");
    }
}

StreamingAssets フォルダとの違い

StreamingAssetsビルド時にそのまま含まれるリソースフォルダで、シーンとは別概念です。動画 / 設定 JSON / 外部 EXE などをビルドに含めて、実行時にパスでアクセスする用途で使います。シーンはあくまで Scene として登録されたゲームオブジェクト構成のデータです。

FAQ

Q: シーンを Build Settings に追加し忘れたままビルドした
A: 実行時に SceneManager.LoadScene("Stage1") が「Scene Stage1 (Build Index: -1) couldn't be loaded」エラーになります。Build Settings の Scenes In Build に追加して再ビルドしてください。

Q: 開発中に一時的に複数シーンを Hierarchy に出している。ビルドはどうなる?
A: Build Settings のチェックボックスで ON のシーンだけがビルドに含まれます。Hierarchy で開いているかは関係ありません。

Q: シーンロード中の進捗バーを作りたい
A: SceneManager.LoadSceneAsync() が返す AsyncOperation.progress(0〜0.9 まで読込、0.9 で activateOnLoad 待ち)を使います。allowSceneActivation = false でアクティブ化を遅延させられます。

Q: シーンのバージョン管理(Git)でコンフリクトが頻発する
A: Edit → Project Settings → Editor で Asset Serialization Mode を Force Text にし、シーンを役割で分割(Multi-Scene Editing)、UnityYAMLMerge を有効化すると改善します。