ドラクエなどのRPGでよくあるフィールドマップと戦闘の切り替えに使えます。
応用すればUIの遷移も作れます。
まず、ひとつ前のシーンを保持するSceneStack
クラスを作ります。
このとき、ScriptableObject
を継承します。
ScriptableObjectは、シーンを読み込んでも変数の値を保持してくれるので、今回のケースに最適です。
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
[CreateAssetMenu]
public class SceneStack : ScriptableObject
{
private Stack<Scene> scenes = new Stack<Scene>();
// シーンをスタックから取り出す
public Scene Pop()
{
return scenes.Pop();
}
// シーンをスタックに積む
public void Push(Scene scene)
{
scenes.Push(scene);
}
}
つぎに、シーンをスタックに積んでから読み込むスクリプトを書きます。
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
public SceneStack scenes;
public SceneAsset scene;
public void Load()
{
scenes.Push(SceneManager.GetActiveScene());
SceneManager.LoadSceneAsync(scene.name);
}
}
つぎに、ひとつ前のシーンに戻るスクリプトを書きます。
using UnityEngine;
using UnityEngine.SceneManagement;
public class BackScene : MonoBehaviour
{
public SceneStack scenes;
public void Back()
{
var scene = scenes.Pop();
SceneManager.LoadSceneAsync(scene.buildIndex);
}
}
これらを組み合わせることで、ひとつ前のシーンに戻ることができます。
また、スタックにシーンを積んでいくので前の前のシーンに戻ることもできます。
今回はAddressableを使いませんでしたが、スタックの型をAssetReference
にすることで対応可能です。