/// <summary> /// 指定アンカーまでシーンポップ. /// </summary> /// <param name="anchorName">ポップ先のアンカー名.</param> /// <param name="fadeParam">フェードパラメータ.</param> public void PopSceneToAnchor(string anchorName, SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate = null) { // フェードアウト開始 isFadeWaiting = true; // 指定アンカーが見つかったかどうかのフラグ bool bFound = false; // 指定アンカーを探す foreach (KeyValuePair <string, int> pair in sceneAnchor) { // 見つかったらシーンポップ開始 if (pair.Key == anchorName) { CmnFadeManager.Inst.StartFadeOut(EndFadeOutCallBack, fadeParam.fadeOutTime, fadeParam.fadeType, fadeParam.fadeColor); StartCoroutine(PopSceneToAnchorInternal(anchorName, fadeParam, afterSceneControlDelegate)); bFound = true; break; } } // アンカーが無ければ警告出して無視 if (bFound == false) { Logger.Warn("Anchor not found.:" + anchorName); } }
/// <summary> /// シーン変更のコルーチン /// </summary> /// <param name="SceneName">シーン名</param> /// <param name="fadeParam">フェードパラメータ</param> IEnumerator ChangeSceneInternal(string SceneName, SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate) { // フェードアウトが完了するまで待機 while (isFadeWaiting) { yield return(null); } // ロード画面のUI表示(表示のために1フレーム待機) LoadingUIManager.Inst.ShowLoadingUI(fadeParam.loadingType); yield return(null); // シーンの遷移ヒストリが登録されているなら if (sceneHistory.Count > 0) { // シーンの遷移ヒストリから一番先頭を削除してから、登録 sceneHistory.Pop(); sceneHistory.Push(SceneName); // シーンのアクティブ状態を変更 yield return(StartCoroutine(ChangeSceneActivation(SceneName))); } // シーン切り替え後のクリーンアップ CleaneUpAfterChangeSceneActivation(fadeParam, afterSceneControlDelegate); }
/// <summary> /// シーンポップ. /// </summary> /// <param name="fadeTime">フェードパラメータ.</param> public void PopScene(SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate = null) { // フェードアウト開始 isFadeWaiting = true; CmnFadeManager.Inst.StartFadeOut(EndFadeOutCallBack, fadeParam.fadeOutTime, fadeParam.fadeType, fadeParam.fadeColor); // シーンポップ開始 StartCoroutine(PopSceneInternal(fadeParam, afterSceneControlDelegate)); }
/* * TODO * * ・特定のシーンをソフトリセット * (StartとInitを呼ぶ。Awakeも呼びたい) * * ・特定のシーンをハードリセット * (Static以外の値や座標を強制リセット。ソフトより安定するが少し遅い) * * ・LoadLevelを呼び出してシーンを綺麗にしてもらう * (これで管理するのが一番楽) * * ・特定のシーンを破棄してメモリを確保 * * ・メモリ不足した時に通知(ios/Androidのみ) * (この時、アクティブでないキャッシュ済シーンを全て破棄してメモリを確保) * * ・ゲームをポーズした時にアクティブでないキャッシュ済シーンを破棄してメモリを確保 * (バックグラウンドに回った時に落とされる対策) */ /// <summary> /// シーンプッシュ. /// </summary> /// <param name="SceneName">シーン名.</param> /// <param name="fadeTime">フェードパラメータ.</param> /// <param name="pushAnchor">シーンまでのアンカー.</param> public void PushScene(string SceneName, SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate = null, string pushAnchor = null) { // フェードアウト開始 isFadeWaiting = true; CmnFadeManager.Inst.StartFadeOut(EndFadeOutCallBack, fadeParam.fadeOutTime, fadeParam.fadeType, fadeParam.fadeColor); // シーンプッシュ開始 StartCoroutine(PushSceneInternal(SceneName, fadeParam, afterSceneControlDelegate, pushAnchor)); }
/// <summary> /// シーン切り替え後のクリーンアップ(フェードイン等). /// </summary> void CleaneUpAfterChangeSceneActivation(SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate) { // ロード画面のテキストを隠してフェードイン LoadingUIManager.Inst.HideLoadingUI(fadeParam.loadingType); CmnFadeManager.Inst.StartFadeIn(EndFadeInCallBack, fadeParam.fadeInTime, fadeParam.fadeType, fadeParam.fadeColor); // シーンUIとタイトルの切り替え sceneUI.ChangeCommonSceneUI(currentSceneRoot.SceneUiParam, currentSceneRoot.SceneBgKind); sceneUI.ChangeSceneTitleLabel(currentSceneRoot.SceneNameLocalizeID); if (afterSceneControlDelegate != null) { afterSceneControlDelegate(); } }
/// <summary> /// シーンプッシュのコルーチン /// </summary> /// <param name="SceneName">シーン名</param> /// <param name="fadeParam">フェードパラメータ</param> /// <param name="pushAnchor">シーンまでのアンカー</param> IEnumerator PushSceneInternal(string SceneName, SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate, string pushAnchor) { // フェードアウトが完了するまで待機 while (isFadeWaiting) { yield return(null); } // ロード画面のUI表示(表示のために1フレーム待機) LoadingUIManager.Inst.ShowLoadingUI(fadeParam.loadingType); yield return(null); // シーンのアクティブ状態を変更 yield return(StartCoroutine(ChangeSceneActivation(SceneName))); // シーンの遷移ヒストリに登録 sceneHistory.Push(SceneName); Debug.Log(pushAnchor); // シーンまでのアンカーの登録 if (pushAnchor != null) { // シーンまでのアンカーが見つかったかどうかのフラグ bool find = false; // シーンまでのアンカーを探す foreach (KeyValuePair <string, int> pair in sceneAnchor) { if (pair.Key == pushAnchor) { find = true; break; } } // 見つからなかったらアンカーを登録、同じものがz見つかったらエラー if (find == false) { sceneAnchor.Push(new KeyValuePair <string, int>(pushAnchor, sceneHistory.Count - 1)); } else { Logger.Error("same name anchor found"); } } // シーン切り替え後のクリーンアップ CleaneUpAfterChangeSceneActivation(fadeParam, afterSceneControlDelegate); }
/// <summary> /// 指定アンカーまでシーンポップのコルーチン /// </summary> /// <param name="anchorName">ポップ先のアンカー名</param> /// <param name="fadeParam">フェードパラメータ</param> IEnumerator PopSceneToAnchorInternal(string anchorName, SceneChangeFadeParam fadeParam, AfterSceneControlDelegate afterSceneControlDelegate) { // フェードアウトが完了するまで待機 while (isFadeWaiting) { yield return(null); } // ロード画面のUI表示(表示のために1フレーム待機) LoadingUIManager.Inst.ShowLoadingUI(fadeParam.loadingType); yield return(null); // 同名アンカー int popAnchorCount = -1; // 同名アンカー探す foreach (KeyValuePair <string, int> pair in sceneAnchor) { if (pair.Key == anchorName) { popAnchorCount = pair.Value; break; } } // 同名アンカーが見つかったらそこまでポップ if (popAnchorCount >= 0) { while (sceneHistory.Count - 1 > popAnchorCount) { sceneHistory.Pop(); } string nextSceneName = sceneHistory.Peek(); yield return(StartCoroutine(ChangeSceneActivation(nextSceneName))); } // 見つからなかったらエラー else { Logger.Error("invalid anchor name:" + anchorName); } // シーン切り替え後のクリーンアップ CleaneUpAfterChangeSceneActivation(fadeParam, afterSceneControlDelegate); }
IEnumerator SceneStartColutine() { // 共通シーンUIとフェードのパラメータの初期設定 sceneUI = CommonSceneUI.Inst; SceneChangeFadeParam noTimeFade = new SceneChangeFadeParam(0, 0, CmnFadeManager.FadeType.FADE_TIMEONLY, new Color(0, 0, 0, 0), LibBridgeInfo.LoadingType.COMMON); // 準備が整うまでシーン開始は遅延. yield return(LibBridgeInfo.WaitForEndOfFrame); yield return(LibBridgeInfo.WaitForEndOfFrame); // 準備が整ったらシーン変更 if (!isDebug) { PushScene(firstSceneName, noTimeFade); } else { // デバッグの場合はデバッグシーンをアンカーとして埋め込んでおく. PushScene(debugFirstSceneName, noTimeFade, null, debugFirstSceneName); } }