static void UnloadAddressable(string sceneName, Action unloadCompleted = null) { AddressablesLogger.Log($"[ADDRESSABLES] UnloadAddressable call: {sceneName}"); if (!s_UnloadSceneCallbacks.ContainsKey(sceneName)) { AddressablesLogger.Log($"[ADDRESSABLES] UnloadAddressable unload start: {sceneName}"); var callbacks = new List <Action>(); if (unloadCompleted != null) { callbacks.Add(unloadCompleted); } s_UnloadSceneCallbacks.Add(sceneName, callbacks); SceneInstance sceneInstance = default; bool sceneFound = false; for (var i = 0; i < s_AdditiveScenesInstances.Count; i++) { AddressablesLogger.Log($"[ADDRESSABLES] UnloadAddressable searching Scene: {s_AdditiveScenesInstances[i].Scene.name}"); if (s_AdditiveScenesInstances[i].Scene.name == sceneName) { AddressablesLogger.Log($"[ADDRESSABLES] UnloadAddressable Scene found: {s_AdditiveScenesInstances[i].Scene.name}"); sceneFound = true; sceneInstance = s_AdditiveScenesInstances[i]; s_AdditiveScenesInstances.Remove(sceneInstance); s_AdditiveScenes.Remove(sceneInstance.Scene); break; } } AddressablesLogger.Log("[ADDRESSABLES] UnloadAddressable Addressables.UnloadSceneAsync Scene: " + (sceneInstance.Scene.name ?? "NULL")); if (sceneFound) { var addressableSceneUnloader = new AddressableSceneUnloader(sceneInstance); addressableSceneUnloader.Unload(AddressableSceneUnloaded); } else { AddressablesLogger.LogWarning(s_LoadSceneOperations.ContainsKey(sceneName) ? $"You are trying to unload {sceneName} scene, but it's loading is not complete yet!" : $"You are trying to unload {sceneName} scene, but it wasn't loaded!"); } } else { AddressablesLogger.Log($"[ADDRESSABLES] UnloadAddressable unload already started: {sceneName}"); var callbacks = s_UnloadSceneCallbacks[sceneName]; if (unloadCompleted != null) { if (callbacks == null) { callbacks = new List <Action>(); } callbacks.Add(unloadCompleted); } } }
static void AdditiveAddressableSceneLoaded(IAsyncOperation asyncOperation) { AddressablesLogger.Log($"[ADDRESSABLES] AdditiveAddressableSceneLoaded Status: {asyncOperation.Status}," + "Scene: " + (asyncOperation.Status == OperationStatus.Unknown ? asyncOperation.SceneName : "NULL")); if (asyncOperation.Status == OperationStatus.Success) { s_AdditiveScenesInstances.Add(asyncOperation.SceneInstance); ProcessSceneLoadSuccess(asyncOperation.SceneInstance.Scene); } else { ProcessSceneLoadFail(asyncOperation.SceneName); } }
static void AddressableSceneUnloaded(AddressableSceneUnloaderResult result) { AddressablesLogger.Log($"[ADDRESSABLES] AddressableSceneUnloaded Status: {result.AsyncOperationHandle.Status}, Scene: {result.SceneName}"); SceneUnloaded.Invoke(result.Scene); if (s_UnloadSceneCallbacks.TryGetValue(result.SceneName, out var callbacks)) { foreach (var callback in callbacks) { callback(); } s_UnloadSceneCallbacks.Remove(result.SceneName); } s_LoadSceneOperations.Remove(result.SceneName); }
static void AdditiveAddressableSceneLoaded(AsyncOperationHandle <SceneInstance> asyncOperation) { AddressablesLogger.Log($"[ADDRESSABLES] AdditiveAddressableSceneLoaded Status: {asyncOperation.Status}, Scene: " + (asyncOperation.Result.Scene.name ?? "NULL")); var scene = asyncOperation.Result.Scene; s_AdditiveScenes.Add(scene); s_AdditiveScenesInstances.Add(asyncOperation.Result); SceneLoaded.Invoke(scene, LoadSceneMode.Additive); if (s_LoadSceneRequests.TryGetValue(scene.name, out var callbacks)) { foreach (var callback in callbacks) { callback(scene); } s_LoadSceneRequests.Remove(scene.name); } }
static IAsyncOperation LoadAddressableAdditively(string sceneName, Action <SceneLoadOperationArgs> loadCompleted = null) { AddressablesLogger.Log($"[ADDRESSABLES] LoadAddressableAdditively call: {sceneName}"); if (TryGetLoadedScene(sceneName, out var loadedScene)) { AddressablesLogger.Log($"[ADDRESSABLES] LoadAddressableAdditively already loaded: {sceneName}"); loadCompleted?.Invoke(new SceneLoadOperationArgs { Scene = loadedScene, Status = OperationStatus.Success }); return(s_LoadSceneOperations[sceneName]); } if (!s_LoadSceneRequests.ContainsKey(sceneName)) { AddressablesLogger.Log($"[ADDRESSABLES] LoadAddressableAdditively start loading: {sceneName}"); var callbacks = new List <Action <SceneLoadOperationArgs> >(); if (loadCompleted != null) { callbacks.Add(loadCompleted); } var loadAsyncOperation = Addressables.LoadSceneAsync(sceneName, LoadSceneMode.Additive); var asyncWrapper = new AsyncOperationHandleWrapper(sceneName, loadAsyncOperation); asyncWrapper.OnComplete += AdditiveAddressableSceneLoaded; s_LoadSceneRequests.Add(sceneName, callbacks); s_LoadSceneOperations.Add(sceneName, asyncWrapper); return(asyncWrapper); } if (loadCompleted != null) { var callbacks = s_LoadSceneRequests[sceneName] ?? new List <Action <SceneLoadOperationArgs> >(); callbacks.Add(loadCompleted); s_LoadSceneRequests[sceneName] = callbacks; } AddressablesLogger.Log($"[ADDRESSABLES] LoadAddressableAdditively already loading: {sceneName}"); return(s_LoadSceneOperations[sceneName]); }
static void AddressableSceneUnloaded(AddressableSceneUnloaderResult result) { AddressablesLogger.Log($"[ADDRESSABLES] AddressableSceneUnloaded Status: {result.AsyncOperationHandle.Status}, Scene: {result.SceneName}"); ProcessSceneUnLoad(result.SceneName); }
static void AdditiveAddressableSceneLoaded(AsyncOperationHandle <SceneInstance> asyncOperation) { AddressablesLogger.Log($"[ADDRESSABLES] AdditiveAddressableSceneLoaded Status: {asyncOperation.Status}, Scene: " + (asyncOperation.Result.Scene.name ?? "NULL")); s_AdditiveScenesInstances.Add(asyncOperation.Result); ProcessSceneLoad(asyncOperation.Result.Scene); }