Files
2025TapTapGameJam/Assets/Script/Core/ScenesManager.cs

84 lines
2.4 KiB
C#
Raw Permalink Normal View History

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
namespace Core
{
public class ScenesManager : MonoSingleton<ScenesManager>
{
public static ScenesManager Instance { get; private set; }
private string currentGameplayScene;
private bool IsLoadGameplayUI = false;
void Awake()
{
if (Instance != null)
{
Destroy(gameObject);
return;
}
Instance = this;
//DontDestroyOnLoad(gameObject);
}
public void LoadMainMenu()
{
if (IsLoadGameplayUI)
{
// 如果已经加载过游戏内UI场景则卸载掉
StartCoroutine(UnloadScene("UIScene"));
IsLoadGameplayUI = false;
}
// 加载主菜单场景需要卸载掉除了Core以外的所有场景
StartCoroutine(SwitchGameplay("StartMenu"));
}
public void LoadGameplay(string sceneName)
{
StartCoroutine(SwitchGameplay(sceneName));
if (!IsLoadGameplayUI)
{
// 只加载一次游戏内UI场景
StartCoroutine(LoadSceneAdditive("UIScene"));
IsLoadGameplayUI = true;
}
}
/// <summary>
/// 切换游戏场景,卸载当前的游戏场景,加载新的游戏场景
/// 适用于在游戏内切换场景
/// </summary>
/// <param name="newScene"></param>
/// <returns></returns>
private IEnumerator SwitchGameplay(string newScene)
{
if (!string.IsNullOrEmpty(currentGameplayScene))
{
yield return UnloadScene(currentGameplayScene);
}
yield return LoadSceneAdditive(newScene);
currentGameplayScene = newScene;
}
private IEnumerator LoadSceneAdditive(string sceneName)
{
var async = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
while (!async.isDone)
{
yield return null;
}
}
private IEnumerator UnloadScene(string sceneName)
{
var async = UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(sceneName);
while (!async.isDone)
{
yield return null;
}
}
}
}