学習記事一覧 · Unity基礎

【学習】シーンの切り替え(SceneManager.LoadScene)

これまでの学習では、

  • UI でスコアやボタンを表示した
  • ゲームのメイン部分を作った

という形でゲームを組み立ててきました。

しかし、タイトル画面、ゲーム画面、ゲームオーバー画面のように、画面を切り替える仕組みを学んでいません。

シーンの切り替え

という仕組みが必要です。

今回は SceneManager を使って、シーンの切り替え方法を学びます。

今日学ぶこと

  • シーン … ゲームの1つの画面・ステージ
  • SceneManager.LoadScene … シーンを読み込んで切り替える
  • Build Settings … ビルドに含めるシーンの登録
  • シーン名とインデックス … どちらの指定方法でも読み込める

シーンとは

シーン は、ゲームの1つの画面やステージを表す単位です。

  • タイトル画面、ゲーム画面、リザルト画面など、それぞれを別シーンにする
  • 1つのプロジェクトに複数のシーンを持てる
  • シーンを切り替えることで、画面遷移を実現する

新しいシーンを作成する

  1. File → New Scene で新規シーンを作成
  2. File → Save As で保存(例:TitleScene、GameScene、GameOverScene)
  3. Assets フォルダ内に .unity ファイルとして保存される

Build Settings にシーンを登録する

シーンを切り替えるには、Build Settings に登録する必要があります。

  1. File → Build Settings を開く
  2. Add Open Scenes で現在開いているシーンを追加
  3. または、Project からシーンファイルをドラッグして追加
  4. シーンの順番(インデックス)をドラッグで変更できる

登録していないシーンは LoadScene で読み込めません。


SceneManager.LoadScene で切り替える

SceneManagement 名前空間を using し、SceneManager.LoadScene を呼び出します。

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneChanger : MonoBehaviour
{
    public void LoadGameScene()
    {
        SceneManager.LoadScene("GameScene");
    }

    public void LoadGameOverScene()
    {
        SceneManager.LoadScene("GameOverScene");
    }
}

シーン名は、.unity を除いたファイル名です。


インデックスで読み込む

Build Settings の順番(0, 1, 2...)で指定することもできます。

SceneManager.LoadScene(1);  // 2番目のシーンを読み込む

シーン名を変更してもコードを直さなくてよい利点がありますが、順番を変えるとインデックスがずれるので注意が必要です。


ボタンからシーンを切り替える

  1. Button の On Click () に、SceneChanger の LoadGameScene などを登録
  2. または、空の GameObject に SceneChanger をアタッチし、Button から参照する

ゲームオーバー時に切り替える

プレイヤーがやられたときなど、スクリプトから切り替えます。

void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Enemy"))
    {
        SceneManager.LoadScene("GameOverScene");
    }
}

現在のシーンを再読み込み(リトライ)

SceneManager.LoadScene(SceneManager.GetActiveScene().name);

現在のシーン名を取得して、同じシーンを再度読み込みます。リトライに使えます。


完成コード例

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneChanger : MonoBehaviour
{
    public void LoadTitle()
    {
        SceneManager.LoadScene("TitleScene");
    }

    public void LoadGame()
    {
        SceneManager.LoadScene("GameScene");
    }

    public void Retry()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

重要ポイント

SceneManager.LoadScene でシーンを切り替えます。

  • Build Settings にシーンを登録しておく必要がある
  • LoadScene("シーン名") でシーン名を指定
  • LoadScene(インデックス) で Build Settings の順番を指定
  • GetActiveScene().name で現在のシーン名を取得し、リトライに使える

発展アイデア

シーンの切り替えが分かったら、次のステップです。

  • スコアとゲームオーバー … ゲームオーバー画面にスコアを表示する
  • DontDestroyOnLoad … シーンを切り替えてもオブジェクトを残す(スコアの引き継ぎなど)
  • 非同期読み込み … SceneManager.LoadSceneAsync で読み込み中にローディング表示

シーンの切り替えは ゲームの流れを作る 基本です。次はミニゲームを完成させましょう。