using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using GFramework; public class StageSelectDetail : MonoBehaviour { [SerializeField] private Text txtStageSelect; [SerializeField] private Button btnStageSelectDetail; [SerializeField] private SimpleRoundedImage imgStageView; private StageData stageData; private World world; /// <summary> /// 初期設定 /// </summary> /// <param name="stage"></param> public void SetUpStageSelectDetail(StageData stageData, World world) { this.stageData = stageData; this.world = world; // 各項目の設定 txtStageSelect.text = this.stageData.stageName; imgStageView.sprite = this.stageData.stageView; btnStageSelectDetail.onClick.AddListener(OnClickStageSelectDetail); } /// <summary> /// ボタンを押した際の処理 /// </summary> private void OnClickStageSelectDetail() { // キャラのアイコンをボタン上に配置 world.SetPlayerTran(stageData.playerIconTran); // 選択しているステージの情報を更新 GameData.instance.chooseStageNo = stageData.stageNo; } /// <summary> /// ボタン表示のオンオフ切り替え /// </summary> /// <param name="isSwitch"></param> public void SwitchActivateButton(bool isSwitch) { btnStageSelectDetail.gameObject.SetActive(isSwitch); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class World : MonoBehaviour { [SerializeField] private Transform playerTran; [SerializeField] private Button btnSubmit; [SerializeField] private StageSelectDetail stageSelectDetailPrefab; [SerializeField] private Transform stageSelectDetailTran; // Content ゲームオブジェクト [SerializeField] private List<StageSelectDetail> stageSelectDetailsList = new List<StageSelectDetail>(); [SerializeField] private RectTransform scrollViewRect; // ScrollView ゲームオブジェクト IEnumerator Start() { yield return null; float height = scrollViewRect.sizeDelta.y; scrollViewRect.sizeDelta = new Vector3(scrollViewRect.sizeDelta.x, 0); scrollViewRect.DOSizeDelta(new Vector3(scrollViewRect.sizeDelta.x, height), 1.5f).SetEase(Ease.OutBack); // スタート用ボタンの設定 btnSubmit.onClick.AddListener(OnClickSubmit); btnSubmit.interactable = false; // ステージ選択用ボタンの生成と設定 for (int i = 0; i < DataBaseManager.instance.stageDataSO.stageDatasList.Count; i++) { StageSelectDetail stageSelectDetail = Instantiate(stageSelectDetailPrefab, stageSelectDetailTran, false); stageSelectDetail.SetUpStageSelectDetail(DataBaseManager.instance.stageDataSO.stageDatasList[i], this); stageSelectDetailsList.Add(stageSelectDetail); // TODO 最初のステージ以外は、クリアしているステージのみ表示する if (i > 0 && !GameData.instance.clearedStageNos.Contains(i)) { stageSelectDetail.SwitchActivateButton(false); } } } /// <summary> /// プレイヤーのアイコンを配置 /// </summary> /// <param name="newTran"></param> public void SetPlayerTran(Transform newTran) { playerTran.localPosition = newTran.position; btnSubmit.interactable = true; } /// <summary> /// ゲーム開始用のボタンの処理 /// </summary> public void OnClickSubmit() { // 選択しているステージの番号から StageData を取得 GameData.instance.currentStageData = DataBaseManager.instance.stageDataSO.stageDatasList.Find(x => x.stageNo == GameData.instance.chooseStageNo); // ボタンアニメ演出 btnSubmit.transform.DOShakeScale(0.35f, 0.5f, 5) .SetEase(Ease.OutQuart) .OnComplete(() => { // シーン遷移の準備 SceneStateManager.instance.PrepareteNextScene(SceneName.Stage); } ); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "StageDataSO", menuName = "Create StageDataSO")] public class StageDataSO : ScriptableObject { public List<StageData> stageDatasList = new List<StageData>(); [System.Serializable] public class StageData { public string stageName; public int stageNo; public Sprite stageView; // ステージの背景画像 public Transform playerIconTran; // プレイヤーのアイコンの配置場所 public int initStamina; // ステージ開始時の初期スタミナ public int[] appearEnemyNos; // 出現するエネミーの種類 public int bossNo; // 出現するボスの種類 public int clearBonusPoint; // クリアしたときのボーナス public StageType stageType; // ステージのタイルマップの種類 // TODO 他にもあれば追加 } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DataBaseManager : MonoBehaviour { public static DataBaseManager instance; public EnemyDataSO enemyDataSO; ////* 変数の宣言を追加 *//// public StageDataSO stageDataSO; ////* ここまで *//// private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using DG.Tweening; public class SceneStateManager : MonoBehaviour { public static SceneStateManager instance; [SerializeField] private Stage stage; [SerializeField] private Fade fade; [SerializeField] private float fadeDuration = 1.0f; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } ///// <summary> ///// バトルシーンへ遷移 ///// </summary> //public void MoveBattleScene() //{ // SceneManager.LoadScene(SceneName.Battle.ToString()); //} /// <summary> /// Stageシーンへの遷移準備 /// </summary> /// <param name="nextLoadSceneNane"></param> public void PreparateStageScene(SceneName nextLoadSceneName) { GameData.instance.currentGameState = GameData.GameState.Map; fade.FadeIn(fadeDuration, () => { LoadStageScene(nextLoadSceneName); }); //StartCoroutine(LoadStageScene(nextLoadSceneName)); } /// <summary> /// Stageシーンへの遷移 /// </summary> /// <param name="nextLoadSceneName"></param> /// <returns></returns> private void LoadStageScene(SceneName nextLoadSceneName) { string olsSceneName = SceneManager.GetActiveScene().name; //Scene scene = SceneManager.GetSceneByName(nextLoadSceneName.ToString()); //while (!scene.isLoaded) //{ // return null; //} //SceneManager.SetActiveScene(scene); stage.gameObject.SetActive(true); fade.FadeOut(fadeDuration); SceneManager.UnloadSceneAsync(olsSceneName); } /// <summary> /// Battleシーンへの遷移準備 /// </summary> public void PreparateBattleScene() { GameData.instance.currentGameState = GameData.GameState.Battle; Debug.Log("Load Battle Scene"); fade.FadeIn(fadeDuration, () => { StartCoroutine(LoadBattleScene()); }); } /// <summary> /// Battleシーンへの遷移 /// </summary> /// <returns></returns> private IEnumerator LoadBattleScene() { //今のシーンを壊さず、追加で読み込む SceneManager.LoadScene(SceneName.Battle.ToString(),LoadSceneMode.Additive); Scene scene = SceneManager.GetSceneByName(SceneName.Battle.ToString()); //上のWhile文と同じ処理。こっちの方がちょっと重い yield return new WaitUntil(() => scene.isLoaded); stage.gameObject.SetActive(false); fade.FadeOut(fadeDuration); //追加で読み込んだ時、どのシーンをActiveにするか指定する SceneManager.SetActiveScene(scene); } ////* ここからメソッドを3つ追加 *//// /// <summary> /// 指定したシーンへ遷移準備 /// </summary> /// <param name="nextLoadSceneName"></param> public void PrepareteNextScene(SceneName nextLoadSceneName) { if (!fade) { // フェードインなし StartCoroutine(LoadNextScene(nextLoadSceneName)); } else { // フェードインあり fade.FadeIn(fadeDuration, () => { StartCoroutine(LoadNextScene(nextLoadSceneName)); }); } } /// <summary> /// 指定したシーンへ遷移 /// </summary> /// <param name="nextLoadSceneName"></param> /// <returns></returns> private IEnumerator LoadNextScene(SceneName nextLoadSceneName) { SceneManager.LoadScene(nextLoadSceneName.ToString()); // フェードインしている場合には if (fade) { // シーンの読み込み終了を待つ Scene scene = SceneManager.GetSceneByName(nextLoadSceneName.ToString()); yield return new WaitUntil(() => scene.isLoaded); // フェードアウト fade.FadeOut(fadeDuration); } } public void SetStage(Stage stage){ this.stage = stage; } ////* ここまで *//// }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Stage : MonoBehaviour { [SerializeField] private UIManager uiManager; [SerializeField] private StageGenerator stageGenerator; [SerializeField] private SymbolManager symbolManager; [SerializeField] private MapMoveController mapMoveController; public enum TurnState { None, Player, Enemy, Boss } private TurnState currentTurnState = TurnState.None; public TurnState CurrentTurnState { set => currentTurnState = value; get => currentTurnState; } //StageゲームオブジェクトがActive状態になるたびに実行されるメソッド //ゲーム開始時にもStartメソッドよりも前に実行される(Awakeメソッドの後) private void OnEnable() { //HPの更新 uiManager.DisplayHpGauge(); // TODO バトル後にレベルアップした時のカウントの初期化 // TODO レベルアップするか確認 // TODO レベルアップしていたらレベルアップのボーナス // TODO バトルで付与されたデバフの確認と付与 CheckDebuffConditions(); //ターンの確認とプレイヤーのターンに切り替え。コンディションの更新 CheckTurn(); // TODO 特殊シンボルを獲得している場合は悪徳処理を実行 // ボスの出現確認 if (CurrentTurnState == TurnState.Boss) { //ボスの出現 Debug.Log("Boss 出現"); // TODO 演出 // TODO シーン遷移 } } private void Start() { ////* ここから TODO を実装 *//// // ステージ選択機能を実装した時の処理。ここで、SceneStateManager の stage 変数に、Stage クラスの情報を代入する SceneStateManager.instance.stage = this; ////* ここまで *//// //ステージのランダム生成 stageGenerator.GenerateStageFromRandomTiles(); symbolManager.AllClearSymbolsList(); //通常のシンボルのランダム作成してListに追加 symbolManager.SymbolsList = stageGenerator.GenerateSymbols(-1); // TODO 特殊シンボルのランダム作成してListに追加 //全シンボルの設定 symbolManager.SetUpAllAymbols(); //プレイヤーの設定 mapMoveController.SetUpMapMoveController(this); //現在のターンをプレイヤーのターン設定 CurrentTurnState = TurnState.Player; // TODO エネミーのシンボルに侵入できるようにする(特殊シンボルを使う場合) } /// <summary> /// エネミーのターン経過監視処理 /// </summary> /// <returns></returns> public IEnumerator ObserveEnemyTurnState() { Debug.Log("敵の移動開始"); //エネミーの移動を一体ずつ行う。全て移動が終わるまで、下の処理にはいかない yield return StartCoroutine(symbolManager.EnemisMove()); Debug.Log("全ての敵の移動 完了"); //シンボルのイベントを発生させる bool isEnemyTriggerEvent = mapMoveController.CallBackEnemySymbolTriggerEvent(); Debug.Log(isEnemyTriggerEvent); //ターンの状態を確認 if (!isEnemyTriggerEvent) CheckTurn(); if (CurrentTurnState == TurnState.Boss) { //ボスの出現 Debug.Log("Boss 出現"); // TODO 演出 // TODO シーン遷移 } } /// <summary> /// ターンの確認。プレイヤーのターンに切り替え。コンディションの更新 /// </summary> private void CheckTurn() { //移動できるか確認 if (GameData.instance.staminaPoint <= 0) { //移動できないならボスのターンにする CurrentTurnState = TurnState.Boss; } else { //まだ移動できるなら、プレイヤーのターンにする CurrentTurnState = TurnState.Player; // TODO コンディションの残り時間の更新 mapMoveController.UpdateConditionsDuration(); // TODO 移動ボタンと足踏みボタンを押せる状態にする // TODO コンディションの効果を適用 ApplyEffectConditions(); //移動の入力を受け付けるようにする mapMoveController.IsMoving = false; } Debug.Log(CurrentTurnState); } /// <summary> /// SymbolManagerの情報を取得 /// </summary> /// <returns></returns> public SymbolManager GetSymbolManager() { return symbolManager; } /// <summary> /// バトルで付与されたデバフの確認 /// </summary> private void CheckDebuffConditions() { //バトル内で付与されているデバフがないか判定 if (GameData.instance.debuffConditionList.Count == 0) { //デバフが登録されていなければ、処理を終了する return; } //登録されているデバフを順番に for(int i = 0; i < GameData.instance.debuffConditionList.Count; i++) { //デバフの付与 AddDebuff(GameData.instance.debuffConditionList[i]); } //デバフのリストをクリア。次のバトルに備える GameData.instance.debuffConditionList.Clear(); } /// <summary> /// デバフの付与 /// </summary> /// <param name="conditionType"></param> private void AddDebuff(ConditionType conditionType) { // TODO ConditionDataSOスクリプタぶる・オブジェクトを作成してから適用 //ConditionData conditionData = DataBaseManager.instance.conditionDataSO.conditionDatasList.Find(x => x.conditionType == conditionType); //すでに同じコンディションが付与されているか確認 if (mapMoveController.GetConditionsList().Exists(x => x.GetConditionType() == conditionType)) { // すでに付与されている場合は、持続時間を更新し、効果は上書きして処理を終了する //mapMoveController.GetConditionsList().Find(x => x.GetConditionType() == conditionType).ExtentionCondition(conditionData.duration, conditionData.conditionValue); return; } // 付与するコンディションが睡眠かつ、すでに混乱のコンディションが付与されているときには、睡眠のコンディションは無視する(操作不能になるため) if (conditionType == ConditionType.Sleep && mapMoveController.GetConditionsList().Exists(x => x.GetConditionType() == ConditionType.Confusion)) { return; } // 付与されていないコンディションの場合は、付与する準備する PlayerConditionBase playerCondition; // Player にコンディションを付与 playerCondition = conditionType switch { // TODO コンディションの種類が増えたら、ここに追加する ConditionType.Fatigue => mapMoveController.gameObject.AddComponent<PlayerCondition_Fatigue>(), _ => null }; // 初期設定を実行 //playerCondition.AddCondition(conditionType, conditionData.duration, conditionData.conditionValue, mapMoveController, symbolManager); // コンディション用の List に追加 mapMoveController.AddConditionsList(playerCondition); } /// <summary> /// 付与されているコンディションの効果をすべて適用 /// </summary> private void ApplyEffectConditions() { // 付与されているコンディションの効果を順番にすべて適用 foreach (PlayerConditionBase condition in mapMoveController.GetConditionsList()) { // コンディションの効果を適用 condition.ApplyEffect(); } } }