/// <summary> /// シーン遷移処理:前のシーンに戻る /// </summary> private void BackTransition() { SceneData backSceneData = SceneObjectManager.PrevScene(); if (backSceneData != null) { backSceneData.ComponentManager.Enabled = true; backSceneData.ComponentManager.Visible = true; } }
/// <summary> /// キャッシュからプリロードされているシーン情報を取り出す(キャッシュは削除される) /// </summary> /// <param name="sceneCondition"></param> /// <returns></returns> private SceneData PopPreloadedCache(SceneCondition sceneCondition) { if (_preloadedCaches.ContainsKey(sceneCondition)) { SceneData preloaded = _preloadedCaches[sceneCondition]; _preloadedCaches.Remove(sceneCondition); _preloaders.Remove(sceneCondition); return(preloaded); } else { return(null); } }
/// <summary> /// シーン情報の最初の履歴を削除する /// </summary> /// <param name="dump"></param> private void RemoveHistoryFirst(bool dump) { LinkedListNode <SceneData> sceneDataNode = _historySceneData.First; if (sceneDataNode != null) { SceneData sceneData = sceneDataNode.Value; UnsetPreloader(sceneData.ComponentManager); UnsetContentManagerUser(sceneData.ComponentManager); sceneData.ComponentManager.Unload(); _historySceneData.RemoveFirst(); } if (dump) { DumpGarbage(); } }
/// <summary> /// シーン情報をプリロードする /// </summary> /// <param name="preloaderSceneData"></param> private void PreloadSceneData(SceneData preloaderSceneData) { IList <SceneCondition> preloadList = GetPreloadList(preloaderSceneData.SceneCondition); if (preloadList != null) { foreach (SceneCondition preloadScene in preloadList) { if (!_preloadedCaches.ContainsKey(preloadScene)) { SceneData preloadComponentManager = GetNewSceneData(preloadScene); preloadComponentManager.ComponentManager.Load(); preloadComponentManager.ComponentManager.Enabled = false; preloadComponentManager.ComponentManager.Visible = false; _preloadedCaches[preloadScene] = preloadComponentManager; } SetPreloader(preloadScene, preloaderSceneData.ComponentManager); } } }
/// <summary> /// 不要になったプリロードされたシーンのコンポーネント管理クラスを破棄する /// </summary> private void DumpGarbagePreloadCache() { var garbageCacheQuery = from preloader in _preloaders where preloader.Value != null && preloader.Value.Count == 0 select preloader.Key; SceneCondition[] garbageCaches = garbageCacheQuery.ToArray(); foreach (SceneCondition sceneCondition in garbageCaches) { if (_preloadedCaches.ContainsKey(sceneCondition)) { SceneData sceneData = _preloadedCaches[sceneCondition]; UnsetContentManagerUser(sceneData.ComponentManager); sceneData.ComponentManager.Unload(); _preloadedCaches.Remove(sceneCondition); } _preloaders.Remove(sceneCondition); } }
/// <summary> /// 前のシーン情報を取得する。現在のシーン情報は破棄される /// 履歴がない場合取得できない /// </summary> /// <returns></returns> public SceneData PrevScene() { if (CurrentSceneData != null) { UnsetPreloader(CurrentSceneData.ComponentManager); UnsetContentManagerUser(CurrentSceneData.ComponentManager); CurrentSceneData.ComponentManager.Unload(); _currentSceneData = LastHistorySceneData; if (_currentSceneData != null) { _historySceneData.RemoveLast(); PreloadSceneData(CurrentSceneData); } DumpGarbage(); } return(CurrentSceneData); }
/// <summary> /// シーン情報をプリロードする /// </summary> /// <param name="preloaderSceneData"></param> private void PreloadSceneData(SceneData preloaderSceneData) { IList<SceneCondition> preloadList = GetPreloadList(preloaderSceneData.SceneCondition); if (preloadList != null) { foreach (SceneCondition preloadScene in preloadList) { if (!_preloadedCaches.ContainsKey(preloadScene)) { SceneData preloadComponentManager = GetNewSceneData(preloadScene); preloadComponentManager.ComponentManager.Load(); preloadComponentManager.ComponentManager.Enabled = false; preloadComponentManager.ComponentManager.Visible = false; _preloadedCaches[preloadScene] = preloadComponentManager; } SetPreloader(preloadScene, preloaderSceneData.ComponentManager); } } }
/// <summary> /// 新しいシーン情報を取得 /// </summary> /// <param name="sceneCondition"></param> /// <returns></returns> private SceneData GetNewSceneData(SceneCondition sceneCondition) { IComponentInitialiser componentInitialiser = GetComponentInitialiser(sceneCondition); // コンポーネント初期化クラスがnullだとコンポーネントが作れないのでエラー if (componentInitialiser == null) { throw new InvalidOperationException(sceneCondition.ToString() + "のコンポーネント初期化クラスを指定してください"); } string contentManagerName = GetContentManagerName(sceneCondition); // コンテントマネージャー名がnullだとコンテントマネージャーが作れないのでエラー if (contentManagerName == null) { throw new InvalidOperationException(sceneCondition.ToString() + "のコンテントマネージャー名を指定してください"); } ContentManager contentManager = GetContentManager(contentManagerName); SceneData newSceneData = new SceneData( sceneCondition, new ComponentManager(Game, componentInitialiser, contentManager) ); SetContentManagerUser(contentManagerName, newSceneData.ComponentManager); return newSceneData; }
/// <summary> /// 前のシーン情報を取得する。現在のシーン情報は破棄される /// 履歴がない場合取得できない /// </summary> /// <returns></returns> public SceneData PrevScene() { if (CurrentSceneData != null) { UnsetPreloader(CurrentSceneData.ComponentManager); UnsetContentManagerUser(CurrentSceneData.ComponentManager); CurrentSceneData.ComponentManager.Unload(); _currentSceneData = LastHistorySceneData; if (_currentSceneData != null) { _historySceneData.RemoveLast(); PreloadSceneData(CurrentSceneData); } DumpGarbage(); } return CurrentSceneData; }
/// <summary> /// 次のシーン情報を新しく取得する /// すでにプリロードされている場合は、それが取得される /// </summary> /// <param name="nextSceneCondition"></param> /// <param name="clearHistory"></param> /// <returns></returns> public SceneData NextNewScene(SceneCondition nextSceneCondition, bool clearHistory) { // 次のシーンデータ取得 SceneData nextSceneData = PopPreloadedCache(nextSceneCondition); if (nextSceneData == null) { nextSceneData = GetNewSceneData(nextSceneCondition); nextSceneData.ComponentManager.Load(); } // 履歴追加 if (CurrentSceneData != null) { _historySceneData.AddLast(CurrentSceneData); } // 現在のシーンデータにセット _currentSceneData = nextSceneData; // 他のシーンデータをプリロードする PreloadSceneData(nextSceneData); // 履歴をすべて削除する if (clearHistory) { ClearAllHistory(true); } return CurrentSceneData; }