84 lines
2.4 KiB
C#
84 lines
2.4 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|