シーンを切り替える

Siden oppdatert :
ページ作成日 :

検証環境

Windows
  • Windows 11
Unity エディター
  • 2020.3.25f1
入力システムパッケージ
  • 1.2.0

この Tips の前提設定

この Tips の説明の前提として以下の設定を事前に行っています。

シーンの切り替え方法について

シーンとはいわゆる「場面」の事なのですが、Unity ではそのまま「シーン」という単語を使っているのでシーンという表現で説明します。

ゲームではシーンが切り替わることがよくあります。 例えばスタートメニューからゲームを開始してアクションが始まる場面はシーンの切り替わりと思って良いでしょう。 また、アクション中にメニュー画面を開く動作もメニューの表現によってはシーンの切り替えになります。

このようなシーンの切り替えを Unity でも実装する必要があるのですが実装の仕方はいろいろあります。 例えばゲーム中の「(Unity における) Scene」は1つだけにして、 ゲームの場面が切り替わるタイミングで前のシーンのオブジェクトをすべて破棄、次のシーンに必要なオブジェクトを生成する、などがあります。 しかしこの方法の場合 Scene を一つだけ用意すればよいというメリットはありますが、オブジェクトの切り替えをプログラムで管理しなければならないというデメリットがあります。

今回の Tips ではシーンの切り替えについてそのシーンの数だけ「Scene」ファイルを用意してあらかじめそのシーンに必要なオブジェクトを配置しておくという方法を実装してみたいと思います。 実際のシーンの切り替えでは Scene ファイルを切り替える、という処理だけになるので非常に簡単です。

シーンの準備

まずは普通にプロジェクトを作成します。入力システムパッケージの準備やカメラの設定はすでに行っているものとします。

今回はシーンファイルを2つ用意し、1つ目のシーンでボタンをクリックしたら2つ目のシーンに遷移するという動作を実装します。

既存のシーンは SampleScene という名前になっているはずですのでこれを SampleScene1 に変更します。

次にプロジェクトの空いているところを右クリックして「作成」から「シーン」を選択します。 プロジェクトタブの下にある+ボタンから追加しても構いません。

新しくシーンファイルが追加されるので名前を SampleScene2 とします。

SampleScene1 をダブルクリックしてシーンを開き以下のようにオブジェクトを配置します。 ボタンをクリックしたら SampleScene2 に遷移できるようにすればいいのでレイアウトは適当で構いません。

SampleScene2 をダブルクリックしてシーンを開き以下のようにオブジェクトを配置します。 変わったことが分かればいいので配置するものは何でもいいです。

シーンを作成したらメニューから「ファイル > ビルド設定」を開きます。

「ビルドに含まれるシーン」に SampleScene2 をドロップします。

以下の図のように追加されたら Build Settings は閉じてください。

シーン切り替え処理

シーンの切り替えはスクリプトで行いますのでスクリプトを作成してください。名前は任意ですがここでは SceneChange とします。

スクリプトを以下のようにします。

using UnityEngine;
using UnityEngine.SceneManagement;  // 追加

public class SceneChange : MonoBehaviour
{
  /// <summary>ボタンをクリックしたときに呼ばれます。</summary>
  public void OnClick()
  {
    // 指定したシーンを読み込み他のシーンは削除します
    SceneManager.LoadScene("SampleScene2", LoadSceneMode.Single);
  }
}

内容は非常に簡単で SceneManager.LoadScene メソッドを呼ぶとシーンを切り替えることができます。

第1引数には切り替え先のシーンの名前を指定します。

第2引数に LoadSceneMode.Single を指定すると現在のシーンを閉じつつ指定したシーンのみを開くことができます。 単純にシーンを追加する LoadSceneMode.Additive というパラメータもありますが今回は説明しません。

スクリプトを保存したら SampleScene1 を開き EventSystem にアタッチします。アタッチするオブジェクトはどこでも構いません。

ボタンのクリックイベントに SceneChange をアタッチしたオブジェクトをセットし OnClick メソッドを呼び出せるようにします。

ゲームを実行してボタンをクリックしたあとにシーンが変わるか確認してみてください。