using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using BestHTTP; using BestHTTP.JSON; using DragonLi.Core; using JetBrains.Annotations; using MechanicalAge; using Mirror; using Unity.Mathematics; using Unity.VisualScripting; using Unity.XR.PXR; using UnityEngine; using UnityEngine.UI; using UnityEngine.XR.Interaction.Toolkit; using XPlugin.Data.Json; using XPlugin.Data.JsonLiteDB; using static XPlugin.Data.JsonLiteDB.JsonLiteDB; using Random = UnityEngine.Random; /// /// 游戏场地 /// public enum GamePlace { Company1Floor=0, LiaoningAnShan=1, HangZhouLongHuTianJie=2, Nanjing_Yuhua_Wanxiang=3, Nanjing_Xianlin_WanDaMao=4, Yangzhou_Hanjiang_Tansuozhongxin=5, Yangzhou_Hanjiang_TansuoZhongxin_wai=-5, Zhejiang_Jinhua_KeJiGuan = 6, Shandong_Jining_Wanhuicheng_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, } public class GameManager : NetworkBehaviour { public static GameManager Ins { get; private set; } private string Version = "2.1.9"; //private string Author = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJhMGE4OTE0ZjRjODE0NTNiYWZmMTdiODFmYjBjNmU5YSIsInVzZXIiOiJkZXZpY2UtMDAxIiwic3ViIjoiZGV2aWNlLTAwMSJ9.krKxq1NQYUTlqAMcb0FwHlsI17TLos08OjqUIi_5zmK8sh-LA6hL2awyXZpblrE-LYuWh0g8qA8DjRcjP74hOQ"; private string Author = ""; public string HttpServerUrl = ""; [SyncVar] public List players; //[NonSerialized] [SyncVar] public List enemyList = new List(); /// /// 护盾 /// private Dictionary Shields = new Dictionary(); private int ShieldId = 0; [SyncVar] public int AllEnemyAmount; /// /// 在倒计时之内 /// [SyncVar] public bool isWithinTime = true; [SyncVar] // 游玩结束时间 public long vistEnd = 0; //总共游玩时间 // 总游玩时长 private int vistAllTime = (int)(60 * 10f); // json数据库 private JsonLiteDB DB; // 怪物详情 public Dictionary EnemyDescInfos = new Dictionary(); // 武器详情 public Dictionary WeaponDescInfos = new Dictionary(); // 道具表 public Dictionary PropDescInfos = new Dictionary(); // 关卡难度 public Dictionary DifficultyescInfos = new Dictionary(); // 称号表 public Dictionary TitleDescInfos = new Dictionary(); // 子弹详情 public Dictionary BulletDescInfos = new Dictionary(); //剧情 public Dictionary StoryDescInfos = new Dictionary(); public Dictionary titleConditionDescInfos = new Dictionary(); public Dictionary GameStoryInfos = new Dictionary(); //临时对象 public Dictionary tempDescInfos = new Dictionary(); // 保存传送门 public List cracksList = new List(); [Header("预制体")] public GameObject wallPre; public GameObject doorPre; public GameObject EnergyPumpPre; public GameObject gameStartPointPre; [Header("怪物预制体")] public GameObject RobotGuardianPre; public GameObject CrackPre; public GameObject QYPre; public GameObject EskyPre; public GameObject TurretPre; public GameObject SpiderPre; public GameObject EliteSpiderPre; public GameObject RobotMechPre; public GameObject EskyClonePre; public GameObject SpiderClonePre; public GameObject ShadowPre; public GameObject ShadowCastPre; public GameObject BossPre; public GameObject MachineHeartPre; public GameObject HudPre; public GameObject radarPoint; //闪电特效 public GameObject LightningPre; /// /// 护盾 /// public GameObject ShieldPre; /// /// 血包 /// public GameObject BloodBagPre; /// /// 武器道具 /// public GameObject WeaponPropPre; /// /// 攻击BUFF /// public GameObject AtkBuffPre; public GameObject deffBuffPre; [Header("特效")] public GameObject RockfallPre; public GameObject BOSS_lightPre; //激光蓄力 public AudioClip xuliEffect; //激光射线 public AudioClip LayEffect; //切换枪支 public AudioClip SwitchGunEffect; public Collider StartPoint; public GameObject Landmarks; [SyncVar] public bool GameStart = false; //怪物index [NonSerialized] [SyncVar] public int EnemyAmount = 0; [SyncVar] public int SummonAmount = 0; [NonSerialized] [SyncVar] public float PumpsMaxAmount = 5; public ScriptableObject scriptMachineGraph; private Shadow NowShadow; [SyncVar] public bool isGameEnd = false; [SyncVar] public int EnergyPumpTag = 0; [SyncVar] public float EnergyPumpFillAmount = 0; public float buffAtk = 0f; public float buffDef = 0f; public AuthInfo authInfo=new AuthInfo(); //关闭手柄射线 [ClientRpc] public void CloseLay() { GameInit.Ins.MRLeftControl.GetComponent().enabled = false; GameInit.Ins.MRRightControl.GetComponent().enabled = false; } private void Awake() { AllEnemyAmount = -1; } public void Start() { Ins = this; Landmarks = GameInit.Ins.Landmarks; vistEnd = (long)(DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds + vistAllTime; if (isClient) { // 鉴权 AuthorPanel.Show(); } #if !UNITY_EDITOR // PXR_Enterprise.InitEnterpriseService(); // PXR_Enterprise.BindEnterpriseService(); #endif CoroutineTaskManager.Instance.WaitSecondTodo(() => { CustomEvent.Trigger(GameInit.Ins.Event.gameObject, "GameManager", transform); if (isClient) { CoroutineTaskManager.Instance.WaitSecondTodo(() => { // 创建头盔 CustomEvent.Trigger(GameInit.Ins.Event.gameObject, "StartGame"); GenerateHUD(); }, 0.5f); } }, 1.0f); } public void Update() { // if (isServer && enemyList.Count > 0) // { // List vectors = new List(); // for (int i = 0; i < enemyList.Count; i++) // { // if (enemyList[i] != null) // { // vectors.Add(enemyList[i].position); // } // } // EnemysPosRpc(vectors); // } } /// /// 鉴权 /// public void RequestAuth(Action cb = null) { string url = "https://startcount-bgovpxyjzl.cn-hangzhou.fcapp.run"; HTTPRequest request = new HTTPRequest(new Uri(url), HTTPMethods.Post, (req, response) => { if (response != null) { Debug.Log("收到数据 ->" + response.DataAsText); } cb?.Invoke(req, response); }); //request.AddHeader("Authorization", Author); authInfo.deviceSn = GetSn(); authInfo.startAt = ConvertTimestampToDateTime(GetTimestamp()) + ""; //authInfo.paid = 2; //authInfo.uuid = GetSn() + GetTimestamp(); authInfo.shop = 0; #if !UNITY_EDITOR && UNITY_ANDROID && PICO authInfo.shop = (int)GameInit.Ins.gamePlace; if(GameInit.Ins.gamePlace== GamePlace.Yangzhou_Hanjiang_TansuoZhongxin_wai) authInfo.shop = 5; if (GameInit.Ins.gamePlace == GamePlace.Shandong_Jining_Wanhuicheng_nei) authInfo.shop = 9; if (GameInit.Ins.gamePlace == GamePlace.Shandong_Jinan_Huaiyin_ShengfutongShangmao_wai) authInfo.shop = 15; #endif //authInfo.shop = 0; authInfo.gameId = 2; string authJson = JsonUtility.ToJson(authInfo); Debug.Log("发送数据 -> " + authJson); request.RawData = System.Text.Encoding.UTF8.GetBytes(authJson); request.AddHeader("Content-Type", "application/json"); request.Send(); } [ClientRpc] public void GameEnd() { //RequestNotifyEnd(); } /// /// 通知服务器已开始游戏 /// // public void RequestNotifyStart(Action cb = null) // { // string url = HttpServerUrl + "/api/record"; // HTTPRequest request = new HTTPRequest(new Uri(url), HTTPMethods.Put, (req, response) => // { // if (response != null) // { // Debug.Log("收到数据 ->" + response.DataAsText); // cb?.Invoke(); // } // }); // request.AddHeader("Authorization", Author); // authInfo.paid = 1; // string authJson = JsonUtility.ToJson(authInfo); // Debug.Log("发送数据 -> " + authJson); // request.RawData = System.Text.Encoding.UTF8.GetBytes(authJson); // request.AddHeader("Content-Type", "application/json"); // request.Send(); // } /// /// 通知服务器游戏结束 /// public void RequestNotifyEnd(Action cb = null) { // string url = HttpServerUrl + "/api/record"; // HTTPRequest request = new HTTPRequest(new Uri(url), HTTPMethods.Put, (req, response) => // { // if (response != null) // { // Debug.Log("收到数据 ->" + response.DataAsText); // cb?.Invoke(req, response); // } // }); // request.AddHeader("Authorization", Author); // authInfo.endAt = ConvertTimestampToDateTime(GetTimestamp()) + ""; // authInfo.dur = (int)(((long)(DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds) - (vistEnd - vistAllTime)); // Debug.Log("dur---:" + authInfo.dur); // string authJson = JsonUtility.ToJson(authInfo); // Debug.Log("发送数据 -> " + authJson); // request.RawData = System.Text.Encoding.UTF8.GetBytes(authJson); // request.AddHeader("Content-Type", "application/json"); // request.Send(); } /// /// 游戏开始 /// /// /// 请求配置 /// public void RequestConf(Action cb = null) { string url = HttpServerUrl + "/api/config/info?deviceSn={0}&gameType=1&version={1}"; url = string.Format(url, GetSn(), Version); Debug.Log("发送数据 -> " + url); HTTPRequest request = new HTTPRequest(new Uri(url), HTTPMethods.Get, (req, response) => { cb?.Invoke(req, response); }); request.AddHeader("Authorization", Author); request.Send(); } /// /// 更新配置表 /// public void UpdateConf() { string text = ""; string text0 = Resources.Load(string.Format("zh/{0}Data",GameInit.Ins.gamePlace)).text; ParseGameJson(text0); // switch (gamePlace) // { // case GamePlace.HongYueCheng: // RequestConf((req, response) => // { // if (response != null) // { // Debug.Log("收到数据 -> " + response.DataAsText); // JObject jObj = JObject.OptParse(response.DataAsText); // text = jObj["data"]["data"].AsString(); // int status = jObj["status"].AsInt(); // if (status >= 200 && status < 300 && text != "") // { // ParseGameJson(text); // } // else // { // string text0 = Resources.Load("MechanicalAgeDataHongYuecheng").text; // ParseGameJson(text0); // } // } // else // { // // string text0 = Resources.Load("MechanicalAgeDataHongYuecheng").text; // ParseGameJson(text0); // } // }); // break; // case GamePlace.BeiJing: // text = Resources.Load("MechanicalAgeDataBeiJing").text; // ParseGameJson(text); // break; // case GamePlace.YuHua: // text = Resources.Load("MechanicalAgeDataYuHua").text; // ParseGameJson(text); // break; // case GamePlace.ZhengHong: // text = Resources.Load("MechanicalAgeDataZhengHong").text; // ParseGameJson(text); // break; // case GamePlace.SuZhouAoti: // text = Resources.Load("MechanicalAgeDataAoti").text; // ParseGameJson(text); // break; // case GamePlace.JNWD_F2: // text = Resources.Load("JNWD").text; // ParseGameJson(text); // break; // case GamePlace.JNWD_F1: // text = Resources.Load("JNWD_F1").text; // ParseGameJson(text); // break; // // } } 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"); } /// /// 解析游戏使用的json /// public void ParseGameJson(string text) { DB = new JsonLiteDB(); DB.Load(text); // 读取Info表数据 TableReader infoReader = DB["EnemyInfo"].GetReader(); Dictionary EnemyDescInfosC = new Dictionary(); while (infoReader.Read()) { EnemyInfo info = new EnemyInfo(infoReader); EnemyDescInfosC.Add(info.Id, info); } EnemyDescInfos = EnemyDescInfosC; // 读取武器表数据 TableReader weaponReader = DB["WeaponInfo"].GetReader(); Dictionary WeaponDescInfosC = new Dictionary(); while (weaponReader.Read()) { WeaponData info = new WeaponData(weaponReader); WeaponDescInfosC.Add(info.Id, info); } WeaponDescInfos = WeaponDescInfosC; // 解析子弹详情表 TableReader BulletReader = DB["BulletInfo"].GetReader(); Dictionary BulletDescInfosC = new Dictionary(); while (BulletReader.Read()) { BulletInfo info = new BulletInfo(BulletReader); BulletDescInfosC.Add(info.ID, info); } BulletDescInfos = BulletDescInfosC; // 道具表 TableReader PropReader = DB["PropInfo"].GetReader(); Dictionary PropDescInfosC = new Dictionary(); while (PropReader.Read()) { PropInfo info = new PropInfo(PropReader); PropDescInfosC.Add(info.PropId, info); } PropDescInfos = PropDescInfosC; // 关卡难度表 TableReader DifficultyReader = DB["DifficultyInfo"].GetReader(); Dictionary DifficultyescInfosC = new Dictionary(); while (DifficultyReader.Read()) { DifficultyInfo info = new DifficultyInfo(DifficultyReader); DifficultyescInfosC.Add(info.Id, info); } DifficultyescInfos = DifficultyescInfosC; // 称号列表 TableReader TitleDescInfosReader = DB["TitleInfo"].GetReader(); Dictionary TitleDescInfosC = new Dictionary(); while (TitleDescInfosReader.Read()) { TitleInfo info = new TitleInfo(TitleDescInfosReader); TitleDescInfosC.Add(info.Id, info); } TitleDescInfos = TitleDescInfosC; TableReader storyReader = DB["Story"].GetReader(); while (storyReader.Read()) { StoryInfo info = new StoryInfo(storyReader); StoryDescInfos.Add(info.Id, info); } TableReader titleConditionInfo = DB["TitleConditionInfo"].GetReader(); while (titleConditionInfo.Read()) { TitleConditionInfo info = new TitleConditionInfo(titleConditionInfo); titleConditionDescInfos.Add(info.Id, info); } TableReader tempReader = DB["TempInfo"].GetReader(); while (tempReader.Read()) { TempInfo info = new TempInfo(tempReader); tempDescInfos.Add(info.Id, info); } } /// /// 获取sn号 /// public string GetSn() { string res = "UnityEditor"; // string res = "PA8E10MGH7210380D"; #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; } [ClientRpc] public void EnemysPosRpc(List vectors) { EventDispatcher.TriggerEvent("EnemyList", vectors); } [ClientRpc] public void ShowWinUI(float time) { if (GameInit.Ins.Win) GameInit.Ins.Win.SetActive(true); CoroutineTaskManager.Instance.WaitSecondTodo(() => { GameInit.Ins.Win.SetActive(false); }, time); } public void PlaySwitchGunSound() { GameInit.Ins.bgm.PlayOneShot(SwitchGunEffect); } [ClientRpc] public void ShowJxsdLogo() { GameInit.Ins.JxsdLogo.SetActive(true); } [ClientRpc] public void PlayOneShotAudioTrriger(string name) { EventDispatcher.TriggerEvent("PlayOnShotAudio", "Audio/" + name); // //CustomEvent.Trigger(GameInit.Ins.Event.gameObject, "PlayOnShotAudio"); } public void PlayAudioTrriger(string name) { EventDispatcher.TriggerEvent("PlayAudio", "Audio/Background" + name); } //---------------播放音乐------------------- [ClientRpc] public void PlayXuliSound() { GameInit.Ins.bgm.PlayOneShot(xuliEffect); } [ClientRpc] public void StopSound() { GameInit.Ins.bgm.Stop(); } // 游戏开始 [Server] public void GameOK() { GameStart = true; //关闭射线 CloseLay(); StartPointClose(); } 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); } public GameObject GenerateHUD() { OverlayUIManager.Ins.Cover("UI/HUD", false); //return Instantiate(HudPre, new Vector3(2000, 0, 0), quaternion.identity); return null; } [ClientRpc] public void ShowLandmark(int index1, int index2) { return; GameObject landmark1 = Landmarks.transform.GetChild(index1).gameObject; GameObject landmark2 = Landmarks.transform.GetChild(index2).gameObject; if (index2 == 0) { landmark1.SetActive(true); } else { landmark1.SetActive(false); landmark2.SetActive(true); } } [ClientRpc] public void StartPointClose() { if (StartPoint) { StartPoint.gameObject.SetActive(false); } } public void CreateItemDrop(int enemyIndex, Vector3 pos) { int storyId = StoryManager.Ins.currentStoryIndex - 1; StoryInfo storyInfo = StoryDescInfos[storyId]; //当前怪物的序号 索引从开始需要加1 int currentIndex = (enemyIndex + 1); if (currentIndex % storyInfo.ItemRule == 0) { if (storyInfo.ALLEnemyAmount[StoryManager.Ins.gameDifficulty] > 1) { int counter = Mathf.FloorToInt(currentIndex / storyInfo.ItemRule); int itemIndex = (counter - 1) % storyInfo.ItemDrop.Length; // 使用取余操作符确保循环索引 Debug.Log($"当前怪物index:{enemyIndex}当前物品index:{itemIndex}当前物品ID:{storyInfo.ItemDrop[itemIndex]}"); if (storyInfo.BulletAmount.ContainsKey(storyInfo.ItemDrop[itemIndex])) { int amount = storyInfo.BulletAmount[storyInfo.ItemDrop[itemIndex]]; Debug.Log("amount" + amount); CreateItemProp(storyInfo.ItemDrop[itemIndex], pos, amount); } else { CreateItemProp(storyInfo.ItemDrop[itemIndex], pos); } } else { for (int i = 0; i < storyInfo.ItemDrop.Length; i++) { int key = storyInfo.ItemDrop[i]; if (storyInfo.BulletAmount.ContainsKey(key)) { int amount = storyInfo.BulletAmount[key]; CreateItemProp(storyInfo.ItemDrop[i], pos + new Vector3(i + 0.5f, 0, 0), amount); // Debug.Log("当前子弹数量为:" + amount); } else { CreateItemProp(storyInfo.ItemDrop[i], pos + new Vector3(i + 0.5f, 0, 0)); } } } } } // // 解锁所有人的超级武器 // [Server] // public void UnLockAllSuperGunServer() // { // Debug.Log("解锁所有人的超级武器"); // UnLockSuperGun(); // } // [Server] // public void DestoryALLWeapon() // { // SwitchNULL(); // } // [ClientRpc] // public void SwitchNULL() // { // GameInit.Ins.self.SwitchNULL(); // } // [ClientRpc] // public void UnLockSuperGun() // { // GameInit.Ins.self.UnLockSuperGun(); // } // 给所有客户端播放音乐 [ClientRpc] public void PlayeBGM2AllClient() { CustomEvent.Trigger(GameInit.Ins.Event.gameObject, "PlayBGM2"); } [ClientRpc] public void PlayerBGM() { CustomEvent.Trigger(GameInit.Ins.Event.gameObject, "PlayBGM2"); } public void WaitDestoryObject(GameObject obj, float time) { CoroutineTaskManager.Instance.WaitSecondTodo(() => { NetworkServer.Destroy(obj); }, time); } void Destroy() { #if !UNITY_EDITOR //PXR_Enterprise.UnBindEnterpriseService(); #endif } [Server] public void InitEnemyAmount() { EnemyAmount = 0; enemyList.Clear(); } public Transform RandomFloundEnemy(XAgent.BodyPoint point) { List notNullElements = enemyList.Where(element => element != null).ToList(); Transform res = null; if (notNullElements.Count > 0) { Transform enemy = notNullElements[Random.Range(0, notNullElements.Count)]; if (enemy != null) { res = enemy.GetComponent().FindBody(point); } } return res; } public List GetRangeEnemys(Vector3 Pos, float radius) { Collider[] colliders; colliders = new Collider[15]; int colliderCount = Physics.OverlapSphereNonAlloc(Pos, radius, colliders); List enemys = new List(); for (int i = 0; i < colliderCount; i++) { if (colliders[i].CompareTag("Enemy")) { enemys.Add(colliders[i].transform); } } return enemys; } public List GetRangePlayers(Vector3 Pos, float radius) { Collider[] colliders; colliders = new Collider[15]; int colliderCount = Physics.OverlapSphereNonAlloc(Pos, radius, colliders); List players = new List(); for (int i = 0; i < colliderCount; i++) { if (colliders[i].CompareTag("Player")) { players.Add(colliders[i].transform); } } return players; } public Transform[] FoundNearestEnemy(int amount, Transform self) { if (enemyList.Count <= 0) return null; var sortedEnemies = enemyList.OrderBy(e => Vector3.Distance(self.position, e.position)); if (enemyList.Count >= amount) { return sortedEnemies.Take(amount).ToArray(); } else { return sortedEnemies.Take(enemyList.Count).ToArray(); } } //创建能量泵 [Server] public void GenerateEnergyPump(Vector3 pos) { GameObject EnergyPump = Instantiate(EnergyPumpPre); NetworkServer.Spawn(EnergyPump); //EnergyPump.transform.position = pos; EnergyPump.transform.position = pos; if(GameInit.Ins.gamePlace == GamePlace.Company1Floor) { EnergyPump.transform.position = new Vector3(-3f, 0, 5f); } if(GameInit.Ins.gamePlace == GamePlace.Zhejiang_Jinhua_KeJiGuan) { EnergyPump.transform.position = new Vector3(-3f, 0, 5f); } if(GameInit.Ins.gamePlace == GamePlace.Zhejiang_Shaoxing_Shengzhou_WuyueGuangchang) { EnergyPump.transform.position = new Vector3(-3f, 0, 5f); } if (GameInit.Ins.gamePlace == GamePlace.Nanjing_Xianlin_WanDaMao) { EnergyPump.transform.position = new Vector3(-1.2f,0,1.5f); } if (GameInit.Ins.gamePlace == GamePlace.Yangzhou_Hanjiang_Tansuozhongxin) { EnergyPump.transform.position = new Vector3(1,0,-2.61f); } if (GameInit.Ins.gamePlace == GamePlace.Yangzhou_Hanjiang_TansuoZhongxin_wai) { EnergyPump.transform.position = new Vector3(0,0,2f); } if (GameInit.Ins.gamePlace == GamePlace.Shandong_Jining_Wanhuicheng_nei) { EnergyPump.transform.position = new Vector3(0,0,2f); } if (GameInit.Ins.gamePlace == GamePlace.Shandong_Langfang_QingzhouTaihuacheng) { EnergyPump.transform.position = new Vector3(7.36f, 0, 7.58f); } if (GameInit.Ins.gamePlace == GamePlace.Hubei_Xiangyang_Kejiguan) { EnergyPump.transform.position = new Vector3(0,0,5f); } if (GameInit.Ins.gamePlace == GamePlace.Jilin_Tonghua_Liuhe) { EnergyPump.transform.position = new Vector3(1.87f,0,2.17f); } if (GameInit.Ins.gamePlace == GamePlace.Hunan_Jishou_Qianzhou_Tianhong) { EnergyPump.transform.position = new Vector3(0f,0,2f); } if (GameInit.Ins.gamePlace == GamePlace.Shandong_Jinan_Huaiyin_ShengfutongShangmao) { EnergyPump.transform.position = new Vector3(-0.84f,0,-0.11f); } if (GameInit.Ins.gamePlace == GamePlace.Shandong_Jinan_Huaiyin_ShengfutongShangmao_wai) { EnergyPump.transform.position = new Vector3(0.09f,0,1.09f); } EnergyPumpTag++; EnergyPump.GetComponent().Init(EnergyPumpTag); } //创建闪电 [Server] public void GenerateLightning(Vector3 transform, Vector3 angle, float time) { GameObject Lightning = Instantiate(LightningPre); NetworkServer.Spawn(Lightning); Lightning.transform.position = transform; Lightning.transform.eulerAngles = angle; CoroutineTaskManager.Instance.WaitSecondTodo(() => { NetworkServer.Destroy(Lightning); }, time); } [ClientRpc] public void ShowTex() { GameInit.Ins.Tex.SetActive(true); } [ClientRpc] public void OpenCoillder(GameObject obj) { obj.GetComponent().enabled = true; } [Server] public void DestoryEnergyPump(GameObject obj) { NetworkServer.Destroy(obj); } [Server] public void GenerateWall(int index, Vector3 position, Vector3 angle) { //EnergyPump1 GameObject wall = Instantiate(wallPre); //NetworkServer.Spawn(wall); wall.tag = "Story" + index.ToString(); wall.transform.position = position; wall.transform.eulerAngles = angle; } //创建雷达点 [Server] public void GenerateRadarPoint() { GameObject point = Instantiate(doorPre); NetworkServer.Spawn(point); point.transform.position = new Vector3(transform.transform.position.x, transform.transform.position.y, transform.transform.position.z); point.transform.localEulerAngles = new Vector3(0, 0, 0); } //创建大门 [Server] public GameObject GenerateDoor() { GameObject door = Instantiate(doorPre); Vector3 pos = tempDescInfos[1].Positions[0]; Vector3 scale = tempDescInfos[1].Scales[0]; NetworkServer.Spawn(door); door.transform.position = new Vector3(pos.x, pos.y, pos.z); door.transform.localScale = scale; door.transform.localEulerAngles = tempDescInfos[1].Angles[0]; door.GetComponentInChildren().SetBool("IsOpen", true); return door; } // 创建巡逻兵 [Server] public void GenerateRobotGuardian(Transform pos) { Debug.Log("创建巡逻兵"); GameObject RobotGuardian = Instantiate(RobotGuardianPre); NetworkServer.Spawn(RobotGuardian); RobotGuardian.transform.position = new Vector3(pos.transform.position.x, pos.transform.position.y, pos.transform.position.z); RobotGuardian.GetComponent().OnSpawn(); } [Server] public GameObject GenerateEnemy(EnemyType Type, Vector3 pos, Vector3 angle, Vector3 scale, string pathId = "0") { GameObject enemy = null; switch (Type) { case EnemyType.RobotGuardian: enemy = CreateRobotGuardian(pos, angle, scale, pathId); break; case EnemyType.QY: enemy = CreateQY(pos, angle, scale, pathId); break; case EnemyType.Esky: enemy = CreateEsky(pos, angle, scale, pathId); break; case EnemyType.Spider: enemy = CreateSpider(pos, angle, scale, pathId); break; case EnemyType.EliteSpider: enemy = CreateEliteSpiderPre(pos, angle, scale); break; case EnemyType.RobotMech: enemy = CreateRobotMesh(pos, angle, scale); break; case EnemyType.Shadow: enemy = CreateShadow(pos, angle, scale); break; case EnemyType.ShadowCast: enemy = CreateShadowCast(pos, angle, scale); break; case EnemyType.Boss: enemy = CreateBoos(pos, angle, scale, pathId); break; } XAgent xagent = enemy.GetComponent(); xagent.index = EnemyAmount; enemyList.Add(xagent.transform); EnemyAmount++; return enemy; } [Server] public GameObject CreateQY(Vector3 pos, Vector3 angle, Vector3 scale, string pathId) { GameObject QY = Instantiate(QYPre); NetworkServer.Spawn(QY); QY.transform.position = pos; QY.transform.localEulerAngles = angle; QY.transform.localScale = scale; QY qyScript = QY.GetComponent(); qyScript.OnSpawn(); qyScript.SetPathId(pathId); return QY; } // 创建起义兵 [Server] public GameObject CreateRobotGuardian(Vector3 pos, Vector3 angle, Vector3 scale, string pathId) { GameObject robotGuardian = Instantiate(RobotGuardianPre); NetworkServer.Spawn(robotGuardian); robotGuardian.transform.position = pos; robotGuardian.transform.localEulerAngles = angle; robotGuardian.transform.localScale = scale; RobotGuardian robotScript = robotGuardian.GetComponent(); robotScript.OnSpawn(); robotScript.SetPathId(pathId); return robotGuardian; } [ClientRpc] public void HudMessage(int index) { EventDispatcher.TriggerEvent("PromptMessage", index); } [ClientRpc] public void Message(string text, string clipName) { EventDispatcher.TriggerEvent("Message", text, clipName); } [ClientRpc] public void ShowTeachUI(int index) { EventDispatcher.TriggerEvent("ShowTeachUI", index); } [Server] public GameObject CreateEliteSpiderPre(Vector3 pos, Vector3 angle, Vector3 scale) { GameObject eliteSpider = Instantiate(EliteSpiderPre); NetworkServer.Spawn(eliteSpider); eliteSpider.transform.position = pos; eliteSpider.transform.localEulerAngles = angle; eliteSpider.transform.localScale = scale; eliteSpider.GetComponent().OnSpawn(); return eliteSpider; } [Server] public GameObject CreateRobotMesh(Vector3 pos, Vector3 angle, Vector3 scale) { GameObject robotMesh = Instantiate(RobotMechPre); NetworkServer.Spawn(robotMesh); robotMesh.transform.position = pos; robotMesh.transform.localEulerAngles = angle; robotMesh.transform.localScale = scale; robotMesh.GetComponent().OnSpawn(); return robotMesh; } /// /// 创建幻影者 /// /// /// /// [Server] public GameObject CreateShadow(Vector3 pos, Vector3 angle, Vector3 scale) { GameObject Shadow = Instantiate(ShadowPre); NetworkServer.Spawn(Shadow); Shadow.transform.position = pos; Shadow.transform.localEulerAngles = angle; Shadow.transform.localScale = scale; Shadow shadow = Shadow.GetComponent(); NowShadow = shadow; shadow.OnSpawn(); return Shadow; } /// /// 创建幻影者分身 /// /// /// /// public GameObject CreateShadowCast(Vector3 pos, Vector3 angle, Vector3 scale) { GameObject Shadow = Instantiate(ShadowCastPre); NetworkServer.Spawn(Shadow); Shadow.transform.position = pos; Shadow.transform.localEulerAngles = angle; Shadow.transform.localScale = scale; ShadowCast shadow = Shadow.GetComponent(); shadow.Init(NowShadow.OriginHealth, NowShadow.Health); return Shadow; } [Server] public GameObject CreateBoos(Vector3 pos, Vector3 angle, Vector3 scale, string pathId) { GameObject boss = Instantiate(BossPre); NetworkServer.Spawn(boss); boss.transform.position = pos; boss.transform.localEulerAngles = angle; boss.transform.localScale = scale; Boss bossScript = boss.GetComponent(); bossScript.OnSpawn(); bossScript.SetPathId(pathId); return boss; } [Command(requiresAuthority = false)] public void CreateGameStartPoint() { Vector3 pos = tempDescInfos[0].Positions[0]; GameObject point = Instantiate(gameStartPointPre); NetworkServer.Spawn(point); point.transform.position = pos; // point.transform.position = new Vector3(5.55f, 0, 2.19f);//beijing } [Server] // 创建苍蝇 public GameObject CreateEsky(Vector3 pos, Vector3 angle, Vector3 scale, string pathId) { GameObject Esky = Instantiate(EskyPre); NetworkServer.Spawn(Esky); Esky.transform.position = pos; Esky.transform.localEulerAngles = angle; Esky.transform.localScale = scale; Esky eskyScript = Esky.GetComponent(); eskyScript.OnSpawn(); eskyScript.SetPathId(pathId); return Esky; } [Server] public GameObject CreateEskyClone(Vector3 pos, Vector3 angle) { GameObject EskyClone = Instantiate(EskyClonePre); NetworkServer.Spawn(EskyClone); EskyClone.transform.position = pos; EskyClone.transform.localEulerAngles = angle; EskyClone eskyScript = EskyClone.GetComponent(); eskyScript.OnSpawn(); return EskyClone; } [Server] //创建炮台 public GameObject GenerateTurret(Vector3 pos, Vector3 scale, Vector3 angle) { GameObject turret = Instantiate(TurretPre); NetworkServer.Spawn(turret); turret.transform.position = pos; turret.transform.localScale = scale; turret.transform.localEulerAngles = angle; return turret; } public void CreateProp(PropType propType, Vector3 pos) { switch (propType) { case PropType.BloodBag: CreateBloodBag(pos); break; case PropType.EnergyMask: CreateShield(pos); break; case PropType.AtkBuff: CreateAtkBuff(pos); break; case PropType.DefenseBuff: CreateDeeBuff(pos); break; case PropType.EnergyPump: GenerateEnergyPump(pos); break; } } [Server] public void CreateItemProp(int index, Vector3 pos, int amount = 1) { if (index < 500) { //武器 CreateWeaponProp((WeaponType)(index), pos, amount); } else if (index > 500 && index < 1000) { //道具 CreateProp((PropType)(index), pos); } } //创建蜘蛛 [Server] public GameObject CreateSpider(Vector3 pos, Vector3 angle, Vector3 scale, string pathId = "") { GameObject Spider = Instantiate(SpiderPre); NetworkServer.Spawn(Spider); Spider.transform.position = pos; Spider.transform.localEulerAngles = angle; Spider.transform.localScale = scale; Spider.GetComponent().OnSpawn(); Spider.GetComponent().SetPathId(pathId); return Spider; } [Server] public GameObject CreateSpiderClone(Vector3 pos, Vector3 angle) { GameObject SpiderClone = Instantiate(SpiderClonePre); NetworkServer.Spawn(SpiderClone); SpiderClone.transform.position = pos; SpiderClone.transform.localEulerAngles = angle; SpiderClone.GetComponent().OnSpawn(); return SpiderClone; } //创建落石特效 [Server] public GameObject GenerateRockfall(Vector3 pos, Vector3 angle) { GameObject Rockfall = Instantiate(RockfallPre); Rockfall.transform.position = pos; Rockfall.transform.localEulerAngles = angle; NetworkServer.Spawn(Rockfall); return Rockfall; } [Server] public GameObject CreateCrack(Vector3 pos, Vector3 angle) { GameObject Crack = Instantiate(CrackPre); NetworkServer.Spawn(Crack); Crack.transform.position = new Vector3(pos.x, pos.y, pos.z); Crack.transform.localEulerAngles = angle; return Crack; } [Server] public void CreatePortal(Vector3 pos, float angleY, int amount, float interval, bool isActive, EnemyType type) { GameObject portal = Instantiate(CrackPre); NetworkServer.Spawn(portal); portal.transform.position = pos; portal.transform.localEulerAngles = new Vector3(0, angleY, 0); portal.GetComponent().Init(amount, interval, isActive, type); } // 创建传送门 [Server] public GameObject SpwanCrack(Transform pos) { GameObject Crack = Instantiate(CrackPre); NetworkServer.Spawn(Crack); Crack.transform.position = new Vector3(pos.position.x, pos.position.y, pos.position.z); return Crack; } public bool EnemyDie() { if (AllEnemyAmount > 0) AllEnemyAmount--; if (AllEnemyAmount == 0) { EnemyAmount = 0; return true; } return false; } // 获取第一个玩家 public Transform GetPlayer1() { Transform player = null; if (MRNetworkManager.Ins.roomSlots.Count > 0) { player = MRNetworkManager.Ins.roomSlots[0].transform; } return player; } public Transform GetPlayer(int index) { NetworkRoomPlayer roomPlayer = null; roomPlayer = MRNetworkManager.Ins.roomSlots[index]; Transform play = roomPlayer.transform; return play; } public int GetRandomPlayerIndex() { int index = 0; //怪物随机选取目标 只取一次 index = Random.Range(0, MRNetworkManager.Ins.roomSlots.Count); return index; } /// /// 创建护盾 /// [Command(requiresAuthority = false)] public void CreateShield(Vector3 pos) { GameObject shield = Instantiate(ShieldPre); NetworkServer.Spawn(shield); shield.transform.position = new Vector3(pos.x, 0, pos.z); Shield shieldScript = shield.GetComponent(); shieldScript.Id = ShieldId; Shields.Add(ShieldId, shieldScript); ShieldId++; } /// /// 删除护盾 /// public void DelShield(int id) { Shield shield = Shields[id]; if (shield != null) { Shields.Remove(id); } } /// /// 创建攻击BUFF /// /// [Command(requiresAuthority = false)] public void CreateAtkBuff(Vector3 pos) { GameObject atkBuff = Instantiate(AtkBuffPre); NetworkServer.Spawn(atkBuff); atkBuff.transform.position = new Vector3(pos.x, 0, pos.z); } /// /// 创建攻击BUFF /// /// [Command(requiresAuthority = false)] public void CreateDeeBuff(Vector3 pos) { GameObject deeBuff = Instantiate(deffBuffPre); NetworkServer.Spawn(deeBuff); deeBuff.transform.position = new Vector3(pos.x, 0, pos.z); } /// /// 创建血包 /// [Command(requiresAuthority = false)] public void CreateBloodBag(Vector3 pos) { GameObject bloodBag = Instantiate(BloodBagPre); NetworkServer.Spawn(bloodBag); bloodBag.transform.position = new Vector3(pos.x, 0, pos.z); } /// /// 创建武器道具 /// [Command(requiresAuthority = false)] public void CreateWeaponProp(WeaponType type, Vector3 pos, int amount) { GameObject prop = Instantiate(WeaponPropPre); NetworkServer.Spawn(prop); prop.GetComponent().Init(type, amount); prop.transform.position = pos; } /// /// 找到有玩家x在里面的护盾 /// /// /// public int FindPlayerInShield(int playerIndex) { int res = -1; foreach (Shield shield in Shields.Values) { float dis = MathExtension.GetDistanceXOZ(MRNetworkManager.Ins.roomSlots[playerIndex].transform.position, shield.transform.position); if (dis <= 2.5f) { res = shield.Id; break; } } return res; } /// /// 判断玩家x是否在护盾内 /// /// /// public bool IsPlayerInShield(int playerIndex = 0) { bool res = false; int find = FindPlayerInShield(playerIndex); if (find != -1) { res = true; } return res; } /// /// 根据位置获取能攻击的护盾 /// /// /// /// /// public Shield GetCanAttackShield(Vector3 point, int playerIndex, float attackArea) { Shield res = null; int find = FindPlayerInShield(playerIndex); if (find != -1) { float dis = MathExtension.GetDistanceXOZ(Shields[find].transform.position, point); if (dis > 2.5f && dis < 2.5f + attackArea) { res = Shields[find]; } } return res; } /// /// 判断是否能攻击护盾 /// public bool IsCanAttackShield(Transform enemy, int playerIndex, float attackArea) { bool res = false; Shield find = GetCanAttackShield(enemy.position, playerIndex, attackArea); res = find == null ? false : true; return res; } /// /// 判断是否能攻击玩家 /// /// /// public bool IsCanAttackPlayer(Transform enemy, int playerIndex, float attackArea) { bool res = false; Transform player = MRNetworkManager.Ins.roomSlots[playerIndex].transform; float dis = MathExtension.GetDistanceXOZ(player.position, enemy.transform.position); if (dis <= attackArea) { res = true; } return res; } }