#region Copyright RenGuiYou. All rights reserved. //===================================================== // NeatlyFrameWork // Author: RenGuiyou // Feedback: mailto:750539605@qq.com //===================================================== #endregion using System; using Neatly.Module; using Neatly.Timer; using UnityEngine; using UnityEngine.SceneManagement; namespace Neatly.Load.Manager { public class SceneLoadManager : Singleton { private LoadModule m_LoadModule; private AsyncOperation m_AsyncOperation; private Action m_Progress; private Action m_Callback; private string m_lastSceneName; public void Init(LoadModule loadModule) { m_LoadModule = loadModule; } public void LoadScene(string sceneName, Action progress, Action action) { string bundleSceneName = string.Format("scene_{0}", sceneName); #if UNITY_EDITOR if (m_LoadModule.GetUseBundle()) #endif { Loader curLoader = m_LoadModule.LoadAssetBundle(bundleSceneName, null); curLoader.AddRefenceCount(); ExecuteLoadScene(sceneName, progress, action); } #if UNITY_EDITOR else { ExecuteLoadScene(sceneName, progress, action); } #endif Resources.UnloadUnusedAssets(); #if UNITY_EDITOR if (m_LoadModule.GetUseBundle()) #endif { if (!string.IsNullOrEmpty(m_lastSceneName)) { Loader lastLoader = m_LoadModule.GetLoader(m_lastSceneName); lastLoader?.LoseRefenceCount(); } } GC.Collect(); m_lastSceneName = bundleSceneName; } private void ExecuteLoadScene(string sceneName, Action progress, Action action) { m_Progress = progress; m_Callback = action; m_AsyncOperation = SceneManager.LoadSceneAsync(sceneName); if (m_Callback != null) { NeatlyTimer.AddFrame(this, FrameUpdate); } } private void FrameUpdate(float dt) { if (m_AsyncOperation == null) { return; } if (m_AsyncOperation.isDone) { m_Callback(); m_Callback = null; m_Progress = null; NeatlyTimer.Remove(this, FrameUpdate); } else { m_Progress?.Invoke(m_AsyncOperation.progress); } } } }