196 lines
5.7 KiB
C#
196 lines
5.7 KiB
C#
using Newtonsoft.Json;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using Unity.VisualScripting;
|
||
using UnityEngine;
|
||
|
||
/// <summary>
|
||
/// 挂载设备
|
||
/// </summary>
|
||
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<LineInfor>()) go.AddComponent<LineInfor>();
|
||
if (!go.GetComponent<PortQuery>()) go.AddComponent<PortQuery>();
|
||
}
|
||
}
|
||
|
||
// 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);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成所有设备JSON
|
||
/// </summary>
|
||
[ContextMenu("生成所有设备JSON")]
|
||
public void AllDeviceJson()
|
||
{
|
||
string AllDeviceJson = CombineJSON.GetCombineJSON();
|
||
Debug.Log(AllDeviceJson);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 刷新自己名字
|
||
/// </summary>
|
||
void refreshMyID()
|
||
{
|
||
for (int i = 0; i < mydata.ports.Count; i++)
|
||
{
|
||
var po = mydata.ports[i].GetComponent<PortQuery>();
|
||
var li = mydata.ports[i].GetComponent<LineInfor>();
|
||
li.root.myID = string.Format("{0}-{1}-{2}-{3}", mydata.area, mydata.row, mydata.tier, i + 1);
|
||
li.transform.name = li.root.myID;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新该设备下所有端口信息(JSON)
|
||
/// </summary>
|
||
string refreshJson()
|
||
{
|
||
List<List<string>> strings = new List<List<string>>();
|
||
var _line = GetComponentsInChildren<LineInfor>().ToList();
|
||
|
||
for (int i = 0; i < _line.Count; i++)
|
||
{
|
||
var line = new List<string>();
|
||
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<List<string>>(strings);
|
||
|
||
string json = JsonConvert.SerializeObject(person);
|
||
//Debug.Log(json);
|
||
return json;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 遍历相同lineUID的物体
|
||
/// </summary>
|
||
/// <param name="uid">寻找具体某一UID</param>
|
||
void LineInforChecker(string uid = null)
|
||
{
|
||
bool isfind = false;
|
||
LineInfor[] lineInfors = FindObjectsOfType<LineInfor>();
|
||
|
||
//记录相同lineUID
|
||
Dictionary<string, List<LineInfor>> lineUIDDict = new Dictionary<string, List<LineInfor>>();
|
||
|
||
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<LineInfor> newList = new List<LineInfor>();
|
||
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");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 刷新端口线条信息
|
||
/// </summary>
|
||
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<Device>();
|
||
if (DeviceB != null)
|
||
{
|
||
DeviceB.isPut = true;
|
||
}
|
||
}
|
||
}
|
||
}
|