ro-webgl/Assets/Src/Core/Scene/SceneMgr.cs

244 lines
6.8 KiB
C#

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using LuaInterface;
public class SceneMgr : Singleton<SceneMgr>
{
private string mMainSceneName;
private string mCurActiveSceneName;
private bool isLoadingScene = false;
private List<string> mAddtivieScenes = new List<string>();
private List<string> mLoadingScenes = new List<string>();
private LuaFunction OnSceneLoadedLua;
public override void Init()
{
SceneManager.sceneLoaded += OnSceneLoaded;
SceneManager.sceneUnloaded += OnSceneUnloaded;
SceneManager.activeSceneChanged += OnActiveSceneChanged;
}
public override void UnInit()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
SceneManager.sceneUnloaded -= OnSceneUnloaded;
SceneManager.activeSceneChanged -= OnActiveSceneChanged;
OnSceneLoadedLua = null;
}
public string MainSceneName
{
get { return mMainSceneName; }
}
public void SetOnSceneLoadedLuaFunc(LuaFunction func)
{
OnSceneLoadedLua = func;
}
public void LoadMainScene(string mainSceneName)
{
if (mMainSceneName == mainSceneName)
{
NotifySceneLoaded(mainSceneName);
return;
}
if(SceneManager.sceneCountInBuildSettings > 1)
{
mMainSceneName = mainSceneName;
isLoadingScene = true;
#if UNITY_INSTANTGAME
PreDownloadManager.Instance.CreateInGameDownloadLogBeforeLoadScene();
#endif
SceneManager.LoadScene(mainSceneName, LoadSceneMode.Single);
}
else
{
DebugHelper.LogError("场景数量不对:"+ SceneManager.sceneCountInBuildSettings);
}
}
public void AsyncLoadMainScene(string mainSceneName)
{
ResourceMgr.Instance.UnInit();
MemoryUtil.ReleaseMemory();
if (mMainSceneName == mainSceneName)
{
NotifySceneLoaded(mainSceneName);
return;
}
if (IsLoadingScene(mainSceneName))
{
return;
}
mLoadingScenes.Add(mainSceneName);
isLoadingScene = true;
GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneAssetbundle(mainSceneName));
// #if UNITY_EDITOR
// if (!Constants.AssetbundleMode)
// GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneLocalAssetData(mainSceneName));
// else
// GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneAssetbundle(mainSceneName));
// #else
// GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneAssetbundle(mainSceneName));
// #endif
}
public void AsyncLoadAdditiveScene(string sceneName)
{
if (IsLoadAdditiveScene(sceneName))
{
NotifySceneLoaded(sceneName);
return;
}
if (IsLoadingScene(sceneName))
{
return;
}
isLoadingScene = true;
mLoadingScenes.Add(sceneName);
#if UNITY_EDITOR
if (!Constants.AssetbundleMode)
GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSubSceneLocalAssetData(sceneName));
else
GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSubSceneLocalAssetData(sceneName));
#else
GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSubSceneLocalAssetData(sceneName));
#endif
}
public void RemoveAdditiveScene(string sceneName)
{
if (!IsLoadAdditiveScene(sceneName)) return;
UnloadScene(sceneName);
mAddtivieScenes.Remove(sceneName);
}
public void RemoveAllAdditiveScene()
{
for (int idx = mAddtivieScenes.Count - 1; idx >= 0; idx--)
{
UnloadScene(mAddtivieScenes[idx]);
}
mAddtivieScenes.Clear();
}
public void ActiveScene(string sceneName)
{
if (mCurActiveSceneName == sceneName) return;
Scene curScene = SceneManager.GetActiveScene();
if (curScene != null)
{
SetSceneRootVisible(curScene, false);
}
Scene scene = SceneManager.GetSceneByName(sceneName);
if (scene == null)
{
DebugHelper.Log(sceneName + " 未加载");
return;
}
SceneManager.SetActiveScene(scene);
SetSceneRootVisible(scene, true);
}
private bool IsLoadAdditiveScene(string sceneName)
{
for (int idx = 0; idx < mAddtivieScenes.Count; idx++)
{
if (mAddtivieScenes[idx] == sceneName) return true;
}
return false;
}
private bool IsLoadingScene(string sceneName)
{
return mLoadingScenes.Contains(sceneName);
}
private void UnloadScene(string sceneName)
{
SceneManager.UnloadSceneAsync(sceneName);
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode = LoadSceneMode.Additive)
{
isLoadingScene = false;
string sceneName = scene.name;
mLoadingScenes.Remove(sceneName);
if (mode == LoadSceneMode.Single)
{
MemoryUtil.ReleaseMemory();
mMainSceneName = sceneName;
EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_Scene_Loaded, sceneName));
if (OnSceneLoadedLua != null)
{
OnSceneLoadedLua.Call(this, 0, sceneName);
}
}
else
{
SetSceneRootVisible(scene, false);
AddAddtiveScene(sceneName);
EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_SubScene_Loaded, sceneName));
if (OnSceneLoadedLua != null)
{
OnSceneLoadedLua.Call(this, 1, sceneName);
}
}
}
private void SetSceneRootVisible(Scene scene, bool vis)
{
GameObject[] rootGoes = scene.GetRootGameObjects();
for (int idx = 0; idx < rootGoes.Length; idx++)
{
rootGoes[idx].SetActive(vis);
}
}
private void OnSceneUnloaded(Scene scene)
{
string unloadSceneName = scene.name;
EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_Scene_Unloaded, unloadSceneName));
}
private void OnActiveSceneChanged(Scene oldScene, Scene newScene)
{
mCurActiveSceneName = newScene.name;
}
private void NotifySceneLoaded(string sceneName)
{
EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_Scene_Loaded, sceneName));
}
private void AddAddtiveScene(string sceneName)
{
if (!IsLoadAdditiveScene(sceneName))
mAddtivieScenes.Add(sceneName);
}
}