using System; using System.Collections.Generic; using System.Text; using UnityEngine; using UnityEngine.SceneManagement; using System.Linq; using System.Collections; using DataModel.Model; using System.Net.Sockets; using System.Threading; using System.Net; using LitJson; using TMPro; using System.IO; public class LoadManage : MonoBehaviour { public static LoadManage Instance; /// /// 系统模式 /// public SystemMode systemMode; /// /// 本人账户信息 /// [HideInInspector] public User me; /// /// 当前训练 (进房间前赋值) /// [HideInInspector] public practice currentPractice = null; /// /// 当前科目 /// [HideInInspector] public practicesubject currentPracticeSubejct = null; /// /// 当前岗位 /// [HideInInspector] public practiceseat currentPracticeSeat = null; /// /// 当前步骤 /// [HideInInspector] public practicesubjectstep currentPracticeSubjectStep = null; /// /// 本人在训练中所有岗位信息 /// [HideInInspector] public List myPracticeSeat = new List(); /// /// 训练科目 (进房间前赋值) /// [HideInInspector] public List psubjects; /// /// 训练步骤 /// [HideInInspector] public List psteps; /// /// 训练岗位 /// [HideInInspector] public List pseats; /// /// 音量大小 /// [DisplayOnly] public float SourceLiangValue; /// /// 音效大小 /// [DisplayOnly] public float SourceXiaoValue; [HideInInspector] public string MyId; /// /// 房间域 "1room" /// [DisplayOnly] public string currentRoomArea; /// /// 同步Id /// [DisplayOnly] public int SyncId; /// /// 训练状态 /// public static ProgramState programState = ProgramState.结束; /// /// 是否暂停 /// public static bool isPause; /// /// 与RoomServer通信 /// [DisplayOnly] public MyNetMQClient RSclient; #region UDP [HideInInspector] public UdpClient udpClient; bool udpRun; int refreshTime = 0; #endregion /// /// 人员 /// public static List persons = new List(); private void Awake() { Instance = this; DontDestroyOnLoad(gameObject); //启动(测试用) udpClient = new UdpClient(8889); udpRun = true; Thread thread = new Thread(UdpRecive); thread.IsBackground = true; thread.Start(); #if UNITY_EDITOR UnityEngine.Debug.unityLogger.logEnabled = true; #else UnityEngine.Debug.unityLogger.logEnabled = false; #endif } void Start() { //设置不休眠 Screen.sleepTimeout = SleepTimeout.NeverSleep; List tmps = File.ReadAllLines(Application.streamingAssetsPath + "/MainSetting.txt").ToList(); int porta, portb, portc; IPAddress ipd; tmps.ForEach(a => { string[] data = a.Split('='); if (a.Split('=')[0] == "协同交互服务UDP") { IPAddress.Parse(data[1].Split(':')[0]); if (int.TryParse(data[1].Split(':')[1], out portb)) { //MyNetMQClient.SyncServerIP = data[1]; MyNetMQClient.SyncServerIP = "192.168.0.103"; } else { Debug.LogError("协同交互服务UDP配置错误"); } } }); GetAllUser(); } private void Update() { if (refreshTime > 0) { //刷新房间列表 if (RoomListPanel.instance != null && UnityEngine.SceneManagement.SceneManager.GetActiveScene().name.Contains("MainSence")) { RoomListPanel.instance.Refresh(); refreshTime = 0; } } } private void UdpRecive() { while (udpRun) { try { IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] data = udpClient.Receive(ref iPEndPoint); int type = BitConverter.ToInt32(data, 0); if (type == 13) { if (LoadManage.programState == ProgramState.结束) { //开启房间成功 UnityEngine.Debug.Log("开启房间成功"); string practiceid = Encoding.UTF8.GetString(data, 4, data.Length - 4); refreshTime++; } } else if (type == 26) { if (LoadManage.programState == ProgramState.进行中) { //开启二维软件失败 int length = BitConverter.ToInt32(data, 4); string arg = Encoding.UTF8.GetString(data, 8, length); string[] tmps = arg.Split(':'); SoftManage.Instance.ChangeSoftSubject(tmps[0], tmps[1], SoftManage.Instance.softName, tmps[2], tmps[3]); } } } catch { } } } /// /// 发送udp消息 /// /// /// public void UdpSend(byte[] data, IPEndPoint endPoint) { udpClient.Send(data, data.Length, endPoint); } /// /// 获取所有本系统人员数据,导调角色,操作手 /// private void GetAllUser() { //使用真实接口 //172.16.1.92:8087 //获取士兵 StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.userIP + ":8087/role?roleName=士兵", result1 => { JsonData jd = JsonMapper.ToObject(result1); if (jd["success"].ValueAsBoolean()) { List tmp = new List(); foreach (JsonData item in jd["value"]) { tmp.Add(int.Parse(item["roleId"].ToString())); } if (tmp.Count > 0) { string tmpjsonvalue = JsonMapper.ToJson(tmp); //获取所有士兵user StartCoroutine(MyNetMQClient.InvokeWebPostByUploadhandler("http://" + MyNetMQClient.userIP + ":8087/user/queryAllUsers", JsonMapper.ToJson(new { limit = 1000, roleDtoList = tmpjsonvalue }), (ok, result2) => { if (ok) { JsonData jd2 = JsonMapper.ToObject(result2); if (jd2["success"].ValueAsBoolean()) { foreach (JsonData item in jd2["value"]["results"]) { sys_user tmpUser = new sys_user(); //在这里取数据 tmpUser.user_name = item["userName"].ToString(); if (item["userCode"] != null) tmpUser.user_code = item["userCode"].ToString(); tmpUser.user_id = int.Parse(item["userId"].ToString()); if (item["deptId"] != null) tmpUser.dept_id = int.Parse(item["deptId"].ToString()); if (item["jobId"] != null) tmpUser.job_id = int.Parse(item["jobId"].ToString()); if (item["nickName"] != null) tmpUser.nickName = item["nickName"].ToString(); if (item["avatar"] != null) tmpUser.avatar = item["avatar"].ToString(); if (item["certificateNumber"] != null) tmpUser.introduce = item["certificateNumber"].ToString(); persons.Add(tmpUser); } //获取所有指挥员 StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.userIP + ":8087/role?roleName=指挥员", result3 => { JsonData jd3 = JsonMapper.ToObject(result3); if (jd3["success"].ValueAsBoolean()) { List tmp2 = new List(); foreach (JsonData item in jd3["value"]) { tmp2.Add(int.Parse(item["roleId"].ToString())); } if (tmp2.Count > 0) { string tmpjsonvalue2 = JsonMapper.ToJson(tmp2); //获取所有指挥员user StartCoroutine(MyNetMQClient.InvokeWebPostByUploadhandler("http://" + MyNetMQClient.userIP + ":8087/user/queryAllUsers", JsonMapper.ToJson(new { limit = 1000, roleDtoList = tmpjsonvalue2 }), (ok2, result4) => { if (ok2) { JsonData jd4 = JsonMapper.ToObject(result4); if (jd4["success"].ValueAsBoolean()) { foreach (JsonData item in jd4["value"]["results"]) { sys_user tmpUser = new sys_user(); //在这里取数据 tmpUser.user_name = item["userName"].ToString(); if (item["userCode"] != null) tmpUser.user_code = item["userCode"].ToString(); tmpUser.user_id = int.Parse(item["userId"].ToString()); if (item["deptId"] != null) tmpUser.dept_id = int.Parse(item["deptId"].ToString()); if (item["jobId"] != null) tmpUser.job_id = int.Parse(item["jobId"].ToString()); if (item["nickName"] != null) tmpUser.nickName = item["nickName"].ToString(); persons.Add(tmpUser); } Debug.Log("获取人员完成"); //获取考核配置 StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.CallIP + "/3DConfig/考核动作标题配置.xml", back => { ScoreManage.SetXml(back); Debug.Log("考核配置获取完成"); //跳转 if (systemMode == SystemMode.PC) { SceneManager.LoadScene("LoginSencePC"); } else if (systemMode == SystemMode.MR) { SceneManager.LoadScene("LoginSenceMR"); } })); } else { string msg = jd4["msg"].ToJson(); MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null); } } else { MessagePanel.ShowMessage(result4, GameObject.Find("Canvas").transform, null); } })); } } else { string msg = jd3["msg"].ToJson(); MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null); } })); } else { string msg = jd2["msg"].ToJson(); MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null); } } else { MessagePanel.ShowMessage(result2, GameObject.Find("Canvas").transform, null); } })); } } else { string msg = jd["msg"].ToJson(); MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null); } })); } /// /// 创建与roomServer通信的客户端 /// public void CreateRoomServerClient(string roomServerSubIP, string roomServerPubIP, string roomArea, int syncId) { if (RSclient == null) { //测试 //roomServerPubIP = "tcp://192.168.1.125:56987"; // roomServerSubIP = "tcp://192.168.1.125:56991"; RSclient = gameObject.AddComponent(); SyncId = syncId; currentRoomArea = roomArea; RSclient.Init(roomServerPubIP, roomServerSubIP, roomArea, ReciveFromRoomServerInThread, ReciveFromRoomServerInMono, "roomServer"); Debug.Log("开启roomServer:" + roomServerPubIP + "------" + roomServerSubIP + "-------" + roomArea); } } public void RemoveRoomServerClient() { if (RSclient != null) { RSclient.Destroy(); // RSclient = null; Debug.Log("RSclient置空"); } } /// /// RoomServer,mono /// /// private void ReciveFromRoomServerInThread(st_Motions stS) { //同步域 if (programState == ProgramState.进行中) { if (stS.m_iOperaType == 10006) { //单值同步 int syncid = BitConverter.ToInt32(stS.m_sOperaData, 0); if (LoadManage.Instance.SyncId != syncid) { int legth = BitConverter.ToInt32(stS.m_sOperaData, 4); string id = Encoding.UTF8.GetString(stS.m_sOperaData, 8, legth); if (OneValueSyncObject.OneAxisSyncObjectList.ContainsKey(id)) { if (stS.m_sOperaData[9 + legth] == 0) { //无回调 OneValueSyncObject.OneAxisSyncObjectList[id].SetValue(8 + legth, stS.m_sOperaData); } else { //有回调 RSclient._netMqListener.AddToMono(stS); } } } } else if (stS.m_iOperaType == 10007) { //坐标角度同步 int syncid = BitConverter.ToInt32(stS.m_sOperaData, 0); if (LoadManage.Instance.SyncId != syncid) { int legth = BitConverter.ToInt32(stS.m_sOperaData, 4); string id = Encoding.UTF8.GetString(stS.m_sOperaData, 8, legth); if (FunctionSync_PositionRoate.positionRoateSyncObejctList.ContainsKey(id)) { FunctionSync_PositionRoate.positionRoateSyncObejctList[id].SetValue(8 + legth, stS.m_sOperaData); } } } else if (stS.m_iOperaType == 61) { //心跳检测 //XinTiaoCheck(); } else { RSclient._netMqListener.AddToMono(stS); } } } /// /// RoomServer,mono /// /// public void ReciveFromRoomServerInMono(st_Motions data) { #if !UNITY_EDITOR try { #endif switch (data.m_iOperaType) { case 16: { //结束房间 if (GameManage.Instance != null) { GameManage.Instance.action_close.Invoke(); } } break; case 25: { //二维通信(2维-->3维) int length = BitConverter.ToInt32(data.m_sOperaData, 0); string msg = Encoding.UTF8.GetString(data.m_sOperaData, 4, length); MessageModel messageModel = JsonMapper.ToObject(msg); if (SoftManage.Instance != null) { SoftManage.Instance.SoftHandle(messageModel); } } break; case 31: { //开始暂停 int length = BitConverter.ToInt32(data.m_sOperaData, 0); string practiceid = Encoding.UTF8.GetString(data.m_sOperaData, 4, length); isPause = (data.m_sOperaData[4 + length] == 1 ? false : true); if (GameManage.Instance.action_Pause != null) { GameManage.Instance.action_Pause.Invoke(isPause); } } break; case 33://得到房间所有数据 if (programState == ProgramState.进行中) { GetRoomData(data.m_sOperaData); } break; case 41: { //科目启停 int length = BitConverter.ToInt32(data.m_sOperaData, 0); string msg = Encoding.UTF8.GetString(data.m_sOperaData, 4, length); if (GameManage.Instance != null) { GameManage.Instance.SubjectChange(msg); } } break; case 51: { //步骤启停 int length = BitConverter.ToInt32(data.m_sOperaData, 0); string msg = Encoding.UTF8.GetString(data.m_sOperaData, 4, length); if (GameManage.Instance != null) { GameManage.Instance.StepChange(msg); } } break; case 1000://测试 break; case 10006://单值同步 if (programState == ProgramState.进行中) { int legth = BitConverter.ToInt32(data.m_sOperaData, 4); string id = Encoding.UTF8.GetString(data.m_sOperaData, 8, legth); OneValueSyncObject.OneAxisSyncObjectList[id].SetValue(8 + legth, data.m_sOperaData); OneValueSyncObject.OneAxisSyncObjectList[id].callbackInmono.Invoke(id, false); } break; case 10008://生成物体 if (programState == ProgramState.进行中) { int syncId = BitConverter.ToInt32(data.m_sOperaData, 0); if (LoadManage.Instance.SyncId != syncId) { if (FunctionSync_CreateObejct.Instance != null) { FunctionSync_CreateObejct.Instance.CallBack(data.m_sOperaData); } } } break; case 10010: if (programState == ProgramState.进行中) { //自己也要执行 int legth = BitConverter.ToInt32(data.m_sOperaData, 0); string id = Encoding.UTF8.GetString(data.m_sOperaData, 4, legth); if (FunctionSync_Media.functionSync_MediaDic.ContainsKey(id)) { FunctionSync_Media.functionSync_MediaDic[id].CallBack(data.m_sOperaData); } } break; } #if !UNITY_EDITOR } catch (Exception e) { Debug.LogError(e.Message); } #endif } public void GetRoomData(byte[] data) { //索引 int index = 0; //暂停 isPause = (data[0] == 1 ? true : false); index++; Debug.Log(isPause ? "暂停" : "开始"); if (GameManage.Instance.action_Pause != null) { GameManage.Instance.action_Pause.Invoke(isPause); } //打分 int countScore = BitConverter.ToInt32(data, index); index += 4; for (int i = 0; i < countScore; i++) { //取数据 int tmpnum = BitConverter.ToInt32(data, index); index += 4; byte[] tmp = new byte[tmpnum]; Array.Copy(data, index, tmp, 0, tmpnum); index += tmpnum; //解析 HandleScore(Encoding.UTF8.GetString(tmp)); } //10008生成 int countCreate = BitConverter.ToInt32(data, index); index += 4; for (int i = 0; i < countCreate; i++) { //取数据 int tmpnum = BitConverter.ToInt32(data, index); index += 4; byte[] tmp = new byte[tmpnum]; Array.Copy(data, index, tmp, 0, tmpnum); index += tmpnum; //解析 FunctionSync_CreateObejct.Instance.CallBack(tmp); } //10006单值 int couOneValue = BitConverter.ToInt32(data, index); index += 4; for (int i = 0; i < couOneValue; i++) { //取数据 int tmpnum = BitConverter.ToInt32(data, index); index += 4; byte[] tmp = new byte[tmpnum]; Array.Copy(data, index, tmp, 0, tmpnum); index += tmpnum; //解析 int legth = BitConverter.ToInt32(tmp, 4); string id = Encoding.UTF8.GetString(tmp, 8, legth); if (OneValueSyncObject.OneAxisSyncObjectList.ContainsKey(id)) { OneValueSyncObject.OneAxisSyncObjectList[id].SetValue(8 + legth, tmp); if (tmp[9 + legth] == 1) { OneValueSyncObject.OneAxisSyncObjectList[id].callbackInmono.Invoke(id, true); } } else { Debug.LogError("不存在此物体:" + id); } } //10007坐标旋转 int countPosRot = BitConverter.ToInt32(data, index); index += 4; for (int i = 0; i < countPosRot; i++) { //取数据 int tmpnum = BitConverter.ToInt32(data, index); index += 4; byte[] tmp = new byte[tmpnum]; Array.Copy(data, index, tmp, 0, tmpnum); index += tmpnum; //解析 int legth = BitConverter.ToInt32(tmp, 4); string id = Encoding.UTF8.GetString(tmp, 8, legth); if (FunctionSync_PositionRoate.positionRoateSyncObejctList.ContainsKey(id)) { FunctionSync_PositionRoate.positionRoateSyncObejctList[id].SetValue(8 + legth, tmp); } } Debug.Log("数据已恢复"); } private void HandleScore(string str) { var ys = str.Split('|'); if (ys[0] == "评估点") { //评估点 | 科目物体名称 | 评估点序号 | 当前index ScoreBase sb = GameManage.Instance.scoreManage.transform.Find(ys[1]).GetComponentsInChildren(true).ToList().Find(a => a.code.ToString() == ys[2]); sb.IsRight = true; sb.Completed = int.Parse(ys[3]); } else if (ys[1] == "操作点") { //操作点 | 科目物体名称 | 评估点序号 | 操作点物体名称 | index ScoreJudge_FixedValue tmp = GameManage.Instance.scoreManage.transform.Find(ys[1]).GetComponentsInChildren(true).ToList().Find(a => a.code.ToString() == ys[2]).transform.Find(ys[3]).GetComponent(); tmp.Isright = true; tmp.index = int.Parse(ys[4]); } Debug.Log("打分恢复:" + str); } /// /// 心跳检测响应 /// public void XinTiaoCheck() { if (programState == ProgramState.进行中 && LoadManage.Instance != null && !string.IsNullOrEmpty(LoadManage.Instance.MyId) && !string.IsNullOrEmpty(LoadManage.Instance.currentRoomArea)) { if (GameManage.Instance != null) { UnityEngine.Debug.Log("重置6秒"); GameManage.Instance.checkTime = 6; } byte[] tmp = Encoding.UTF8.GetBytes(LoadManage.Instance.MyId); byte[] data = new byte[4 + tmp.Length]; Array.Copy(BitConverter.GetBytes(tmp.Length), 0, data, 0, 4); Array.Copy(tmp, 0, data, 4, tmp.Length); RSclient.Send(LoadManage.Instance.currentRoomArea, 6, data); Debug.Log("心跳" + LoadManage.Instance.currentRoomArea); } } //public void StartRoom(string roomid) //{ // byte[] roomidbytes = Encoding.UTF8.GetBytes(roomid); // byte[] tmp = new byte[4 + roomidbytes.Length]; // Array.Copy(BitConverter.GetBytes(roomidbytes.Length), 0, tmp, 0, 4); // Array.Copy(roomidbytes, 0, tmp, 4, roomidbytes.Length); // MSclient.Send("mainServer", 100, tmp); // Debug.Log("启动房间:" + roomidbytes); //} //public void CloseRoom(string roomId, string pcArea, string roomArea) //{ // //string roomId = "abcdasdadasd"; // byte[] roomidbytes = Encoding.UTF8.GetBytes(roomId); // //string pcArea = "pcserver125"; // byte[] pcbytes = Encoding.UTF8.GetBytes(pcArea); // //string roomArea = "room1"; // byte[] roombytes = Encoding.UTF8.GetBytes(roomArea); // byte[] tmp = new byte[12 + roomidbytes.Length + pcbytes.Length + roombytes.Length]; // Array.Copy(BitConverter.GetBytes(roomidbytes.Length), 0, tmp, 0, 4); // Array.Copy(roomidbytes, 0, tmp, 4, roomidbytes.Length); // Array.Copy(BitConverter.GetBytes(pcbytes.Length), 0, tmp, 4 + roomidbytes.Length, 4); // Array.Copy(pcbytes, 0, tmp, 8 + roomidbytes.Length, pcbytes.Length); // Array.Copy(BitConverter.GetBytes(roombytes.Length), 0, tmp, 8 + roomidbytes.Length + pcbytes.Length, 4); // Array.Copy(roombytes, 0, tmp, 12 + roomidbytes.Length + pcbytes.Length, roombytes.Length); // MSclient.Send("mainServer", 110, tmp); // Debug.Log("关闭房间:" + roomId); //} private void OnDestroy() { Debug.Log("OnDestroy"); udpRun = false; if (RSclient != null) { RSclient.Destroy(); } if (udpClient != null) { udpClient.Close(); } } } public enum SystemMode { PC, MR }