シーン切り替え処理の作り方

各種表示やUIができたところでステージクリア処理やゲームオーバー処理の作成に入りたいところですが、その前にシーンの切り替え処理を作っておきます。というのも、例えばステージをクリアしたら次のステージに進んだり、タイトルに戻れるようにしたりするなどシーンの切り替えがつきものだからです。それでは早速シーン切り替え処理を作っていきましょう。

スポンサーリンク

トランジション用カンバスの作成

まず、シーンの切り替え時にシーンが「パッと」切り替わるのは違和感があるのでトランジションを作ります。ユニティちゃんパルクールの時に作ったのと同じトランジション用カンバスを作りましょう。

スポンサーリンク

シーンの移動管理クラス「MoveSceneManager」の作成

次にシーンの移動管理用クラスを作ります。ユニティちゃんパルクールの時はシーンの移動をGameManagerで管理していましたが、処理がごちゃごちゃして分かりづらくなってしまうため今回はシーンの移動処理は切り離すことにしました。というわけで、次のC#スクリプトを作成してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class MoveSceneManager : SingletonMonoBehaviour<MoveSceneManager>
{

	[SerializeField, Tooltip("フェードイン、フェードアウトの間の待ち時間")]
	float fadeWaitTime = 0;
	[SerializeField, Tooltip("トランジションに使用するカンバスのプレハブ")]
	GameObject fadeCanvasPrefab;

	int currentStageNum = 0; //現在のステージ番号(0始まり)

	GameObject fadeCanvasObj;
	FadeCanvas fadeCanvas;
	GameManager gameManager;

	public int CurrentStageNum
	{
		set
		{
			currentStageNum = Mathf.Clamp(value, 0, SceneManager.sceneCountInBuildSettings);
		}
		get
		{
			return currentStageNum;
		}
	}

	//BuildSettingに登録されているシーンの数を取得
	//ただし、エディタ上で登録されてないシーンを読んでいる状態だとそのシーンも数に含まれるので注意
	public int NumOfStage
	{
		get
		{
			return SceneManager.sceneCountInBuildSettings;
		}
	}

	public string StageName
	{
		get
		{
			return SceneManager.GetActiveScene().name;
		}
	}

	void Awake()
	{
		if (this != Instance)
		{
			Destroy(gameObject);
			return;
		}

		DontDestroyOnLoad(gameObject);

		gameManager = GetComponent<GameManager>();
	}

	void Start()
	{
		//デリゲートの登録
		SceneManager.sceneLoaded += OnSceneLoaded;
	}

	//シーンのロード時に実行(最初は実行されない)
	void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		if(StageName != "Title")
		{
			gameManager.LoadComponents();
		}
	}

	//シーンの読み込みと待機を行うコルーチン
	IEnumerator WaitForLoadScene(int sceneNum)
	{

		//フェードオブジェクトを生成
		fadeCanvasObj = Instantiate(fadeCanvasPrefab);

		//コンポーネントを取得
		fadeCanvas = fadeCanvasObj.GetComponent<FadeCanvas>();

		//フェードインさせる
		fadeCanvas.fadeIn = true;

		yield return new WaitForSeconds(fadeWaitTime);

		//シーンを非同期で読込し、読み込まれるまで待機する
		yield return SceneManager.LoadSceneAsync(sceneNum);

		//フェードアウトさせる
		fadeCanvas.fadeOut = true;

		CurrentStageNum = sceneNum;
	}

	//任意のステージに移動する処理
	public void MoveToStage(int sceneNum)
	{
		//コルーチンを実行
		StartCoroutine(WaitForLoadScene(sceneNum));
	}

}

※まだGameManagerに「LoadConponents()」というメソッドを作っていないので現時点ではエラーが出ると思いますが、それはこの後対処します。

このクラスの使い方は簡単で、MoveToStage()にステージのインデックス番号(Build Settingsに登録してあるステージの番号)を引数として指定して呼び出すとそのステージに移動します。

できたらこれをGameManagerオブジェクトにアタッチし、FadeCanvasに先ほど作ったトランジション用カンバスのプレハブを設定してください。これでシーンの移動処理ができました。

次のページ→ステージクリア・ゲームオーバー処理の作り方