IEnumerator ExecuteLoadRequests() { while (loadRequestQueue.Count > 0) { activeLoadRequest = loadRequestQueue.Dequeue(); foreach (LoadRequest.LoadScene loadScene in activeLoadRequest.Scenes) { AsyncOperation op = SceneManager.LoadSceneAsync(loadScene.SceneName, LoadSceneMode.Additive); op.allowSceneActivation = false; while (op.progress < 0.9f) { yield return(null); } op.allowSceneActivation = true; yield return(null); // finish loading scene, OnSceneLoaded will be called loadScene.LoadedScene = lastLoadedScene.Value; lastLoadedScene = null; } if (activeLoadRequest.CompletionEventArg != null) { foreach (LoadRequest.LoadScene loadScene in activeLoadRequest.Scenes) { foreach (GameObject go in loadScene.LoadedScene.GetRootGameObjects()) { go.SendMessage("OnLoadRequestCompleted", activeLoadRequest.CompletionEventArg); } } } if (activeLoadRequest.OnRequestCompleted != null) { activeLoadRequest.OnRequestCompleted(activeLoadRequest); } activeLoadRequest = null; } activeCoroutine = null; }