/// <summary> /// シーンロード /// </summary> private static void LoadSceneAsync(SceneDataPackBase dataPack) { //Header非表示 ※次のシーンでも表示が続くなら非表示にしない方が良いか? SharedUI.Instance.HideHeader(); //ロード開始 SceneManager.LoadSceneAsync(dataPack.toSceneName).completed += (op) => { //シーン取得 currentSceneName = dataPack.toSceneName; currentScene = SceneManager .GetSceneByName(currentSceneName) .GetRootGameObjects() .Select(g => g.GetComponent <SceneBase>()) .First(s => s != null); if (IsAutoHideLoading) { //シーン移動アニメーション終了 SharedUI.Instance.HideSceneChangeAnimation(); } //ロード完了通知 IsLoading = false; currentScene.OnSceneLoaded(dataPack); }; }
/// <summary> /// シーンロード完了時 /// </summary> public override void OnSceneLoaded(SceneDataPackBase dataPack) { if (dataPack is ToBattleSceneDataPack) { var data = dataPack as ToBattleSceneDataPack; this.stageData = Masters.SingleStageDB.FindById(data.stageId); } }
/// <summary> /// シーンロード完了時 /// </summary> public override void OnSceneLoaded(SceneDataPackBase dataPack) { if (dataPack is ToShopSceneDataPack) { var data = dataPack as ToShopSceneDataPack; this.firstOpenPage = data.pageType; } }
/// <summary> /// シーン切り替え /// </summary> public static void ChangeSceneAsync(string nextSceneName, SceneDataPackBase dataPack = null) { if (currentSceneName == nextSceneName) { return; } if (IsLoading) { return; } //ロード中フラグON IsLoading = true; //デフォルトは自動でロード中表示を消す IsAutoHideLoading = true; if (dataPack == null) { dataPack = new SceneDataPackBase(); } dataPack.toSceneName = nextSceneName; if (string.IsNullOrEmpty(currentSceneName)) { //場面転換アニメなし LoadSceneAsync(dataPack); } else { dataPack.fromSceneName = currentSceneName; //場面転換アニメあり SharedUI.Instance.ShowSceneChangeAnimation(() => { //空シーンに遷移することで現在のシーンをアンロード SceneManager.LoadSceneAsync("Empty").completed += (op1) => { #if DEBUG && UNITY_EDITOR //シーン消えたけどUnloadされてないアセット一覧をログ表示 foreach (var handle in AssetManager.handles) { Debug.LogFormat("未アンロード:{0}, referenceCount={1}", handle.path, handle.referenceCount); } #endif //リソースアンロード Resources.UnloadUnusedAssets().completed += (op2) => { //GC整理 GC.Collect(); //次のシーンをロード LoadSceneAsync(dataPack); }; }; }); } }
/// <summary> /// シーン切り替え /// </summary> public static void ChangeSceneAsync(string nextSceneName, SceneDataPackBase dataPack = null) { if (currentSceneName == nextSceneName) { return; } if (IsLoading) { return; } //ロード中フラグON IsLoading = true; //デフォルトは自動でロード中表示を消す IsAutoHideLoading = true; if (dataPack == null) { dataPack = new SceneDataPackBase(); } dataPack.toSceneName = nextSceneName; if (string.IsNullOrEmpty(currentSceneName)) { //場面転換アニメなし LoadSceneAsync(dataPack); } else { dataPack.fromSceneName = currentSceneName; //場面転換アニメあり ShowSceneChangeAnimation(() => { //空シーンに遷移することで現在のシーンをアンロード SceneManager.LoadSceneAsync("Empty").completed += (op1) => { //リソースアンロード Resources.UnloadUnusedAssets().completed += (op2) => { //GC整理 GC.Collect(); //次のシーンをロード LoadSceneAsync(dataPack); }; }; }); } }
/// <summary> /// ①Awake ②OnSceneLoaded ③Startの順で呼ばれます /// </summary> public virtual void OnSceneLoaded(SceneDataPackBase dataPack) { }
/// <summary> /// 挑戦するのクリック時 /// </summary> private void OnClickChallengeButton(MissionContent content) { switch ((Master.MissionData.MainType)content.server.missionTypeId) { case Master.MissionData.MainType.SingleGetSter: case Master.MissionData.MainType.SingleTotalStageClear: case Master.MissionData.MainType.SingleSelectStageClear: //シングルのステージ選択に遷移 if (!HomeScene.isMaxPossession) { this.nextSceneName = "SingleStageSelect"; this.dataPack = null; this.dialog.Close(); if (!this.isBattle) { this.dialog.onClose += () => SceneChanger.ChangeSceneAsync("SingleStageSelect"); } } else { HomeScene.OpenPresentBoxOverDialog(); } break; case Master.MissionData.MainType.MultiGetCoin: case Master.MissionData.MainType.MultiConsumCoin: case Master.MissionData.MainType.MultiConsumTotalItem: case Master.MissionData.MainType.MultiConsumSelectItem: case Master.MissionData.MainType.MultiCatchTotalFish: case Master.MissionData.MainType.MultiCatchSelectFish: case Master.MissionData.MainType.MultiGetRyugyoku: case Master.MissionData.MainType.MultiPlaySlot: case Master.MissionData.MainType.MultiGetJP: case Master.MissionData.MainType.MultiPlayFVAttack: //マルチのステージ選択に遷移 if (!HomeScene.isMaxPossession) { this.nextSceneName = "MultiStageSelect"; this.dataPack = null; this.dialog.Close(); if (!this.isBattle) { this.dialog.onClose += () => SceneChanger.ChangeSceneAsync("MultiStageSelect"); } } else { HomeScene.OpenPresentBoxOverDialog(); } break; case Master.MissionData.MainType.DecompositionGear: this.nextSceneName = "ItemInventory"; this.dataPack = null; this.dialog.Close(); if (!isBattle) { this.dialog.onClose += () => SceneChanger.ChangeSceneAsync("ItemInventory"); } break; case Master.MissionData.MainType.ReachLevel: case Master.MissionData.MainType.LoginTotal: case Master.MissionData.MainType.LoginSelect: case Master.MissionData.MainType.LinkedAccount: //HOMEに遷移 this.nextSceneName = "Home"; this.dataPack = null; this.dialog.Close(); break; case Master.MissionData.MainType.GetTotalGear: case Master.MissionData.MainType.GetBatteryGear: case Master.MissionData.MainType.GetBarrelGear: case Master.MissionData.MainType.GetBulletGear: case Master.MissionData.MainType.GetTypesBattery: //ショップ(砲台関連のタブ) if (!HomeScene.isMaxPossession) { this.nextSceneName = "Shop"; this.dataPack = new ToShopSceneDataPack { pageType = ShopScene.PageType.ToolGroup }; this.dialog.Close(); if (!this.isBattle) { this.dialog.onClose += () => SceneChanger.ChangeSceneAsync("Shop", this.dataPack); } } else { HomeScene.OpenPresentBoxOverDialog(); } break; case Master.MissionData.MainType.ReachVIPRank: //ショップ(ジェムのタブ) if (!HomeScene.isMaxPossession) { this.nextSceneName = "Shop"; this.dataPack = new ToShopSceneDataPack { pageType = ShopScene.PageType.Gem }; this.dialog.Close(); if (!isBattle) { this.dialog.onClose += () => SceneChanger.ChangeSceneAsync("Shop", this.dataPack); } } else { HomeScene.OpenPresentBoxOverDialog(); } break; } }