public void CalledWhenAllSceneAreLoaded() { _refFuncToCallOnComplete?.Invoke(_lastSceneAssetUsed); _refFuncToCallOnComplete = null; _lastSceneAssetUsed = null; _isActivatingScene = false; }
/// <summary> /// Load a list of scene: ALL scene present in game /// </summary> /// <param name="sceneName"></param> public void LoadScenesByIndex(int index, FuncToCallOnComplete funcToCallOnComplete, bool hardReload) { if (_isActivatingScene && !hardReload) { throw new System.Exception("can't load twice in a row..."); } LastIndexUsed = index; LoadSceneFromLister(_contextList[index], funcToCallOnComplete); }
public void LoadSceneFromLister(SceneContextAsset lister, FuncToCallOnComplete funcToCallOnComplete) { _isActivatingScene = true; _lastSceneAssetUsed = lister; _refFuncToCallOnComplete = funcToCallOnComplete; if (Application.isPlaying) { _asyncOperations.Clear(); for (int i = 0; i < _lastSceneAssetUsed.SceneToLoad.Count; i++) { if (i == 0) { SceneManager.LoadScene(_lastSceneAssetUsed.SceneToLoad[0].ScenePath, LoadSceneMode.Single); if (_lastSceneAssetUsed.SceneToLoad.Count == 1) { CalledWhenAllSceneAreLoaded(); return; } else { ExtCoroutineWithoutMonoBehaviour.StartUniqueCoroutine(WaitForLoading()); } } else { AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(_lastSceneAssetUsed.SceneToLoad[i].ScenePath, LoadSceneMode.Additive); asyncOperation.allowSceneActivation = false; asyncOperation.completed += OnSecondarySceneCompleted; _asyncOperations.Add(asyncOperation); } } } #if UNITY_EDITOR else { EditorUtility.DisplayProgressBar("Loading scene", "", 0f); for (int i = 0; i < _lastSceneAssetUsed.SceneToLoad.Count; i++) { if (_lastSceneAssetUsed.SceneToLoad[i].ScenePath.IsNullOrEmpty()) { continue; } EditorSceneManager.OpenScene(_lastSceneAssetUsed.SceneToLoad[i].ScenePath, (i == 0) ? OpenSceneMode.Single : OpenSceneMode.Additive); EditorUtility.DisplayProgressBar("Loading scene", "", i * 1 / _lastSceneAssetUsed.SceneToLoad.Count); } EditorUtility.ClearProgressBar(); CalledWhenAllSceneAreLoaded(); } #endif }