設計内容の復習になります。
シーン遷移の処理には using の宣言が必要になります。
各スクリプトでバラバラにシーン遷移の処理を書くのでは、using の宣言もその都度必要なりますし、
何よりも、どのスクリプトでシーン遷移を行っているのかを把握しにくくなり、管理が煩雑になります。
こういった処理は管理用のクラスを1つ作成し、それにすべて処理を制御させる設計を考えましょう。
今回のケースであれば、シーン遷移についてはすべてを担当するマネージャークラスという位置づけです。
またこういった複数のスクリプトから処理が命令される可能性のあるクラスは、
以前に学習した
シングルトンデザインパターンを利用したクラスとして作成しておくとよいです。
シーン遷移の命令を実行するにあたり、変数への代入処理が不要になりますので、
どのスクリプトからでも命令を1行記述するだけで、シーン遷移の処理を実行できる設計が実装出来ます。
シーン遷移には
SceneManager.LoadScene メソッドを利用しています。
このメソッドでは引数として文字列でシーンの名前を求められますが、これは事前に string 型の変数に文字列を代入しておいたり、
enum を作成してシーンの名前を列挙子として登録しておくことによって、
文字列の打ち間違えを防ぐことが出来ます。
また、
enum は ToString メソッドを利用することで、列挙子を同名の文字列へとキャスト(型の変換処理)可能です。
今回は enum で実装を行っていますので参考にしてください。enum は列挙子に登録した情報のみを対象としますので、
シーン遷移を行いたいシーンの名前のみを登録しておけば、存在しないシーンへの遷移も防ぐことができ、実行命令を記述する際にも見やすく、非常に便利です。
つまりこれは、
複数のメソッドを作成して、これは Main シーン用のメソッド、これは Battle シーン用のメソッドという風にメソッド単位で分けるのではなく、
1つのメソッドを作成して、引数の値によって遷移するシーンを分岐させるという設計になっています。
SceneStateManager.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneStateManager : MonoBehaviour
{
public static SceneStateManager instance;
void Awake() {
if (instance == null) {
instance = this;
DontDestroyOnLoad(gameObject);
} else {
Destroy(gameObject);
}
}
/// <summary>
/// 引数で指定したシーンへのシーン遷移の準備
/// シーン遷移を実行する場合は、このメソッドを利用する
/// </summary>
/// <param name="nextSceneType"></param>
public void PreparateNextScene(SceneType nextSceneType) {
// 引数で指定したシーンへ遷移
StartCoroutine(LoadNextScene(nextSceneType));
}
/// <summary>
/// 引数で指定したシーンへ遷移
/// </summary>
/// <param name="nextLoadSceneName"></param>
/// <returns></returns>
private IEnumerator LoadNextScene(SceneType nextLoadSceneName) {
// シーン名を指定する引数には、enum である SceneType の列挙子を、 ToString メソッドを使って string 型へキャストして利用
SceneManager.LoadScene(nextLoadSceneName.ToString());
}
}
スクリプトを作成したらセーブを行います。