using System; using System.Collections; using System.Collections.Generic; using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Engines; using Common; using DragonLi.Core; using Mirror; using UnityEngine; using UnityEngine.PlayerLoop; using XPlugin.Data.JsonLiteDB; using static XPlugin.Data.JsonLiteDB.JsonLiteDB; using LitJson; using Pathfinding; using DarkTonic.MasterAudio; using DG.Tweening; using NaughtyAttributes; using UnityEngine.UIElements; /// /// 游戏状态 /// public enum GameState { None = 0, /// /// 教学 /// Introduce = 1, Playing = 2, /// /// 胜利 /// Victory = 3, /// /// 失败 /// Failur = 4, } public class GameManager : MonoBehaviour { public static GameManager Ins { get; private set; } #region 预制体 public GameObject DoorPre; public GameObject BombPre; public GameObject ArrowPre; public Transform doorPos; public Transform[] bossPos; // 怪物预制集合 public GameObject[] EnemyPres; #endregion // json数据库 private JsonLiteDB DB; // 怪物信息集合 public Dictionary> EnemyInfos = new Dictionary>(); // 建筑信息集合 public Dictionary> BuildInfos = new Dictionary>(); // 枪械信息集合 public Dictionary> GunInfos = new Dictionary>(); // 子弹信息集合 public Dictionary> BulletInfos = new Dictionary>(); // 防线信息 public List ScenesInfos = new List(); // 剧情信息 public Dictionary> CombatUnitInfos = new Dictionary>(); /// /// 敌人自增 /// private int enemyIndex = 0; public GameObject[] bossSouls; public Transform[] soulsPos; /// /// 所有敌人 /// public Dictionary EnemyList = new Dictionary(); /// /// 所有敌人UI /// public Dictionary EnemyUIList = new Dictionary(); /// /// 所有炮塔 /// public Dictionary TowerList = new Dictionary(); public Dictionary SettleInfos = new Dictionary(); /// /// 波次自增 /// public int roundIndex = 0; // 游玩结束时间 public long vistEnd = 0; // 总游玩时长 [NonSerialized] public int vistAllTime = (int)(60 * 10f); public float curGameTime = 0; public string settleData = ""; public bool isGameEnd = false; public bool isGameStart = false; public float curTime; public GameState gameState = GameState.None; [SoundGroup] public string JointIn; [SoundGroup] public string roundSound; [Header("咆哮")] [SoundGroup] public string DragonRoar; // 语音包 [SoundGroup] public string attack2IceDragon; [SoundGroup] public string[] says; [NonSerialized] public int blueScore = 0; [NonSerialized] public int redScore = 0; // private Arrow _nowArrow; private int _frame = 0; public GameObject playerPre; public Player _player; public int curBossId = 0; [NonSerialized] public Enemy CurBoss; public Transform standPos; void Awake() { Ins = this; } void Start() { AuthorPanel.Show(); LoginPanel.Show(); CoroutineTaskManager.Instance.WaitSecondTodo(() => { WorldUIManager.Ins.Back(); }, 1f); foreach (var item in bossSouls) { item.SetActive(false); } #if !UNITY_EDITOR TrueGearEffectManager.Ins.StartRequestTrueGear(); #endif } void Update() { if (gameState == GameState.Playing) { curGameTime+=Time.deltaTime; } } public int GetNowTime() { return Mathf.RoundToInt(curGameTime); } /// /// 创建门 /// public void CreateDoor() { UpdateConf(); GameObject door = Instantiate(DoorPre); //NetworkServer.Spawn(door); door.transform.position = doorPos.position; _player = Instantiate(playerPre).GetComponent(); } public void ShowDragonSoul(Transform startPos) { var id = curBossId; bossSouls[id].SetActive(true); bossSouls[id].transform.position = startPos.position+new Vector3(0,2,0); CoroutineTaskManager.Instance.WaitSecondTodo(() => { bossSouls[id].transform.DOMove(soulsPos[id].position, 3).OnComplete(() => { if (id == 3) { GameOver(GameState.Victory); GameLocal.Ins.gameEndEffect.SetActive(true); } }); }, 3f); } /// /// 创建下一回合 /// public void CreateNextRound() { roundIndex++; if (CreateRound(roundIndex)) { PlaySound2DRPC(roundSound); RpcMessageRound(); } else { GameOver(GameState.Victory); } } /// /// 创建回合 /// public bool CreateRound(int progress) { // 修复场上所有炮塔 foreach (Tower tower in TowerList.Values) { if (tower.type != TowerType.PowerCore) { // 只恢复被击毁的 if (tower.state == TowerState.Broken) { tower.RepairImm(); } } } bool created = false; CombatUnitInfos.TryGetValue(progress, out List combatUnitInfos); if (combatUnitInfos != null) { created = true; foreach (CombatUnitInfo combatUnitInfo in combatUnitInfos) { CoroutineTaskManager.Instance.WaitSecondTodo(() => { if (combatUnitInfo.Special == 0) { CreateEnemy( (EnemyType)combatUnitInfo.EnemyType, combatUnitInfo.BornPos, combatUnitInfo.BornAngleY ); } else { CreateAir( (EnemyType)combatUnitInfo.EnemyType, combatUnitInfo.BornPos, combatUnitInfo.BornAngleY); } }, combatUnitInfo.BornTime); } } return created; } /// /// 教学开始 /// public void IntroduceStart() { gameState = GameState.Introduce; _frame = 0; } public void PlayerGetEx(int amount, Vector3 fromPos) { _player.GetEx(amount, fromPos); } /// /// 游戏开始 /// public void GameStart() { if(gameState == GameState.Playing) return; gameState = GameState.Playing; isGameStart = true; MasterAudio.PlaySound(says[1]); // 进入教学 CoroutineTaskManager.Instance.WaitSecondTodo(() => { MasterAudio.PlaySound(attack2IceDragon); MasterAudio.PlaySound(DragonRoar); CreateEnemy(EnemyType.IceDragon, bossPos[curBossId].position, bossPos[curBossId].eulerAngles.y); }, 8f); ShowPlayerUI(); vistEnd = (long)(DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds + vistAllTime; CoroutineTaskManager.Instance.WaitSecondTodo(() => { GameOver(GameState.Failur); }, vistAllTime); } public void RpcShowSettle() { GameLocal.Ins.Settle.SetActive(true); } public void GivePistol() { Debug.Log("创建武器中..."); // GameLocal.Ins.self.PickUpGun(GunType.Pistol, -999); } public void SetGameState(GameState state) { gameState = state; } //1.游戏时间到 //2.所有怪物被消灭 //3.玩家被消灭 //以上都要跳出结算 public void GameOver(GameState state) { gameState = state; RpcShow(gameState== GameState.Victory); string bgmStr = "巨龙BGMWAV"; if (state == GameState.Victory) bgmStr = "战斗胜利-长"; else if (state == GameState.Failur) bgmStr = "战斗失败-短"; MasterAudio.StopAllOfSound("巨龙BGMWAV"); MasterAudio.PlaySound(bgmStr); isGameEnd = true; if (gameState == GameState.Failur) { LoseEndGame(); } MonoSingleton.Instance.WaitSecondTodo(() => { Debug.Log("游戏结束,60秒后退出"); Application.Quit(); }, 60f); } public void LoseEndGame() { foreach (var item in EnemyList) { item.Value.CloseGuard(); Destroy(item.Value.gameObject); } GameLocal.Ins.self.IsAlive = false; GameLocal.Ins.self.End(); } public void CloseCurBoss() { CurBoss.Die(null,_player.transform); } public void RpcShow(bool isWin) { SettlePanel.Show(isWin); } public void ShowPlayerUI() { HUDPanel.Show(); } /// /// 下一波进攻开始 /// public void RpcMessageRound() { CoroutineTaskManager.Instance.WaitSecondTodo(() => { DragonLi.Core.EventDispatcher.TriggerEvent("NewWaveStart", roundIndex); }, 0.5f); } public void ChangeBgmRpc(int i) { GameLocal.Ins.BGMState.StateChange(i); } /// /// 创建敌方单位 /// public GameObject CreateEnemy(EnemyType type, Vector3 pos, float angleY) { GameObject enemy = Instantiate(EnemyPres[(int)type]); enemy.transform.position = pos; enemy.transform.eulerAngles = new Vector3(0, angleY, 0); enemyIndex++; Enemy enemyScript = enemy.GetComponent(); if (type <= EnemyType.BlackDragon) CurBoss = enemyScript; enemyScript.OnSpawn(enemyIndex, type, 1); EnemyList.Add(enemyIndex, enemyScript); return enemy; } /// /// 删除敌方单位 /// public void DeleteEnemy(int id) { GameObject enemy = EnemyList[id].gameObject; EnemyList.Remove(id); Destroy(enemy); if (EnemyList.Count == 0) { CreateNextRound(); } } /// /// 痛击场上所有敌方单位 /// public void DamageAllEnemy() { foreach (Enemy enemy in EnemyList.Values) { enemy.ApplyDamage(999999, -1, Vector3.zero, null); } } /// /// 创建炮弹 /// public void CreateBomb(Vector3 pos, Vector3 angle) { GameObject bomb = Instantiate(BombPre); NetworkServer.Spawn(bomb); bomb.transform.position = pos; bomb.transform.eulerAngles = angle; } public void CreateAir(EnemyType type, Vector3 pos, float angleY) { GameObject enemy = Instantiate(EnemyPres[(int)type]); NetworkServer.Spawn(enemy); enemy.transform.position = pos; enemy.transform.eulerAngles = new Vector3(0, angleY, 0); Airdrop enemyScript = enemy.GetComponent(); enemyScript.OnSpawn(type, 1); } /// /// 更新配置表 /// public void UpdateConf() { string text = Resources.Load("Data").text; if (text != null) { ParseGameJson(text); } } public void ParseGameJson(string text) { DB = new JsonLiteDB(); DB.Load(text); // 怪物信息 TableReader infoReader = DB["EnemysInfo"].GetReader(); while (infoReader.Read()) { EnemyInfo info = new EnemyInfo(infoReader); EnemyInfos.TryGetValue((EnemyType)info.Type, out Dictionary infoList); if (infoList == null) { Dictionary list = new Dictionary(); list.Add(info.Lvl, info); EnemyInfos.Add((EnemyType)info.Type, list); } else { infoList.Add(info.Lvl, info); } } // 建筑信息 infoReader = DB["BuildsInfo"].GetReader(); while (infoReader.Read()) { BuildInfo info = new BuildInfo(infoReader); BuildInfos.TryGetValue((BuildType)info.Type, out Dictionary infoList); if (infoList == null) { Dictionary list = new Dictionary(); list.Add(info.Lvl, info); BuildInfos.Add((BuildType)info.Type, list); } else { infoList.Add(info.Lvl, info); } } infoReader = DB["GunsInfo"].GetReader(); while (infoReader.Read()) { GunInfo info = new GunInfo(infoReader); GunInfos.TryGetValue((GunType)info.Type, out Dictionary infoList); if (infoList == null) { Dictionary list = new Dictionary(); list.Add(info.Lvl, info); GunInfos.Add((GunType)info.Type, list); } else { infoList.Add(info.Lvl, info); } } // 子弹信息 infoReader = DB["BulletsInfo"].GetReader(); while (infoReader.Read()) { BulletInfo info = new BulletInfo(infoReader); BulletInfos.TryGetValue((BulletType)info.Type, out Dictionary infoList); if (infoList == null) { Dictionary list = new Dictionary(); list.Add(info.Lvl, info); BulletInfos.Add((BulletType)info.Type, list); } else { infoList.Add(info.Lvl, info); } } // 场景信息 infoReader = DB["ScenesInfo"].GetReader(); while (infoReader.Read()) { ScenesInfo info = new ScenesInfo(infoReader); ScenesInfos.Add(info); } infoReader = DB["StoryProgressInfo"].GetReader(); while (infoReader.Read()) { CombatUnitInfo info = new CombatUnitInfo(infoReader); CombatUnitInfos.TryGetValue(info.Belong, out List infoList); if (infoList == null) { List list = new List(); list.Add(info); CombatUnitInfos.Add(info.Belong, list); } else { infoList.Add(info); } } Debug.Log("游戏数值更新 -> complete"); } /// /// 获取范围内敌人 /// public int GetRangeEnemyId(Vector3 pos, float radius) { int res = -1; foreach (Enemy enemy in EnemyList.Values) { float dis = Vector3.Distance(enemy.transform.position, pos); if (dis <= radius) { radius = dis; res = enemy.id; break; } } return res; } public void DeleteEnemyUI(int id) { GameObject enemyUI = EnemyUIList[id].gameObject; EnemyUIList.Remove(id); NetworkServer.Destroy(enemyUI); } public void RpcShowHUD() { // HUDPanel.Show(); } #region 空投道具 /// /// 修复炮塔 /// public void RepairTower() { } /// /// 进入联控 /// public void JoinControlTower(int playerIndex) { PlayJointMusic(); // 修改所有炮塔模式 foreach (Tower tower in TowerList.Values) { if (tower.controllerId == -1) { tower.controllerId = playerIndex; tower.mode = TowerMode.Joint; } } TriggerEvent("JoinControlStart", playerIndex); CoroutineTaskManager.Instance.WaitSecondTodo(() => { ChangeBgmRpc(1); foreach (Tower tower in TowerList.Values) { if (tower.mode == TowerMode.Joint) { tower.controllerId = playerIndex; tower.mode = tower.originalMode; } TriggerEvent("JoinControlEnd", playerIndex); } }, 30f); } #endregion public void TriggerEvent(string key, int param) { DragonLi.Core.EventDispatcher.TriggerEvent(key, param); } public void AddScore(string index, int damage) { if (SettleInfos.ContainsKey(index)) { SettleInfos[index].Score += damage; } string jsonStr = JsonMapper.ToJson(SettleInfos); settleData = jsonStr; } public void SetTitle(string index, string title) { if (SettleInfos.ContainsKey(index)) { SettleInfos[index].Title = title; } Debug.Log(SettleInfos); } public void SetPlayerName(string index) { if (SettleInfos.ContainsKey(index)) { SettleInfos[index].playerName = int.Parse(index); } } public void AddData(int playerIndex) { SettleInfos.Add(playerIndex.ToString(), new SettleInfo()); } public string SerializeSettleInfos() { return JsonUtility.ToJson(SettleInfos); } #region 工具 public string GetLessTimeStr() { string res = ""; if (gameState == GameState.Playing) { res = FormatTime((int)(vistEnd - DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds)); } return res; } public int GetLessTimeSeconds() { return (int)(vistEnd - DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds); } // 时分秒 public string FormatTime(int totalSeconds) { int hours = totalSeconds / 3600; // string hh = hours < 10 ? "0" + hours : hours.ToString(); int minutes = (totalSeconds - hours * 3600) / 60; string mm = minutes < 10f ? "0" + minutes : minutes.ToString(); int seconds = totalSeconds - hours * 3600 - minutes * 60; string ss = seconds < 10 ? "0" + seconds : seconds.ToString(); return string.Format("{0}:{1}", mm, ss); } #endregion public void PlaySound2DRPC(string sound) { MasterAudio.PlaySound(sound); } public void PlayJointMusic() { MasterAudio.PlaySound(JointIn); GameLocal.Ins.BGMState.StateChange(2); } public void PlayNarration16() { MasterAudio.PlaySound(says[2]); } /// /// 当心!又一只恶龙到来了,快消灭它! /// /// public void PlayNarration17(Action cb = null) { StartCoroutine(MasterAudio.PlaySoundAndWaitUntilFinished(says[3], 1, null, 0, null, () => { cb?.Invoke(); })); } /// /// 咆哮 /// public void PlayDragonRoar(Action cb = null) { // Debug.Log("咆哮开始"); StartCoroutine(MasterAudio.PlaySoundAndWaitUntilFinished(DragonRoar, 1, null, 0, null, () => { // Debug.Log("咆哮结束"); cb?.Invoke(); })); } // /// // /// 手上创建箭矢 // /// // public void CreateArrowInHand() // { // _nowArrow = Instantiate(ArrowPre, _player.bow.bulletPoint).GetComponent(); // } // /// // /// 射出箭矢 // /// // public void ShootArrow() // { // if (_nowArrow != null) // { // if (gameState == GameState.Introduce) // { // GameStart(); // } // MasterAudio.PlaySound(arrowShoot); // Destroy(_nowArrow.gameObject); // } // } }