105 lines
3.0 KiB
C#
105 lines
3.0 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
/// <summary>
|
|
/// SystemController singleton
|
|
/// </summary>
|
|
public class SystemController
|
|
{
|
|
/// <summary>
|
|
/// The instance controlling the singleton
|
|
/// </summary>
|
|
private static SystemController instance = null;
|
|
|
|
/// <summary>
|
|
/// Stack of the loaded scenes, used to easily go back to previous scenes
|
|
/// </summary>
|
|
private Stack<int> sceneStack = new Stack<int>();
|
|
|
|
/// <summary>
|
|
/// Get the instance loaded by the singleton
|
|
/// </summary>
|
|
/// <returns>SystemController instance</returns>
|
|
public static SystemController GetInstance()
|
|
{
|
|
// Create a new instance if non exists
|
|
if (instance == null)
|
|
{
|
|
instance = new SystemController();
|
|
instance.sceneStack.Push(SceneManager.GetActiveScene().buildIndex);
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Load the scene and push on the stack
|
|
/// </summary>
|
|
/// <param name="scenePath">Path of the scene</param>
|
|
public void LoadNextScene(string scenePath)
|
|
{
|
|
LoadNextScene(SceneUtility.GetBuildIndexByScenePath(scenePath));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Load the scene and push on the stack
|
|
/// </summary>
|
|
/// <param name="sceneIndex">Buildindex of the scene</param>
|
|
public void LoadNextScene(int sceneIndex)
|
|
{
|
|
sceneStack.Push(sceneIndex);
|
|
SceneManager.LoadScene(sceneIndex);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Swap the current scene with the new scene on the stack
|
|
/// </summary>
|
|
/// <param name="scenePath">Path of the scene</param>
|
|
public void SwapScene(string scenePath)
|
|
{
|
|
SwapScene(SceneUtility.GetBuildIndexByScenePath(scenePath));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Swap the current scene with the new scene on the stack
|
|
/// </summary>
|
|
/// <param name="sceneIndex">Buildindex of the scene</param>
|
|
public void SwapScene(int sceneIndex)
|
|
{
|
|
sceneStack.Pop();
|
|
LoadNextScene(sceneIndex);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Go back to the previous scene and unload the current scene
|
|
/// </summary>
|
|
public void BackToPreviousScene()
|
|
{
|
|
sceneStack.Pop();
|
|
|
|
if (sceneStack.Count > 0) SceneManager.LoadScene(sceneStack.Peek());
|
|
else Application.Quit();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Go back to a specific scene, unloading all the scenes on the way
|
|
/// </summary>
|
|
/// <param name="scenePath">Path of the scene</param>
|
|
public void BackToScene(string scenePath)
|
|
{
|
|
BackToScene(SceneUtility.GetBuildIndexByScenePath(scenePath));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Go back to a specific scene, unloading all the scene on the way
|
|
/// </summary>
|
|
/// <param name="sceneIndex">Buildindex of the scene</param>
|
|
public void BackToScene(int sceneIndex)
|
|
{
|
|
while (0 < sceneStack.Count && sceneStack.Peek() != sceneIndex) sceneStack.Pop();
|
|
|
|
if (sceneStack.Count > 0) SceneManager.LoadScene(sceneStack.Peek());
|
|
else Application.Quit();
|
|
}
|
|
}
|