using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; using Unity.VisualScripting; using UnityEngine; /// /// 挂载设备 /// public class Device : MonoBehaviour { public DeviceInfor mydata; public bool isPut = false; [ContextMenu("添加端口信息脚本")] public void addscript() { //添加端口信息脚本 for (int i = 0; i < transform.childCount; i++) { var go = transform.GetChild(i); mydata.ports.Add(go); if (!go.GetComponent()) go.AddComponent(); if (!go.GetComponent()) go.AddComponent(); } } // Start is called before the first frame update private void Awake() { } void Start() { } // Update is called once per frame void Update() { if (isPut) { isPut = false; refreshMyID(); LineInforChecker(); //自己的设备JSON var myjson = refreshJson(); //更新设备JSON string machineID = string.Format("{0}-{1}-{2}", mydata.area, mydata.row, mydata.tier); lock (CombineJSON.jsonsDic) { if (CombineJSON.jsonsDic.ContainsKey(machineID)) { CombineJSON.jsonsDic.Remove(machineID); CombineJSON.jsonsDic.Add(machineID, myjson); } else CombineJSON.jsonsDic.Add(machineID, myjson); } } } /// /// 生成所有设备JSON /// [ContextMenu("生成所有设备JSON")] public void AllDeviceJson() { string AllDeviceJson = CombineJSON.GetCombineJSON(); Debug.Log(AllDeviceJson); } /// /// 刷新自己名字 /// void refreshMyID() { for (int i = 0; i < mydata.ports.Count; i++) { var po = mydata.ports[i].GetComponent(); var li = mydata.ports[i].GetComponent(); li.root.myID = string.Format("{0}-{1}-{2}-{3}", mydata.area, mydata.row, mydata.tier, i + 1); li.transform.name = li.root.myID; } } /// /// 更新该设备下所有端口信息(JSON) /// string refreshJson() { List> strings = new List>(); var _line = GetComponentsInChildren().ToList(); for (int i = 0; i < _line.Count; i++) { var line = new List(); line.Add(_line[i].root.myID); line.Add(_line[i].root.otherID); line.Add(_line[i].root.lineUID); strings.Add(line); } DeviceInfor person = new DeviceInfor(); person.devtype = mydata.devtype; person.ports = null; person.area = mydata.area; person.row = mydata.row; person.tier = mydata.tier; person.lineInfors = new List>(strings); string json = JsonConvert.SerializeObject(person); //Debug.Log(json); return json; } /// /// 遍历相同lineUID的物体 /// /// 寻找具体某一UID void LineInforChecker(string uid = null) { bool isfind = false; LineInfor[] lineInfors = FindObjectsOfType(); //记录相同lineUID Dictionary> lineUIDDict = new Dictionary>(); foreach (var item in lineInfors) { if (string.IsNullOrEmpty(item.root.lineUID)) continue; // 判断lineUID是否存在于字典中 if (lineUIDDict.ContainsKey(item.root.lineUID)) { lineUIDDict[item.root.lineUID].Add(item); } else { List newList = new List(); newList.Add(item); lineUIDDict.Add(item.root.lineUID, newList); } } // 输出相同lineUID foreach (var item in lineUIDDict) { if (item.Value.Count > 1) { //查找特定的GUID if (uid != null) { if (item.Key == uid) { isfind = true; Debug.Log(string.Format ("lineUID: {0},GameA Name: {1},GameB Name: {2}", item.Key, item.Value[0].root.myID, item.Value[1].root.myID)); refreshLineInfor(item.Key, item.Value[0], item.Value[1]); break; } } //遍历 else { isfind = true; Debug.Log(string.Format ("lineUID: {0},GameA Name: {1},GameB Name: {2}", item.Key, item.Value[0].root.myID, item.Value[1].root.myID)); refreshLineInfor(item.Key, item.Value[0], item.Value[1]); } } } if (!isfind) Debug.Log("无匹配端口UID"); } /// /// 刷新端口线条信息 /// public void refreshLineInfor(string GUID, LineInfor A, LineInfor B) { A.root.lineUID = GUID; B.root.lineUID = GUID; A.root.otherID = B.root.myID; if (string.IsNullOrEmpty(B.root.otherID)) { B.root.otherID = A.root.myID; //更新B端口的设备下所有端口信息 var DeviceB = B.transform.parent.GetComponent(); if (DeviceB != null) { DeviceB.isPut = true; } } } }