SceneMgr.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.SceneManagement;
  4. using System.Collections.Generic;
  5. using LuaInterface;
  6. public class SceneMgr : Singleton<SceneMgr>
  7. {
  8. private string mMainSceneName;
  9. private string mCurActiveSceneName;
  10. private bool isLoadingScene = false;
  11. private List<string> mAddtivieScenes = new List<string>();
  12. private List<string> mLoadingScenes = new List<string>();
  13. private LuaFunction OnSceneLoadedLua;
  14. public override void Init()
  15. {
  16. SceneManager.sceneLoaded += OnSceneLoaded;
  17. SceneManager.sceneUnloaded += OnSceneUnloaded;
  18. SceneManager.activeSceneChanged += OnActiveSceneChanged;
  19. }
  20. public override void UnInit()
  21. {
  22. SceneManager.sceneLoaded -= OnSceneLoaded;
  23. SceneManager.sceneUnloaded -= OnSceneUnloaded;
  24. SceneManager.activeSceneChanged -= OnActiveSceneChanged;
  25. OnSceneLoadedLua = null;
  26. }
  27. public string MainSceneName
  28. {
  29. get { return mMainSceneName; }
  30. }
  31. public void SetOnSceneLoadedLuaFunc(LuaFunction func)
  32. {
  33. OnSceneLoadedLua = func;
  34. }
  35. public void LoadMainScene(string mainSceneName)
  36. {
  37. if (mMainSceneName == mainSceneName)
  38. {
  39. NotifySceneLoaded(mainSceneName);
  40. return;
  41. }
  42. if(SceneManager.sceneCountInBuildSettings > 1)
  43. {
  44. mMainSceneName = mainSceneName;
  45. isLoadingScene = true;
  46. SceneManager.LoadScene(mainSceneName, LoadSceneMode.Single);
  47. }
  48. else
  49. {
  50. DebugHelper.LogError("场景数量不对:"+ SceneManager.sceneCountInBuildSettings);
  51. }
  52. }
  53. public void AsyncLoadMainScene(string mainSceneName)
  54. {
  55. ResourceMgr.Instance.UnInit();
  56. MemoryUtil.ReleaseMemory();
  57. if (mMainSceneName == mainSceneName)
  58. {
  59. NotifySceneLoaded(mainSceneName);
  60. return;
  61. }
  62. if (IsLoadingScene(mainSceneName))
  63. {
  64. return;
  65. }
  66. mLoadingScenes.Add(mainSceneName);
  67. isLoadingScene = true;
  68. #if UNITY_EDITOR
  69. if (!Constants.AssetbundleMode)
  70. GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneLocalAssetData(mainSceneName));
  71. else
  72. GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneAssetbundle(mainSceneName));
  73. #else
  74. GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSceneAssetbundle(mainSceneName));
  75. #endif
  76. }
  77. public void AsyncLoadAdditiveScene(string sceneName)
  78. {
  79. if (IsLoadAdditiveScene(sceneName))
  80. {
  81. NotifySceneLoaded(sceneName);
  82. return;
  83. }
  84. if (IsLoadingScene(sceneName))
  85. {
  86. return;
  87. }
  88. isLoadingScene = true;
  89. mLoadingScenes.Add(sceneName);
  90. #if UNITY_EDITOR
  91. if (!Constants.AssetbundleMode)
  92. GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSubSceneLocalAssetData(sceneName));
  93. else
  94. GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSubSceneLocalAssetData(sceneName));
  95. #else
  96. GameMgr.Instance.StartCoroutine(AssetsMgr.Instance.LoadSubSceneLocalAssetData(sceneName));
  97. #endif
  98. }
  99. public void RemoveAdditiveScene(string sceneName)
  100. {
  101. if (!IsLoadAdditiveScene(sceneName)) return;
  102. UnloadScene(sceneName);
  103. mAddtivieScenes.Remove(sceneName);
  104. }
  105. public void RemoveAllAdditiveScene()
  106. {
  107. for (int idx = mAddtivieScenes.Count - 1; idx >= 0; idx--)
  108. {
  109. UnloadScene(mAddtivieScenes[idx]);
  110. }
  111. mAddtivieScenes.Clear();
  112. }
  113. public void ActiveScene(string sceneName)
  114. {
  115. if (mCurActiveSceneName == sceneName) return;
  116. Scene curScene = SceneManager.GetActiveScene();
  117. if (curScene != null)
  118. {
  119. SetSceneRootVisible(curScene, false);
  120. }
  121. Scene scene = SceneManager.GetSceneByName(sceneName);
  122. if (scene == null)
  123. {
  124. DebugHelper.Log(sceneName + " 未加载");
  125. return;
  126. }
  127. SceneManager.SetActiveScene(scene);
  128. SetSceneRootVisible(scene, true);
  129. }
  130. private bool IsLoadAdditiveScene(string sceneName)
  131. {
  132. for (int idx = 0; idx < mAddtivieScenes.Count; idx++)
  133. {
  134. if (mAddtivieScenes[idx] == sceneName) return true;
  135. }
  136. return false;
  137. }
  138. private bool IsLoadingScene(string sceneName)
  139. {
  140. return mLoadingScenes.Contains(sceneName);
  141. }
  142. private void UnloadScene(string sceneName)
  143. {
  144. SceneManager.UnloadSceneAsync(sceneName);
  145. }
  146. private void OnSceneLoaded(Scene scene, LoadSceneMode mode = LoadSceneMode.Additive)
  147. {
  148. isLoadingScene = false;
  149. string sceneName = scene.name;
  150. mLoadingScenes.Remove(sceneName);
  151. if (mode == LoadSceneMode.Single)
  152. {
  153. MemoryUtil.ReleaseMemory();
  154. mMainSceneName = sceneName;
  155. EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_Scene_Loaded, sceneName));
  156. if (OnSceneLoadedLua != null)
  157. {
  158. OnSceneLoadedLua.Call(this, 0, sceneName);
  159. }
  160. }
  161. else
  162. {
  163. SetSceneRootVisible(scene, false);
  164. AddAddtiveScene(sceneName);
  165. EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_SubScene_Loaded, sceneName));
  166. if (OnSceneLoadedLua != null)
  167. {
  168. OnSceneLoadedLua.Call(this, 1, sceneName);
  169. }
  170. }
  171. }
  172. private void SetSceneRootVisible(Scene scene, bool vis)
  173. {
  174. GameObject[] rootGoes = scene.GetRootGameObjects();
  175. for (int idx = 0; idx < rootGoes.Length; idx++)
  176. {
  177. rootGoes[idx].SetActive(vis);
  178. }
  179. }
  180. private void OnSceneUnloaded(Scene scene)
  181. {
  182. string unloadSceneName = scene.name;
  183. EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_Scene_Unloaded, unloadSceneName));
  184. }
  185. private void OnActiveSceneChanged(Scene oldScene, Scene newScene)
  186. {
  187. mCurActiveSceneName = newScene.name;
  188. }
  189. private void NotifySceneLoaded(string sceneName)
  190. {
  191. EventMgr.DispatchEvent(new CoreEvent<string>(ECoreEventType.EID_Scene_Loaded, sceneName));
  192. }
  193. private void AddAddtiveScene(string sceneName)
  194. {
  195. if (!IsLoadAdditiveScene(sceneName))
  196. mAddtivieScenes.Add(sceneName);
  197. }
  198. }