【学習】シーンの切り替え(SceneManager.LoadScene)
これまでの学習では、
- UI でスコアやボタンを表示した
- ゲームのメイン部分を作った
という形でゲームを組み立ててきました。
しかし、タイトル画面、ゲーム画面、ゲームオーバー画面のように、画面を切り替える仕組みを学んでいません。
シーンの切り替え
という仕組みが必要です。
今回は SceneManager を使って、シーンの切り替え方法を学びます。
今日学ぶこと
- シーン … ゲームの1つの画面・ステージ
- SceneManager.LoadScene … シーンを読み込んで切り替える
- Build Settings … ビルドに含めるシーンの登録
- シーン名とインデックス … どちらの指定方法でも読み込める
シーンとは
シーン は、ゲームの1つの画面やステージを表す単位です。
- タイトル画面、ゲーム画面、リザルト画面など、それぞれを別シーンにする
- 1つのプロジェクトに複数のシーンを持てる
- シーンを切り替えることで、画面遷移を実現する
新しいシーンを作成する
- File → New Scene で新規シーンを作成
- File → Save As で保存(例:TitleScene、GameScene、GameOverScene)
- Assets フォルダ内に .unity ファイルとして保存される
Build Settings にシーンを登録する
シーンを切り替えるには、Build Settings に登録する必要があります。
- File → Build Settings を開く
- Add Open Scenes で現在開いているシーンを追加
- または、Project からシーンファイルをドラッグして追加
- シーンの順番(インデックス)をドラッグで変更できる
登録していないシーンは 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番目のシーンを読み込むシーン名を変更してもコードを直さなくてよい利点がありますが、順番を変えるとインデックスがずれるので注意が必要です。
ボタンからシーンを切り替える
- Button の On Click () に、SceneChanger の LoadGameScene などを登録
- または、空の 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 で読み込み中にローディング表示
シーンの切り替えは ゲームの流れを作る 基本です。次はミニゲームを完成させましょう。