見出し画像

Unityでシーンを切り替える方法|SceneManager.LoadSceneの使い方

Unityでゲームを作っていると、1つの画面だけで完結することはあまり多くありません。

たとえば、

  • タイトル画面

  • ゲーム画面

  • ゲームオーバー画面

  • クリア画面

  • 設定画面

のように、複数の画面を切り替えながらゲームを作っていくことがよくあります。
Unityでは、このような画面の単位を シーン と呼びます。
今回は、Unityでシーンを切り替える基本的な方法として、SceneManager と LoadScene の使い方を解説します。



シーンとは

Unityのシーンは、ゲームの1つの画面や場面を表すものです。
たとえば、次のようにシーンを分けることができます。

  • TitleScene

  • GameScene

  • ResultScene

TitleScene にはタイトル画面を作り、GameScene には実際にプレイするゲーム画面を作り、ResultScene には結果画面を作る、というイメージです。
ゲームが始まったらタイトル画面からゲーム画面へ移動し、ゲームが終わったらリザルト画面へ移動する。

このようなシーンの切り替えに使うのが、今回の SceneManager です。


SceneManagerとは

SceneManager は、Unityでシーンを管理するための機能です。
シーンを切り替えたり、今開いているシーンの情報を取得したりできます。
ただし、SceneManager を使うには、スクリプトの上の方(usingディレクティブ)に次の1行を書く必要があります。

using UnityEngine.SceneManagement;

この1行を追加することで、SceneManager が使えるようになります。


シーンを切り替える基本形

シーンを切り替える基本形は、次のように書きます。

SceneManager.LoadScene("GameScene");

これは、「GameSceneという名前のシーンを読み込む」という意味です。

たとえば、タイトル画面からゲーム画面へ移動したい場合は、次のようなスクリプトを作ります。

using UnityEngine;
using UnityEngine.SceneManagement;

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

GoToGame() が呼ばれると、GameScene に切り替わります。


シーン名は正しく書く

LoadScene の中に書くシーン名は、切り替えたいシーンの名前です。

SceneManager.LoadScene("GameScene");

この場合、Unityプロジェクトの中に GameScene という名前のシーンが必要です。
たとえば、シーン名が Game なのに、スクリプトで次のように書いてしまうと正しく動きません。

SceneManager.LoadScene("GameScene");

この場合は、実際のシーン名に合わせて次のように書く必要があります。

SceneManager.LoadScene("Game");

シーンをBuild Profilesに登録する

SceneManager.LoadScene でシーンを切り替えるには、基本的にそのシーンをビルド対象に登録しておく必要があります。
Unity 6以降では、Build Profiles からScene List に使用するシーンを登録します。
それ以前のエディタでは Build Settings になります。

SceneList にシーンを登録

手順は次のような流れです。

  1. Unity上部メニューから File →Build Profiles を開く

  2. 使用するプラットフォームを選ぶ

  3. Scene List に使いたいシーンを追加する

ここに登録されていないシーンは、実行時に読み込めないことがあります。


ボタンでシーンを切り替える

シーン切り替えは、UIボタンと組み合わせて使うことが多いです。

たとえば、タイトル画面に「スタート」ボタンを作り、そのボタンを押したらゲーム画面に移動する、という使い方です。

まず、次のようなスクリプトを作ります。

using UnityEngine;
using UnityEngine.SceneManagement;

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

    public void GoToTitle()
    {
        SceneManager.LoadScene("TitleScene");
    }
}

このスクリプトを、空のGameObjectなどに追加します。

次に、ボタンの On Click() にこのオブジェクトを登録し、呼び出したいメソッドを選びます。

スタートボタンなら、

SceneChanger.GoToGame

タイトルへ戻るボタンなら、

SceneChanger.GoToTitle

を選びます。

これで、ボタンを押したときにシーンを切り替えられるようになります。


現在のシーンをもう一度読み込む

ゲームオーバーになったときに、同じステージをもう一度やり直したいことがあります。

このようなときは、今開いているシーンを取得して、もう一度読み込みます。

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

少し長く見えますが、意味を分けると分かりやすいです。

SceneManager.GetActiveScene()

これは、現在開いているシーン情報を取得しています。

SceneManager.GetActiveScene().name

これは、現在開いているシーンの名前を取得しています。

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

と書くことで「今のシーン名を取得して、そのシーンをもう一度読み込む」という処理になります。

リトライ処理として使うなら、次のように書けます。

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneChanger : MonoBehaviour
{
    public void Retry()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

ゲームオーバー画面の「もう一度」などのテキストを配置したボタンにこの Retry を登録すれば、現在のシーンを最初からやり直すことができます。


シーン番号で読み込む方法

LoadScene は、シーン名だけでなく、シーン番号で読み込むこともできます。

SceneManager.LoadScene(1);

この番号は、Build Profilesに登録されているシーンの順番に関係します。


よく使うシーン切り替えスクリプト

最後に、よく使う形をまとめておきます。

using UnityEngine;
using UnityEngine.SceneManagement;

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

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

    public void GoToResult()
    {
        SceneManager.LoadScene("ResultScene");
    }

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

このようにしておくと、

  • タイトルへ戻る

  • ゲームを始める

  • 結果画面へ移動する

  • 現在のシーンをやり直す

といった処理を1つのスクリプトにまとめられます。


そのほかの便利な機能

今回は初心者向けの記事なので、基本の LoadSceneGetActiveScene が使えれば十分です。
ただ、SceneManagerには他にも便利な機能があります。

  • LoadSceneAsync
    シーンを非同期で読み込む方法です。ローディング画面を作りたいときなどに使います。

  • sceneLoaded
    シーンの読み込みが完了したタイミングで処理を実行できます。

  • UnloadSceneAsync
    追加で読み込んだシーンをあとから閉じるときに使います。

  • LoadSceneMode.Additive
    今のシーンを残したまま、別のシーンを追加で読み込む方法です。

  • SetActiveScene
    複数のシーンを同時に読み込んでいるときに、どのシーンをメインとして扱うかを指定します。

これらは少し発展的な内容なので、最初から全部覚える必要はありません。


まとめ

今回は、Unityでシーンを切り替える方法を解説しました。

重要なのは、次の3つです。

using UnityEngine.SceneManagement;

SceneManager を使うために必要な1行です。

SceneManager.LoadScene("GameScene");

指定したシーンに切り替える処理です。

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

現在のシーンをもう一度読み込む処理です。

ゲーム制作では、タイトル画面、ゲーム画面、リザルト画面など、シーンを分けて作ることがよくあります。

SceneManagerを使えるようになると、画面の切り替えができるようになり、ゲーム全体の流れを作りやすくなります。

次回は、シーンを切り替えたときに出てくる問題を扱います。

通常、シーンを切り替えると、そのシーンにあるオブジェクトは削除されます。

しかし、BGMやスコア管理、GameManagerなど、シーンをまたいでも残したいオブジェクトもあります。

そこで次回は、

DontDestroyOnLoad(gameObject);

を使って、シーンを切り替えても消えないオブジェクトの作り方を解説します。


Unity初心者向けの記事をテーマ別にまとめています。

▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!