public async UniTask <Base> BackToSceneAsync(SceneData sceneData) { while (_sceneData.Count > 0) { var elm = _sceneData.Pop(); if (elm == sceneData) { break; } } // 空の場合見つからなかったのでデフォルトに戻す return(await SceneChangeInternalAsync(_currentScene, sceneData, LoadSceneMode.Single, isStopCurrentScene : true, backScene : _currentScene)); }
private async UniTask <Base> SceneChangeInternalAsync(Base parent, SceneID sceneID, Argument argument, LoadSceneMode mode, bool isStopCurrentScene, System.Action <DiContainer> bindAction = null) { // デフォルト生成 if (argument == null) { argument = Argument.Create(); } // 1シーン、1SceneData var sceneData = new SceneData() { SceneID = sceneID, Argument = argument, BindAction = bindAction }; return(await SceneChangeInternalAsync(parent, sceneData, mode, isStopCurrentScene, backScene : null)); }
/// <summary> /// シーン読み込み処理 /// 非同期で読み込み、完了後切り替える /// </summary> private IObservable <Base> LoadSceneAsync(Base parent, SceneData sceneData, LoadSceneMode mode = LoadSceneMode.Single, System.Action onLoaded = null) { var sceneName = sceneData.SceneID.GetName(); return(Observable.FromCoroutine <Unit>(observer_ => LoadSceneOperationAsync(_zenjectSceneLoader.LoadSceneAsync(sceneName, mode, sceneData.BindAction), observer_)) .Select(scene_ => { // LoadSceneOperationAsync内のOnNextが呼び出されたときに来る var activeSceneInstance = loadedScene; var scene = default(Base); // 読み込んだシーンからシーンクラスのインスタンスを取得する foreach (var rootObject in activeSceneInstance.GetRootGameObjects()) { scene = rootObject.GetComponent <Base>(); if (scene != null) { break; } } if (scene == null) { Utility.Log.Error($"Scene.Base クラスが見つかりません {typeof(Base).ToString()}"); return null; } // シーンにUnityシーン情報をもたせる scene.Scene = activeSceneInstance; ///// scene.transform.SetParent(_sceneRoot); scene.SceneData = sceneData; scene.Argument = sceneData.Argument; // 準備が整うまで非アクティブ scene.gameObject.SetActive(false); // 必要なデータが読み込まれていない場合、読み込みを行う //Observable.FromCoroutine<Base>(observer_ => LoadScenePrepareAsync(observer_)); // Sceneに変換 return scene; }) .ContinueWith(scene_ => InitLoadPrepareAsync(scene_)) .SelectMany(scene_ => { // 別の処理に合成 return scene_.ScenePrepareAsync().Select(scene_ => { switch (mode) { case LoadSceneMode.Additive: // 親に関連付ける parent.AddChild(scene_); break; // AddSceneの場合は現在のシーンインスタンスとはしない default: _currentScene = scene_; break; } return scene_; }); })); }
private async UniTask <Base> SceneChangeInternalAsync(Base parent, SceneData sceneData, LoadSceneMode mode, bool isStopCurrentScene, Base backScene) { var prevScene = _currentScene; // 現在のシーンを止める // 止めるかどうかは引数で判断する if (isStopCurrentScene) { if (prevScene != null) { await StopSceneAsyncInternal(prevScene, needsChildren : true); } } if (mode == LoadSceneMode.Single) { // 遷移前処理 // todo: 差分のみUnloadするようにしたい for (int i = 1; i < SceneManager.sceneCount; ++i) { var scene = SceneManager.GetSceneAt(i); await SceneManager.UnloadSceneAsync(scene); } // StackClear if (sceneData.Argument.IsStackClear) { _sceneData.Clear(); } _sceneData.Push(sceneData); } // シーン読み込み var loadedScene = await SceneLoadProcessAsync(parent, sceneData, mode); // あるシーンから戻った場合、メソッドを呼び出す if (backScene != null) { loadedScene.CamebackScene(backScene); } // すべてのシーンを読み込み終わったらStartSceneを呼び出す loadedScene.IsStartScene = true; loadedScene.StartScene(); // 前回のシーンを削除する if (mode == LoadSceneMode.Single) { if (prevScene != null) { await DestroySceneAsyncInternal(prevScene); prevScene.Parent?.RemoveChild(prevScene); } } return(loadedScene); }
public void SetParent(SceneData parent) => Parent = parent;
public void RemoveChild(SceneData addSceneData) { addSceneData.Parent = null; ActiveChildren.Remove(addSceneData); }