public static void UnloadScenesInParallel(SceneListDefinition sceneListDefinition, Action <AsyncOperation, float> partialCompleted = null, Action completed = null, Action <float> onProgress = null) { var loadedScenes = sceneListDefinition.LoadedScenes; int initialLength = loadedScenes.Count; int correctsLength = initialLength; int correctsCount = 0; var percentageStep = 1.0f / correctsLength; var currentPercentage = percentageStep; for (int i = 0; i < initialLength; i++) { var sceneGuid = loadedScenes.Pop(); if (!sceneGuid.scene.isLoaded) { correctsLength--; if (correctsCount >= correctsLength) { completed?.Invoke(); } continue; } UnloadScene(sceneGuid.scene, (ao) => { partialCompleted?.Invoke(ao, currentPercentage); MySceneManager.UnregisterLoadedScene(sceneGuid.guid); currentPercentage += percentageStep; correctsCount++; if (correctsCount >= correctsLength) { sceneListDefinition.LoadsCount--; sceneListDefinition.ActivatesCount--; completed?.Invoke(); } }, onProgress); } }
protected static void UnloadSceneRecursive(SceneListDefinition sceneListDefinition, int count, Action <AsyncOperation, float> partialCompleted = null, Action completed = null, Action <float> onProgress = null) { if (count <= 0) { return; } var loadedScenes = sceneListDefinition.LoadedScenes; var currentPercentage = 1.0f / count; var sceneGuid = loadedScenes.Pop(); while (!sceneGuid.scene.isLoaded) { sceneGuid = loadedScenes.Pop(); count--; currentPercentage = 1.0f / count; if (count <= 0) { return; } } UnloadScene(sceneGuid.scene, (ao) => { partialCompleted?.Invoke(ao, currentPercentage); MySceneManager.UnregisterLoadedScene(sceneGuid.guid); if (count - 1 <= 0) { sceneListDefinition.LoadsCount--; sceneListDefinition.ActivatesCount--; completed?.Invoke(); } UnloadSceneRecursive(sceneListDefinition, count - 1, partialCompleted, completed, onProgress); }, onProgress); }
public static bool LoadScene(AssetReference sceneReference, LoadSceneMode loadSceneMode, bool allowDuplicates, bool activateOnLoad = true, Action <AsyncOperationHandle <SceneInstance> > completed = null, Action <AsyncOperationHandle> completedTypeless = null, Action <float> onProgress = null, Action <AsyncOperationHandle> destroyed = null, int priority = 100) { if (sceneReference == null) { return(false); } if (!allowDuplicates) { if (MySceneManager.IsLoaded(sceneReference.AssetGUID)) { return(false); } } CoroutineManager.Instance.StartCoroutine(LoadSceneCo(sceneReference, loadSceneMode, activateOnLoad, completed, completedTypeless, onProgress, destroyed, priority)); return(true); }
protected static void LoadSceneRecursive(SceneListDefinition sceneListDefinition, int idx, bool allowDuplicates, bool activateOnLoad = true, Action <AsyncOperationHandle <SceneInstance>, float> partialCompleted = null, Action <AsyncOperationHandle, float> partialCompletedTypeless = null, Action completed = null, Action <float> onProgress = null, Action <AsyncOperationHandle> destroyed = null, int priority = 100) { var sceneList = sceneListDefinition.Scenes; if (!sceneList.IsValidIndex(idx)) { return; } var asyncOpHandles = sceneListDefinition.LoadingAsyncOperationHandles; var loadedScenes = sceneListDefinition.LoadedScenes; var currentPercentage = 1.0f / sceneList.Length * (idx + 1); var sceneReference = sceneList[idx]; var result = LoadScene(sceneReference, LoadSceneMode.Additive, allowDuplicates, activateOnLoad, (ao) => { bool setAsActiveScene = sceneListDefinition.SceneToSetAsMainActive == sceneReference.AssetGUID; if (!activateOnLoad) { asyncOpHandles.Enqueue(new SceneActivationHandle() { asyncOpHandle = ao, setAsActiveScene = setAsActiveScene }); } else { if (setAsActiveScene) { SceneManager.SetActiveScene(ao.Result.Scene); } } partialCompleted?.Invoke(ao, currentPercentage); MySceneManager.RegisterLoadedScene(sceneReference.AssetGUID); loadedScenes.Push(new SceneGuid() { scene = ao.Result.Scene, guid = sceneReference.AssetGUID }); if (!sceneList.IsValidIndex(idx + 1)) { sceneListDefinition.LoadsCount++; if (activateOnLoad) { sceneListDefinition.ActivatesCount++; } completed?.Invoke(); } LoadSceneRecursive(sceneListDefinition, idx + 1, allowDuplicates, activateOnLoad, partialCompleted, partialCompletedTypeless, completed, onProgress, destroyed, priority); }, (ao) => { partialCompletedTypeless?.Invoke(ao, currentPercentage); }, onProgress, destroyed, priority); if (!result) { if (!sceneList.IsValidIndex(idx + 1)) { sceneListDefinition.LoadsCount++; if (activateOnLoad) { sceneListDefinition.ActivatesCount++; } completed?.Invoke(); } LoadSceneRecursive(sceneListDefinition, idx + 1, allowDuplicates, activateOnLoad, partialCompleted, partialCompletedTypeless, completed, onProgress, destroyed, priority); } }
public static void LoadScenesInParallel(SceneListDefinition sceneListDefinition, bool allowDuplicates, bool activateOnLoad = true, Action <AsyncOperationHandle <SceneInstance>, float> partialCompleted = null, Action <AsyncOperationHandle, float> partialCompletedTypeless = null, Action completed = null, Action <float> onProgress = null, Action <AsyncOperationHandle> destroyed = null, int priority = 100) { var sceneList = sceneListDefinition.Scenes; var asyncOpHandles = sceneListDefinition.LoadingAsyncOperationHandles; var loadedScenes = sceneListDefinition.LoadedScenes; var length = sceneList.Length; var count = 0; var percentageStep = 1.0f / length; var currentPercentage = percentageStep; for (int i = 0; i < sceneList.Length; i++) { var sceneReference = sceneList[i]; if (sceneReference == null) { length--; if (count >= length) { completed?.Invoke(); } continue; } if (!allowDuplicates) { if (MySceneManager.IsLoaded(sceneReference.AssetGUID)) { continue; } } CoroutineManager.Instance.StartCoroutine( LoadSceneCo( sceneReference, LoadSceneMode.Additive, activateOnLoad, (ao) => { bool setAsActiveScene = sceneListDefinition.SceneToSetAsMainActive == sceneReference.AssetGUID; if (!activateOnLoad) { asyncOpHandles.Enqueue(new SceneActivationHandle() { asyncOpHandle = ao, setAsActiveScene = setAsActiveScene }); } else { if (setAsActiveScene) { SceneManager.SetActiveScene(ao.Result.Scene); } } partialCompleted?.Invoke(ao, currentPercentage); count++; // Last invoked is non typeless currentPercentage += percentageStep; MySceneManager.RegisterLoadedScene(sceneReference.AssetGUID); loadedScenes.Push(new SceneGuid() { scene = ao.Result.Scene, guid = sceneReference.AssetGUID }); if (count >= length) { sceneListDefinition.LoadsCount++; if (activateOnLoad) { sceneListDefinition.ActivatesCount++; } completed?.Invoke(); } }, (ao) => { partialCompletedTypeless?.Invoke(ao, currentPercentage); }, onProgress, destroyed, priority)); } }