using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameData : MonoBehaviour { public static GameData instance; [Header("所持している武器の登録用リスト")] public List<WeaponData> weaponDatasList = new List<WeaponData>(); ////* 変数の宣言を2つ追加 *//// public int chooseStageNo; public List<int> clearStageNoList = new List<int>(); ////* ここまで *//// void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } /// <summary> /// 武器データの登録 /// </summary> /// <param name="weaponData"></param> public void AddWeaponData(WeaponData weaponData) { weaponDatasList.Add(weaponData); Debug.Log("武器追加 : " + weaponData.weaponName); } ////* ここからメソッドを1つ追加 *//// /// <summary> /// クリアしたステージの番号を追加 /// </summary> /// <param name="stageNo"></param> public void AddClearStageNoList(int stageNo) { // クリアしたステージの番号がまだリストにない場合 if (!clearStageNoList.Contains(stageNo)) { // List に追加 clearStageNoList.Add(stageNo); // TODO セーブ } } ////* ここまで *//// }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] private RailMoveController railMoveController; [SerializeField, Header("経路用のパス群の元データ")] private RailPathData originRailPathData; // 後程 List 化して複数のルートを管理できるようにします [SerializeField, Header("パスにおけるミッションの発生有無")] // Debug 用 private bool[] isMissionTriggers; [SerializeField] private PlayerController playerController; [SerializeField] private EventGenerator eventGenerator; [SerializeField, Header("ミッションで発生している敵のリスト")] private List<EnemyController> enemiesList = new List<EnemyController>(); private int currentMissionDuration; [Header("現在のゲームの進行状態")] public GameState currentGameState; [SerializeField] private WeaponEventInfo weaponEventInfo; [SerializeField] private UIManager uiManager; [SerializeField] private WeaponChanger weaponChanger; [SerializeField] private CameraController cameraController; [SerializeField] // Debug 用に SerializeField属性を付与しています。確認が済んだら SerializeField属性 は削除してください。 private bool[] isMoviePlays; private IEnumerator Start() { SoundManager.instance.PlayBGM(SoundDataSO.BgmType.Main); // ゲームの状態を準備中にする currentGameState = GameState.Wait; // ルート用の経路情報を設定 originRailPathData = DataBaseManager.instance.GetRailPathDatasFromBranchNo(0, BranchDirectionType.NoBranch); // イベント生成機能の準備 eventGenerator.SetUpEventGenerator(this, playerController); // 初期武器登録 GameData.instance.AddWeaponData(DataBaseManager.instance.GetWeaponData(0)); // 武器取得イベント用の設定 weaponEventInfo.InitializeWeaponEventInfo(); // 初期武器設定 playerController.ChangeBulletData(GameData.instance.weaponDatasList[0]); // 初期武器のモデル表示 weaponChanger.InitWeaponModel(); // 武器切り替えボタンにメソッドを登録 uiManager.GetWeaponChangeButton().onClick.AddListener(weaponChanger.ChangeWeapon); // RailMoveController の初期設定 railMoveController.SetUpRailMoveController(this); // パスデータよりミッションの発生有無情報取得 SetMissionTriggers(); // 次に再生するレール移動の目的地と経路のパスを設定 railMoveController.SetNextRailPathData(originRailPathData); // 経路の準備が完了するのを待つ yield return new WaitUntil(() => railMoveController.GetMoveSetting()); // ゲームの状態をプレイ中に変更する currentGameState = GameState.Play_Move; } /// <summary> /// パスデータよりミッションの発生有無情報取得 /// </summary> private void SetMissionTriggers() { // 配列の初期化 isMissionTriggers = new bool[originRailPathData.GetIsMissionTriggers().Length]; // ミッション発生有無の情報を登録 isMissionTriggers = originRailPathData.GetIsMissionTriggers(); // ムービー再生情報用の配列を初期化 isMoviePlays = new bool[originRailPathData.GetIsMoviePlays().Length]; // ムービー再生有無の情報を登録 isMoviePlays = originRailPathData.GetIsMoviePlays(); } /// <summary> /// ミッションの発生有無の判定 /// </summary> /// <param name="index"></param> public void CheckMissionTrigger(int index) { if (isMissionTriggers[index]) { // ミッション発生 PreparateMission(originRailPathData.pathDataDetails[index].missionEventDetail); Debug.Log("ミッション発生"); } else { // ミッションなし。次のパスへ移動を再開 railMoveController.CountUp(); } } /// <summary> /// ミッションの準備 /// </summary> /// <param name="missionEventDetail"></param> private void PreparateMission(MissionEventDetail missionEventDetail) { // ミッションの時間設定 currentMissionDuration = missionEventDetail.missionDuration; // 武器取得イベントか判定 if (missionEventDetail.eventTypes[0] == EventType.Weapon) { // 武器の情報を取得してセット weaponEventInfo.SetWeaponData(DataBaseManager.instance.GetWeaponData(missionEventDetail.eventNos[0])); weaponEventInfo.Show(); } else { // ミッション内の各イベントの生成(敵、ギミック、トラップ、アイテムなどを生成) eventGenerator.PrepareGenerateEnemies(missionEventDetail.enemyPrefabs, missionEventDetail.eventTrans); } // ミッション開始 StartCoroutine(StartMission(missionEventDetail.clearConditionsType)); } /// <summary> /// ミッション開始 /// </summary> /// <param name="clearConditionsType"></param> /// <returns></returns> private IEnumerator StartMission(ClearConditionsType clearConditionsType) { // ゲームの進行状態をミッション中に変更 currentGameState = GameState.Play_Mission; // ミッションの監視 yield return StartCoroutine(ObservateMission(clearConditionsType)); // ミッション終了 EndMission(); } /// <summary> /// ミッションの監視 /// 各イベントの状態を監視 /// </summary> /// <param name="clearConditionsType"></param> /// <returns></returns> private IEnumerator ObservateMission(ClearConditionsType clearConditionsType) { // クリア条件を満たすまで監視(currentMissionDuration 変数には、敵の数か、残り時間が入る) while (currentMissionDuration > 0) { // クリア条件が時間経過の場合 if (clearConditionsType == ClearConditionsType.TimeUp) { // カウントダウン currentMissionDuration--; } // 武器取得イベントかつ、武器選択のいずれかのボタンを押したら if (weaponEventInfo.gameObject.activeSelf && weaponEventInfo.isChooseWeapon) { // イベント終了 currentMissionDuration = 0; weaponEventInfo.Hide(); Debug.Log("武器取得イベント終了"); yield break; } yield return null; } Debug.Log("ミッション終了"); } /// <summary> /// ミッション終了 /// </summary> public void EndMission() { // 武器の取得イベントの場合には武器を取得せずにポップアップを閉じる if (weaponEventInfo.gameObject.activeSelf) { weaponEventInfo.Hide(); } // 今回分の敵の情報をクリア ClearEnemiesList(); // ゲームの進行状態を移動中に変更 currentGameState = GameState.Play_Move; // カメラの移動再開 railMoveController.CountUp(); } /// <summary> /// 敵の List をクリア /// </summary> private void ClearEnemiesList() { if (enemiesList.Count > 0) { for (int i = 0; i < enemiesList.Count; i++) { Destroy(enemiesList[i]); } } enemiesList.Clear(); } /// <summary> /// 敵の情報を List から削除し、ミッション内の敵の残数を減らす /// </summary> /// <param name="enemy"></param> public void RemoveEnemyList(EnemyController enemy) { currentMissionDuration--; enemiesList.Remove(enemy); } /// <summary> /// 敵の情報をリストに追加 /// </summary> /// <param name="enemy"></param> public void AddEnemyList(EnemyController enemy) { enemiesList.Add(enemy); } /// <summary> /// ルートの分岐確認の準備 /// </summary> /// <param name="nextbranchNo">moveCount</param> public void PreparateCheckNextBranch(int nextbranchNo) { StartCoroutine(CheckNextBranch(nextbranchNo)); } /// <summary> /// ルートの分岐判定 /// </summary> /// <param name="nextStagePathDataNo"></param> /// <returns></returns> private IEnumerator CheckNextBranch(int nextStagePathDataNo) { if (nextStagePathDataNo >= DataBaseManager.instance.GetStagePathDetasListCount()) { // 終了 Debug.Log("ゲーム終了"); // プレイヤー側のクリアの準備 playerController.PrepareClearSettings(); // すべての武器を非表示 weaponChanger.InactiveWeapons(); // カメラの演出 cameraController.ClearCameraRoll(playerController.transform.position + new Vector3(0, 0, 10), new Vector3(0, 180, 0), new float[2] { 1.5f, 2.0f }); ////* 処理を追加します *//// // クリアしたステージの番号を List に追加 GameData.instance.AddClearStageNoList(currentStageNo); // TODO セーブ ////* ここまで *//// yield break; } // ルートに分岐があるかどうかの判定 if (DataBaseManager.instance.GetBranchDatasListCount(nextStagePathDataNo) == 1) { Debug.Log("分岐なしで次のルートへ"); // 分岐なしの場合、次の経路を登録 originRailPathData = DataBaseManager.instance.GetRailPathDatasFromBranchNo(nextStagePathDataNo, BranchDirectionType.NoBranch); } else { // 分岐がある場合、UI に分岐を表示し、選択を待つ Debug.Log("ルートの分岐発生"); // 分岐がある場合、分岐イベントを発生させて、画面上に矢印のボタンを表示 uiManager.GenerateBranchButtons(DataBaseManager.instance.GetBranchDirectionTypes(nextStagePathDataNo)); // 分岐を選択するまで待機(while でもOK) yield return new WaitUntil(() => uiManager.GetSubmitBranch().Item1 == true); // 選択した分岐のルートを設定 originRailPathData = DataBaseManager.instance.GetRailPathDatasFromBranchNo(nextStagePathDataNo, uiManager.GetSubmitBranch().Item2); } // ルート内のミッション情報を設定 SetMissionTriggers(); // 経路を移動先に設定 railMoveController.SetNextRailPathData(originRailPathData); // レール移動の経路と移動登録が完了するまで待機 yield return new WaitUntil(() => railMoveController.GetMoveSetting()); // ゲームの進行状態を移動中に変更する currentGameState = GameState.Play_Move; } /// <summary> /// ムービーを再生するか確認 /// </summary> /// <param name="index"></param> public void CheckMoviePlay(int index) { Debug.Log(index); if (!isMoviePlays[index]) { Debug.Log("ムービー再生 なし"); // ミッション発生有無の確認 CheckMissionTrigger(index); } else { // ムービー再生の準備 StartCoroutine(PrepareMoviePlay(index)); } } /// <summary> /// ムービー再生の準備 /// </summary> /// <param name="index"></param> /// <returns></returns> private IEnumerator PrepareMoviePlay(int index) { Debug.Log("ムービー準備開始"); // Canvas を非表示 uiManager.SwitchActivateCanvas(false); // 弾を発射をできないようにする playerController.IsShootPerimission = false; yield return StartCoroutine(PlayMovie()); /// ムービー再生 IEnumerator PlayMovie() { Debug.Log("ムービー再生開始"); // ムービー再生の準備と再生 VideoClipManager.instance.PrepareVideoClip(originRailPathData.pathDataDetails[index].missionEventDetail.videoNo, originRailPathData.pathDataDetails[index].missionEventDetail.videoClip); // ムービーの準備時間だけ待機 yield return new WaitForSeconds(1.5f); Debug.Log("ムービー準備待機 終了"); // ムービー再生が終了するまで待機(どちらの処理でも待機できます) yield return new WaitUntil(() => !VideoClipManager.instance.IsVideoPlaying); //yield return new WaitForSeconds((float)originRailPathData.pathDataDetails[index].missionEventDetail.videoClip.length); Debug.Log("ムービー再生 終了"); // 画面のフェードインが戻るまでの間、待機してから yield return new WaitForSeconds(1.0f); // Canvas を表示 uiManager.SwitchActivateCanvas(true); // ムービーが終了したので弾の発射を許可 playerController.IsShootPerimission = true; // ミッション発生有無の確認 CheckMissionTrigger(index); } } }