using BestHTTP; using DragonLi.Core; using System; using System.Collections; using System.Collections.Generic; using Unity.Mathematics; using Unity.XR.PXR; using UnityEngine; using XPlugin.Data.JsonLiteDB; using static XPlugin.Data.JsonLiteDB.JsonLiteDB; using Random = UnityEngine.Random; /// /// 游戏场地 /// public enum GamePlace { // Test = -1, Company1Floor = 0, LiaoningAnShan = 1, Liaoning_AnShan_Lishan_Dayuecheng=-1, HangZhouLongHuTianJie = 2, Nanjing_Yuhua_Wanxiang = 3, Nanjing_Xianlin_WanDaMao = 4, Yangzhou_Hanjiang_Tansuozhongxin = 5, Yangzhou_Hanjiang_TansuoZhongxin_wai = -5, Zhejiang_Jinhua_KeJiGuan = 6, Guangzhou_Panyv_Zhanting = 7, Anhui_Wuhu_Guanwei = 8, Shandong_Jining_Shangchang = 9, Shandong_Jining_Shangchang_nei = -9, ShanDong_Langfang_QingzhouTaihuacheng = 10, Hubei_Xiangyang_Kejiguan = 11, Zhejiang_Shaoxing_Shengzhou_WuyueGuangchang=12, Hunan_Jishou_Qianzhou_Tianhong=13, Jilin_Tonghua_Liuhe=14, Shandong_Jinan_Huaiyin_ShengfutongShangmao = 15, Shandong_Jinan_Huaiyin_ShengfutongShangmao_wai = -15, Henan_Xinzheng_Shuanghudadao_Longhujinyicheng = 16, Nanjing_Qixia_Yaohuamen_Jindiguangchang = 17, Nanjing_Qixia_Yaohuamen_Jindiguangchang_nei = -17, Anshan_Suzhou_Yueshan_Guchengshangyejie = 18, Gansu_Longnan_Shicheng_Dongsheng = 19, Shandong_Heze_Yuncheng_Gefuli = 20, Wulanhaote_Ouya_Shangchang = 21, Wulanhaote_Wanda_Shangchang = -21, Yunnan_Mile_Jinchen_Shidaiguangchang = 22, Xinjiang_Yili_Yining_Wanrong = 23, Hunan_Hengyang_Zhuhui_Dongzhoudao = 24, Hunan_Hengyang_Zhuhui_Dongzhoudao_nei = -24, Yunnan_Lincang_Linxiang_Hengji = 25, Yunnan_Lincang_Linxiang_Hengji_Dixia = -25, Guangxi_Guilin_Gongcheng_Shijixincheng = 26, Guangdong_Shenzhen_Guangming_Wanda = 27, Gansu_Jinchang_Jinchuan_Shijiguangchang = 28, Gansu_Jinchang_Jinchuan_Shijiguangchang_Shiwai=-28, Jiangsu_Xvzhou_Fengxian_Wuyueguangchang =29, Hebei_Tangshan_Qianan_Tianyuangu = 30, Guangdong_Guangzhou_Yanghaiyan = 31, Guangdong_Guangzhou_Yanghaiyan_Lihu=-31, Zhejiang_Hangzhou_Linping_Yintaicheng = 32, Zhejiang_Hangzhou_Linping_Yintaicheng_Shinei= -32, Henan_Xinxiang_Wandaguangchang =33, Henan_Xinxiang_Wandaguangchang_Shinei=-33, Yangzhou_Hanjiang_TansuoZhongxin_Waidai =34, Nanjing_Pukou_Longhutianjie=35, Jiangsu_Xvzhou_Guolou_Oulebao=36, Jiangsu_Xvzhou_Guolou_Oulebao_2=-36, Jiangsu_Xvzhou_Suning_Guangchang =37, Jiangsu_Xvzhou_Suning_Guangchang_1=-37, Shanxi_Baoji_Meixian_TianlongShangcheng = 38, Hunan_Changde_Lixian_WandaGuangchang=39, } public class GameManager : MonoBehaviour { public static GameManager Ins { get; private set; } // json数据库 private JsonLiteDB DB; // Enemy子弹数据 public Dictionary EnemyBulletDataDic = new Dictionary(); // Player子弹数据 public Dictionary PlayerBulletDataDic = new Dictionary(); public List curEnemyList = new List(); public Dictionary EnemyDataDic = new Dictionary(); [Header("道具")] public GameObject gameStartPointPre; public GameObject enemyDoorPre; public GameObject enemySkillTipPre; [Header("敌人")] public GameObject[] enemyPre; [Header("玩家")] public GameObject playerPre; public GameObject player; public bool GameStart = false; public bool isGameEnd = false; public float EnergyPumpFillAmount = 0; public float curTime; public float buffAtk = 0f; public float buffDef = 0f; public LoginInfo loginInfo = new LoginInfo(); public Enemy curBoss; public int curLevel = 0; //添加 [Header("AI角色")] public GameObject aiCharacterPre;//AI角色预制体 private GameObject aiCharacter;//AI角色实例 public void Start() { Ins = this; CreatePlayer(); LoginPanel.Show(); #if !UNITY_EDITOR PXR_Enterprise.InitEnterpriseService(); PXR_Enterprise.BindEnterpriseService(); TrueGearEffectManager.Ins.StartRequestTrueGear(); #endif CoroutineTaskManager.Instance.WaitSecondTodo(ShowPlayerUI, 1.5f); } /// /// 登录 /// public void Request(Action cb = null) { string url = "http://www.pineappletech.cn/startcount"; HTTPRequest request = new HTTPRequest(new Uri(url), HTTPMethods.Post, (req, response) => { if (response != null) { Debug.Log("收到数据 ->" + response.DataAsText); } cb?.Invoke(req, response); }); loginInfo.deviceSn = GetPicoSn(); loginInfo.startAt = ConvertTimestampToDateTime(GetTimestamp()) + ""; loginInfo.shop = 39; #if !UNITY_EDITOR && UNITY_ANDROID && PICO loginInfo.shop = (int)GameInit.Ins.gamePlace; if(GameInit.Ins.gamePlace== GamePlace.Liaoning_AnShan_Lishan_Dayuecheng) loginInfo.shop = 1; if(GameInit.Ins.gamePlace== GamePlace.Yangzhou_Hanjiang_TansuoZhongxin_wai) loginInfo.shop = 5; if(GameInit.Ins.gamePlace== GamePlace.Shandong_Jining_Shangchang_nei) loginInfo.shop = 9; if(GameInit.Ins.gamePlace== GamePlace.Shandong_Jinan_Huaiyin_ShengfutongShangmao_wai) loginInfo.shop = 15; if(GameInit.Ins.gamePlace== GamePlace.Nanjing_Qixia_Yaohuamen_Jindiguangchang_nei) loginInfo.shop = 17; if(GameInit.Ins.gamePlace== GamePlace.Wulanhaote_Wanda_Shangchang) loginInfo.shop = 21; if(GameInit.Ins.gamePlace== GamePlace.Hunan_Hengyang_Zhuhui_Dongzhoudao_nei) loginInfo.shop = 24; if(GameInit.Ins.gamePlace== GamePlace.Yunnan_Lincang_Linxiang_Hengji_Dixia) loginInfo.shop = 25; if(GameInit.Ins.gamePlace== GamePlace. Gansu_Jinchang_Jinchuan_Shijiguangchang_Shiwai) loginInfo.shop = 28; if(GameInit.Ins.gamePlace== GamePlace. Guangdong_Guangzhou_Yanghaiyan_Lihu) loginInfo.shop = 31; if(GameInit.Ins.gamePlace== GamePlace.Zhejiang_Hangzhou_Linping_Yintaicheng_Shinei) loginInfo.shop = 32; if(GameInit.Ins.gamePlace== GamePlace.Henan_Xinxiang_Wandaguangchang_Shinei) loginInfo.shop = 33; if(GameInit.Ins.gamePlace== GamePlace.Jiangsu_Xvzhou_Guolou_Oulebao_2) loginInfo.shop = 36; if(GameInit.Ins.gamePlace== GamePlace.Jiangsu_Xvzhou_Suning_Guangchang_1) loginInfo.shop = 37; #endif //loginInfo.shop = 0; loginInfo.gameId = 5; string authJson = JsonUtility.ToJson(loginInfo); Debug.Log("发送数据 -> " + authJson); request.RawData = System.Text.Encoding.UTF8.GetBytes(authJson); request.AddHeader("Content-Type", "application/json"); request.Send(); } /// /// 更新配置表 /// public void InitData() { string text = ""; string text0 = Resources.Load(string.Format("zh/{0}Data", GameInit.Ins.gamePlace)).text; GetReaderJson(text0); } public static string ConvertTimestampToDateTime(long timestamp) { // Unix时间戳是从1970年1月1日00:00:00开始的秒数或毫秒数 // 这里以秒为单位,如果时间戳是毫秒则除以1000 DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime; return dateTime.ToString("yyyy-MM-dd HH:mm:ss"); } public void GetReaderJson(string text) { DB = new JsonLiteDB(); DB.Load(text); // 读取Info表数据 TableReader infoReader = DB["EnemyData"].GetReader(); EnemyDataDic.Clear(); while (infoReader.Read()) { EnemyData info = new EnemyData(infoReader); EnemyDataDic.Add(info.Id, info); } // 敌人子弹数据 TableReader EnemyBulletReader = DB["EnemyBulletData"].GetReader(); EnemyBulletDataDic.Clear(); while (EnemyBulletReader.Read()) { BulletData data = new BulletData(EnemyBulletReader); EnemyBulletDataDic.Add(data.ID, data); } // 玩家子弹数据 TableReader PlayerBulletReader = DB["PlayerBulletData"].GetReader(); PlayerBulletDataDic.Clear(); while (PlayerBulletReader.Read()) { BulletData data = new BulletData(PlayerBulletReader); PlayerBulletDataDic.Add(data.ID, data); } } /// /// Get sn /// public string GetPicoSn() { string res = "UnityEditor"; #if !UNITY_EDITOR && UNITY_ANDROID && PICO res = PXR_Enterprise.StateGetDeviceInfo(SystemInfoEnum.EQUIPMENT_SN); #endif return res; } public long GetTimestamp() { return (long)DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; } public bool isGamePlay; //AI介绍是否完成 private bool isAIIntroductionComplete = false; // 游戏开始 public void GamePlay() { //修改处:创建AI角色 //CreateAICharacter(); isGamePlay = true; CreateBoss(); PlayerUIMessage(0); CoroutineTaskManager.Instance.WaitSecondTodo(() => AudioManager.Ins?.SoundPlay("bgm2", true), 10f); CoroutineTaskManager.Instance.WaitSecondTodo(() => AudioManager.Ins?.SoundPlay("2.39BGM", true), 30f); } //修改处:添加AI介绍完成后的游戏开始方法 public void StartGameAfterIntroduction() { isAIIntroductionComplete = true; isGamePlay = true; Debug.Log("AI介绍完成,开始游戏正常流程"); //创建Boss CreateBoss(); PlayerUIMessage(0); CoroutineTaskManager.Instance.WaitSecondTodo(() => AudioManager.Ins?.SoundPlay("bgm2", true), 10f); CoroutineTaskManager.Instance.WaitSecondTodo(() => AudioManager.Ins?.SoundPlay("2.39BGM", true), 30f); } //修改处:添加创建AI角色的方法 private void CreateAICharacter() { //检查是否已经存在AI角色 if (aiCharacter != null) { Debug.Log("AI角色已经存在,不再创建新的"); return; } if (aiCharacterPre != null) { Debug.Log("创建AI角色"); //在玩家前方创建AI角色 Vector3 spawnPosition = player.transform.position + player.transform.forward * 3f; aiCharacter = Instantiate(aiCharacterPre, spawnPosition, Quaternion.identity); //获取AIController并启动开场白 AIController aiController = aiCharacter.GetComponent(); if (aiController != null) { //注册AI介绍完成回调 aiController.OnIntroductionComplete += StartGameAfterIntroduction; //添加延迟,确保所有组件已经完成初始化 StartCoroutine(DelayedStartIntroduction(aiController)); } else { Debug.LogError("AI预制体中的AIController组件丢失"); } } else { Debug.LogError("AI预制体没有在GameManager分配!"); } } private IEnumerator DelayedStartIntroduction(AIController aiController) { yield return new WaitForSeconds(0.1f); // 短暂延迟 aiController.StartIntroduction(); } public void ShowPlayerUI() { OverlayUI.Ins.Cover("UI/PlayerUI", false); } public void ShowEndGameUI(bool isWin) { CurEnemyDie(); GameEndPanel.Show(isWin); } public GameObject CreateEnemy(int id, Vector3 pos, Vector3 eulerAngles, bool isBoss) { GameObject go = Instantiate(enemyPre[id], pos, Quaternion.identity); go.transform.localEulerAngles = eulerAngles; Enemy enemy = go.GetComponent(); enemy.Init(); if (isBoss) { curBoss = enemy; } else { curEnemyList.Add(enemy); } return go; } void Destroy() { #if !UNITY_EDITOR PXR_Enterprise.UnBindEnterpriseService(); #endif } public void PlayerUIMessage(int index) { EventDispatcher.TriggerEvent("PromptMessage", index); } public void CreateGameStartPoint() { GameStart = true; isGamePlay = false; GameObject point = Instantiate(gameStartPointPre); if (GameInit.Ins.gamePlace == GamePlace.LiaoningAnShan) { point.transform.position = new Vector3(-2, 0, 2); } if (GameInit.Ins.gamePlace == GamePlace.ShanDong_Langfang_QingzhouTaihuacheng) { point.transform.position = new Vector3(7.46f, 0, 1.65f); } else { point.transform.position = Vector3.zero; } CoroutineTaskManager.Instance.WaitSecondTodo(() => { if (isGamePlay) return; Destroy(point.gameObject); GamePlay(); }, 5f); } public GameObject CreateEnemyDoor(Vector3 pos, Vector3 angle, Vector3 scale) { GameObject crack = Instantiate(enemyDoorPre); crack.transform.position = new Vector3(pos.x, pos.y, pos.z); crack.transform.localEulerAngles = angle; crack.transform.localScale = scale; return crack; } public GameObject CreateEnemySkillTip(Vector3 pos) { GameObject crack = Instantiate(enemySkillTipPre); crack.transform.position = new Vector3(pos.x, pos.y, pos.z); return crack; } public bool isFirstGetWeapon; public void EnemyDisGetWeapon(Vector3 pos) { bool isGet = Random.Range(0, 100) > 70; if (!isGet) return; int index = Random.Range(0, 100); int id = 2; if (index <= 10) id = Random.Range(8, 10); if (index is > 10 and <= 50) id = Random.Range(5, 8); if (index is > 50) id = Random.Range(2, 5); if (!isFirstGetWeapon) { GameInit.Ins.PlayAudio("1.5", GameInit.Ins.self.transform, true); isFirstGetWeapon = true; } } public void CurEnemyDie() { foreach (var enemy in curEnemyList) { if (enemy != null) enemy.Dead(); } curEnemyList.Clear(); } public int GetCurEnemyListCount() { int count = 0; foreach (var enemy in curEnemyList) { if (enemy != null) count++; } return count; } public void CreatePlayer() { player = Instantiate(playerPre); } public bool IsAllBossPetDie() { foreach (var enemy in curEnemyList) { if (enemy != null && enemy.health > 0) return false; } return true; } public void CurLevelWin(Vector3 pos) { curLevel++; CurEnemyDie(); } public void CreateBoss() { Transform data = GameInit.Ins.allBossPos[curLevel]; GameObject door = null; if (curLevel != 0) door = CreateEnemyDoor(data.position, data.eulerAngles, data.localScale); switch (curLevel) { case 0: CreateEnemy(0, data.position, Vector3.zero, true); break; case 1: //舰载机 MonoSingleton.Instance.WaitSecondTodo(() => { door.GetComponent().desTime = 6; door.GetComponent().InitData(); }, 1f); MonoSingleton.Instance.WaitSecondTodo(() => { CreateEnemy(2, data.position, data.eulerAngles, true); }, 3f); break; case 2: MonoSingleton.Instance.WaitSecondTodo(() => { door.GetComponent().desTime = 10; door.GetComponent().InitData(); }, 1f); MonoSingleton.Instance.WaitSecondTodo(() => { CreateEnemy(3, data.position, data.eulerAngles, true); }, 3f); break; case 3: MonoSingleton.Instance.WaitSecondTodo(() => { door.GetComponent().desTime = 10; door.GetComponent().InitData(); }, 1f); MonoSingleton.Instance.WaitSecondTodo(() => { CreateEnemy(5,data.position, data.eulerAngles, true); }, 3f); break; case 4: MonoSingleton.Instance.WaitSecondTodo(() => { door.GetComponent().desTime = 6; door.GetComponent().InitData(); }, 1f); MonoSingleton.Instance.WaitSecondTodo(() => { CreateEnemy(7, data.position, data.eulerAngles, true); }, 1f); break; } } public void WinEndGame() { isGameEnd = true; ShowEndGameUI(true); GameInit.Ins.PlayAudio("1.17", GameInit.Ins.self.transform, true); AudioManager.Ins?.SoundPlay("bgm4", true); ////修改处:销毁AI角色 if (aiCharacter != null) { //取消注册事件 AIController aiController = aiCharacter.GetComponent(); if (aiController != null) { aiController.OnIntroductionComplete -= StartGameAfterIntroduction; } Destroy(aiCharacter); } } public void LoseEndGame() { ShowEndGameUI(false); if (curBoss != null) { Destroy(curBoss.gameObject); } GameInit.Ins.self.IsAlive = false; GameInit.Ins.self.End(); isGameEnd = true; CurEnemyDie(); AudioManager.Ins?.SoundPlay("bgm4", true); //修改处:销毁AI角色 if (aiCharacter != null) { //取消注册事件 AIController aiController = aiCharacter.GetComponent(); if (aiController != null) { aiController.OnIntroductionComplete -= StartGameAfterIntroduction; } Destroy(aiCharacter); } } }