public void Load(IEnumerable <string> sceneNames, LoadStreamMode loadStreamMode = LoadStreamMode.Default) { if (isLoading) { Debug.LogErrorFormat("Cannot load! Loading in progress."); return; } m_activeSceneName = null; m_thread = StartCoroutine(LoadThread(sceneNames, loadStreamMode)); }
public void Reset(LoadStreamMode loadStreamMode = LoadStreamMode.Default) { if (isLoading) { Debug.LogErrorFormat("Cannot reset! Loading in progress."); return; } m_activeSceneName = SceneManager.GetActiveScene().name; m_thread = StartCoroutine(LoadThread(m_loadedSceneNames, loadStreamMode, true)); }
protected virtual IEnumerator LoadThread(IEnumerable <string> sceneNames, LoadStreamMode loadStreamMode = LoadStreamMode.Default, bool reset = false) { isLoading = true; m_operations = new List <AsyncOperation>(); // Wait until all blockers are finished while (m_blockers.Any(x => x.blocking)) { yield return(null); } // Find scene names to be unloaded var unloadedSceneNames = reset ? m_loadedSceneNames // Skip any scenes included in next state : m_loadedSceneNames.Except(sceneNames); // Unload previous scenes foreach (var sceneName in unloadedSceneNames.Distinct()) { m_operations.Add(SceneManager.UnloadSceneAsync(sceneName)); } // Remove null operations m_operations = m_operations.Where(x => x != null).ToList(); // Wait until all scenes are unloaded while (m_operations.Any(x => !x.isDone)) { value = CalcValue(); yield return(null); } value = 0.5f; // Clear operations m_operations = new List <AsyncOperation>(); // Find scene names to be loaded var loadedSceneNames = reset ? sceneNames // Skip any scenes included in previous state : sceneNames.Except(m_loadedSceneNames); // Start loading scenes foreach (var sceneName in loadedSceneNames) { if (SceneManager.GetSceneByName(sceneName) != null) { var operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); if ((!m_autoLoad && loadStreamMode == LoadStreamMode.Default) || loadStreamMode == LoadStreamMode.ManualLoad) { operation.allowSceneActivation = false; } m_operations.Add(operation); } } // Wait until all scenes are loaded while (m_operations.Any(x => !x.isDone)) { value = CalcValue() + 0.5f; if (((!m_autoLoad && loadStreamMode == LoadStreamMode.Default) || loadStreamMode == LoadStreamMode.ManualLoad) && m_operations.All(x => x.progress >= 0.9f)) { isReady = true; if (isActivated) { m_operations.ForEach(x => x.allowSceneActivation = true); } } yield return(null); } value = 1f; // Remember loaded scenes m_loadedSceneNames = sceneNames.ToList(); isLoading = false; }
public void Load(string sceneName, LoadStreamMode loadStreamMode = LoadStreamMode.Default) { Load(new[] { sceneName }, loadStreamMode); }