タイトル: シーン(Scene)
SEOタイトル: Unity シーン(Scene) 完全ガイド | SceneManager / Additive / Build Settings
| この記事の要点 |
|
シーンとは
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 を有効化すると改善します。