/// <summary> 加算シーンをアンロード </summary> public void UnloadAppendScene(SceneInstance sceneInstance, bool deactivateSceneObjects = true) { if (!appendSceneInstances.Contains(sceneInstance)) { return; } if (deactivateSceneObjects) { sceneInstance.Disable(); } appendSceneInstances.Remove(sceneInstance); // AddTo(this)されると途中でdisposableされてしまうのでIObservableで公開しない. UnloadScene(sceneInstance).Subscribe().AddTo(Disposable); }
private IEnumerator LoadSceneCore(IObserver <SceneInstance> observer, Scenes identifier, LoadSceneMode mode) { var sceneInstance = loadedscenes.GetValueOrDefault(identifier); if (sceneInstance == null) { var scenePath = ScenePaths.GetValueOrDefault(identifier); UnityAction <Scene, LoadSceneMode> sceneLoaded = (s, m) => { if (s.IsValid()) { sceneInstance = new SceneInstance(identifier, FindSceneObject(s), s); switch (m) { case LoadSceneMode.Single: loadedscenes.Clear(); cacheScenes.Clear(); break; } // 初期状態は非アクティブ. sceneInstance.Disable(); if (onLoadScene != null) { onLoadScene.OnNext(sceneInstance); } } }; SetEnabledForCapturedComponents(false); SceneManager.sceneLoaded += sceneLoaded; AsyncOperation op = null; try { op = SceneManager.LoadSceneAsync(scenePath, mode); } catch (Exception e) { Debug.LogException(e); SceneManager.sceneLoaded -= sceneLoaded; if (onLoadError != null) { onLoadError.OnNext(Unit.Default); } observer.OnError(e); yield break; } while (!op.isDone) { yield return(op); } SceneManager.sceneLoaded -= sceneLoaded; var scene = sceneInstance.GetScene(); if (scene.HasValue) { var rootObjects = scene.Value.GetRootGameObjects(); // UniqueComponentsを回収. CollectUniqueComponents(rootObjects); loadedscenes.Add(identifier, sceneInstance); yield return(new WaitForEndOfFrame()); if (onLoadSceneComplete != null) { onLoadSceneComplete.OnNext(sceneInstance); } // ISceneEvent発行. foreach (var rootObject in rootObjects) { var targets = UnityUtility.FindObjectsOfInterface <ISceneEvent>(rootObject); foreach (var target in targets) { yield return(target.OnLoadSceneAsObservable().ToYieldInstruction()); } } } SetEnabledForCapturedComponents(true); // シーンの初期化処理. if (sceneInstance.Instance != null) { yield return(sceneInstance.Instance.Initialize().ToYieldInstruction()); } } else { // 初期状態は非アクティブ. sceneInstance.Disable(); } observer.OnNext(sceneInstance); observer.OnCompleted(); }