private static void SceneChange() { var scene = EditorSceneManager.GetSceneAt(0); try { switch (State) { case SceneChangeState.WaitOpenScene: { if (!string.IsNullOrEmpty(Prefs.targetScene)) { EditorApplication.LockReloadAssemblies(); Prefs.resumeScene = scene.path; EditorSceneManager.OpenScene(Prefs.targetScene); State = SceneChangeState.WaitSceneChange; } else { State = SceneChangeState.None; EditorApplication.update -= SceneChange; } } break; case SceneChangeState.WaitSceneChange: { if (scene.path == Prefs.targetScene) { State = SceneChangeState.None; Prefs.targetScene = null; onEditorSceneChange.OnNext(Unit.Default); onEditorSceneChange.OnCompleted(); onEditorSceneChange = null; EditorApplication.update -= SceneChange; EditorApplication.UnlockReloadAssemblies(); } } break; } } catch { State = SceneChangeState.None; EditorApplication.update -= SceneChange; EditorApplication.UnlockReloadAssemblies(); } }
//----- method ----- public static IObservable <bool> SceneChange(string targetScenePath) { if (State != SceneChangeState.None) { return(Observable.Return(false)); } if (string.IsNullOrEmpty(targetScenePath)) { return(Observable.Return(false)); } if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) { return(Observable.Return(false)); } var scene = EditorSceneManager.GetSceneAt(0); if (scene.path == targetScenePath) { State = SceneChangeState.None; } else { State = SceneChangeState.WaitOpenScene; Prefs.targetScene = targetScenePath; EditorApplication.update += SceneChange; onEditorSceneChange = new Subject <Unit>(); return(onEditorSceneChange.Select(x => true)); } return(Observable.Return(true)); }