コード例 #1
0
        /// <summary>
        /// シーン遷移処理:前のシーンに戻る
        /// </summary>
        private void BackTransition()
        {
            SceneData backSceneData = SceneObjectManager.PrevScene();

            if (backSceneData != null)
            {
                backSceneData.ComponentManager.Enabled = true;
                backSceneData.ComponentManager.Visible = true;
            }
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        /// <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();
            }
        }
コード例 #4
0
        /// <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);
                }
            }
        }
コード例 #5
0
        /// <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);
            }
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        /// <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);
                }
            }
        }
コード例 #8
0
        /// <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;
        }
コード例 #9
0
        /// <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;
        }
コード例 #10
0
        /// <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;
        }