using SC.XR.Unity.Module_InputSystem; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; using Ximmerse.XR.Tag; /// /// 机柜Tag管理 /// public class BladeServerManager : MonoSingleton { /// /// 所有的 UIItem /// public List listTagTracking = new List(); // public List nowTagTracking = new List(); /// /// 当前识别到的Tag /// public Dictionary dicNowTagTracking = new Dictionary(); /// /// 当前使用的Tag /// public TagTracking foundTag; public string foundID; /// /// 当前Tag对应的UIItem /// public DataItem foundItem; /// /// 当前Tag 对应的机柜 /// public MachineObj foundMachineObj; /// /// 检测角度 /// public float foundAngle; /// /// 显示移动的距离 /// public float showDis; /// /// 隐藏的距离 /// public float fadeDis; /// /// 编辑Tag的移动框 /// // public Transform selectPanel; /// /// 模拟测试用的 /// public TagTracking TestTracking; public GameObject deviceDetails; /// /// 同步位置的Obj /// private Transform tagObj; /// /// 是否是编辑状态 /// private bool state = false; //public delegate void TrackingFound(DataItem tagobj); ///// ///// 物体识别到显示 ///// //public TrackingFound OnTrackFound; //public delegate void TrackingLast(DataItem tagobj); ///// ///// 物体识别到隐藏 ///// //public TrackingLast OnTrackLast; private bool isSync; public bool isDaoHang; private void Start() { tagObj = new GameObject("TagObj").transform; tagObj.position = Vector3.zero; tagObj.eulerAngles = Vector3.zero; isSync = false; showDis = 0.55f; fadeDis = 1.3f; //ManipulationHandler manipulation = selectPanel.GetComponent(); //manipulation.PointerDown.AddListener(( msg )=> { SelectPointerDown(); }); //manipulation.PointerUp.AddListener((msg) => { SelectPointerUp(); }); } float dis; float angle; Quaternion rot; float roty; Transform point; private void Update() { #if UNITY_EDITOR if(Input.GetKeyDown(KeyCode.K)) { OnTrackingFound(TestTracking); } #endif // Debug.Log(state); // if(isDaoHang) TagSynchronization(); } /// /// 同步Tag /// private void TagSynchronization() { if (foundItem != null && foundTag != null && !state) { dis = Vector3.Distance(new Vector3(foundTag.transform.position.x,0, foundTag.transform.position.z) ,new Vector3(OpenXRCamera.Instance.head.transform.position.x,0, OpenXRCamera.Instance.head.transform.position.z) ); angle = Vector3.Angle(OpenXRCamera.Instance.head.GetComponent().transform.forward, foundTag.transform.position - OpenXRCamera.Instance.head.transform.position); // Debug.Log("Dis " + dis + " Angle" + angle + " showDis " + showDis + " fadeDis " + fadeDis); if (Mathf.Abs(dis) < showDis && isDaoHang) { if (!foundItem.gameObject.activeSelf&& (BD_ShowDevicecDetailsObj.Instance == null||(BD_ShowDevicecDetailsObj.Instance != null && (!BD_ShowDevicecDetailsObj.Instance.gameObject.activeSelf|| !BD_ShowDevicecDetailsObj.Instance.transform.parent.gameObject.activeSelf)))) { Debug.Log("DGJ ==== >> ShowFoundItem "); foundItem.gameObject.SetActive(true); if (BD_ShowDevicecDetailsObj.Instance != null && BD_ShowDevicecDetailsObj.Instance.gameObject.activeSelf) BD_ShowDevicecDetailsObj.Instance.gameObject.SetActive(false); // ScenesManager.Instance.showOffice(ScenesManager.SceneType.DeviceDetails); // OnTrackFound(foundItem); } point = foundTag.transform.GetChild(0); point.localPosition = foundItem.offsetPos; switch (Mathf.Abs(foundItem.eulerAxle)) { case 1: point.localEulerAngles = new Vector3(0, 0, 90 * (foundItem.eulerAxle / Mathf.Abs(foundItem.eulerAxle))); break; case 2: point.localEulerAngles = new Vector3(0, foundItem.eulerAxle > 0 ? 0 : 180, 0); break; case 3: point.localEulerAngles = new Vector3(90 * (foundItem.eulerAxle / Mathf.Abs(foundItem.eulerAxle)), 0, 0); break; default: break; } if (isSync) { Debug.Log("Dis " + dis + " Angle" + angle + " showDis " + showDis + " fadeDis " + fadeDis); Debug.Log("FoundItem " + foundItem.transform.position + " point" + point.transform.position + " CA " + new Vector3(point.transform.position.x - foundItem.transform.position.x, 0, point.position.z - foundItem.transform.position.z)); //foundItem.transform.Translate(new Vector3(0, point.eulerAngles.y, 0), Time.deltaTime * 10); foundItem.transform.eulerAngles = new Vector3(0, point.eulerAngles.y, 0); foundItem.transform.position = point.transform.position; UICallManager.Instance.OnTrackfound(foundItem); isSync = false; //MachineRoomManager.Instance.transform.eulerAngles = new Vector3(MachineRoomManager.Instance.transform.eulerAngles.x, point.eulerAngles.y+180, MachineRoomManager.Instance.transform.eulerAngles.z); //MachineRoomManager.Instance.transform.position += new Vector3(point.transform.position.x - foundItem.transform.position.x, point.position.y - foundItem.transform.position.y, point.position.z - foundItem.transform.position.z); //float offy = OpenXRCamera.Instance.transform.position.y - foundItem.transform.position.y; //offy = offy * 0.05f; //MachineRoomManager.Instance.transform.position += new Vector3(0, offy, 0); } } // 隐藏的距离判断改由每个DataItem 自己监测 //else if (Mathf.Abs(dis) > fadeDis) //{ // //OnTrackLast(foundItem); // // foundItem.gameObject.SetActive(false); // foundItem.Hide(); // UICallManager.Instance.OnTracklast(foundItem); // foundItem = null; // // foundTag = null; // dicNowTagTracking.Clear(); // dicNowTagTracking = new Dictionary(); //} } else { isSync = true; } } public void OnTrackingFound(TagTracking tracking) { #region 组合Tag识别 //if (!dicNowTagTracking.ContainsKey(tracking.TrackId)) //{ // //if(dicNowTagTracking.Count==1) // //{ // // TagTracking firstTracking = dicNowTagTracking.FirstOrDefault().Value; // // Debug.Log(firstTracking.TrackId +" "+tracking.TrackId+" "+ Vector3.Distance(firstTracking.transform.position, tracking.transform.position) + " Distance"); // // //if (Vector3.Distance(firstTracking.transform.position, tracking.transform.position) < 0.1f) // 判断两个Tag是否为并列使用 // // //{ // // // dicNowTagTracking.Add(tracking.TrackId, tracking); // // // tagObj.SetParent(tracking.transform); // // // tagObj.localEulerAngles = Vector3.zero; // // // tagObj.localPosition = Vector3.zero; // // // tagObj.SetParent(firstTracking.transform); // // // if (tagObj.localPosition.x > 0) // // // { // // // foundTag = firstTracking; // // // foundID = tracking.TrackId.ToString() + firstTracking.TrackId.ToString(); // // // } // // // else // // // { // // // foundTag = tracking; // // // foundID = firstTracking.TrackId.ToString() + tracking.TrackId.ToString(); // // // } // // //} // // //else // // //{ // // // // 初始化 // // // StartTracking(tracking); // // //} // //} // //else // //{ // // // 初始化 // // StartTracking(tracking); // //} // #endregion // if (dicNowTagTracking == null || dicNowTagTracking.Count == 0) // { // // 初始化 // StartTracking(tracking); // } //} #endregion foundTag = tracking; foundID = tracking.TrackId.ToString(); Debug.Log("FoundID "+ foundID); // UILogManager.Instance.SendLogText(2, foundID); if (foundItem==null|| foundItem.tagId!= int.Parse( foundID)) { QueryFoundItem(int.Parse(foundID)); isSync = true; WayFindingManager.Instance.CloseWayFind(); // ScenesManager.Instance.showOffice(ScenesManager.SceneType.DeviceDetails); } Debug.Log(" FoundItem " + foundItem.ID); UILogManager.Instance.SendLogText(1, tracking.TrackId.ToString() + " " + foundID); } public void OnTrackingLost(TagTracking tracking) { //if (tracking.TrackId == foundTag.TrackId) // foundItem = null; } private void StartTracking(TagTracking tracking) { if(MachineRoomManager.Instance.isDataInit) { dicNowTagTracking.Clear(); dicNowTagTracking = new Dictionary(); dicNowTagTracking.Add(tracking.TrackId, tracking); foundTag = tracking; foundID = tracking.TrackId.ToString(); } } private void QueryFoundItem(int foundID) { Debug.Log("DGJ ===> QueryFoundItem " + listTagTracking.Count); if (MachineRoomManager.Instance.isDataInit) { int row = SynPlayerTransform.Instance.GetRowCabinets(); bool orientation = SynPlayerTransform.Instance.GetOrientation(); if(orientation) { row += 2; } else { row += 1; } Debug.Log(row * MachineRoomManager.Instance.data.list + " " + (row + 1) * MachineRoomManager.Instance.data.list); for (int i = row*MachineRoomManager.Instance.data.list; i < (row+1)*MachineRoomManager.Instance.data.list; i++) { Debug.Log("DGJ ===> " + listTagTracking[i].tagId); if (listTagTracking[i].tagId == foundID) { if (foundItem != null) { //foundItem.gameObject.SetActive(false); // foundItem.Hide(); if (state) { foundItem.isSelect = false; foundItem.SetSelect(false); // foundItem.SaveEdiotrData(selectPanel); } } foundItem = listTagTracking[i]; // foundItem.gameObject.SetActive(true); Debug.Log(" QueryFoundItem " + foundID); if (state) { //selectPanel.eulerAngles = foundItem.transform.eulerAngles; //selectPanel.position = foundItem.transform.position; //selectPanel.gameObject.SetActive(true); foundItem.isSelect = true; foundItem.SetSelect(true); } break; } } #region old //for (int i = 0; i < listTagTracking.Count; i++) //{ // Debug.Log("DGJ ===> " + listTagTracking[i].tagId); // if (listTagTracking[i].tagId == foundID) // { // if (foundItem != null) // { // //foundItem.gameObject.SetActive(false); // // foundItem.Hide(); // if (state) // { // foundItem.isSelect = false; // foundItem.SetSelect(false); // // foundItem.SaveEdiotrData(selectPanel); // } // } // foundItem = listTagTracking[i]; // // foundItem.gameObject.SetActive(true); // Debug.Log(" QueryFoundItem " + foundID); // if (state) // { // //selectPanel.eulerAngles = foundItem.transform.eulerAngles; // //selectPanel.position = foundItem.transform.position; // //selectPanel.gameObject.SetActive(true); // foundItem.isSelect = true; // foundItem.SetSelect(true); // } // break; // } //} // 找到x-tag 对应的机柜 //for (int i = 0; i < MachineRoomManager.Instance.listObjes.Count; i++) //{ // if(MachineRoomManager.Instance.listObjes[i].deviceParameters!=null&&MachineRoomManager.Instance.listObjes[i].deviceParameters.deviceId == foundItem.ID.ToString()) // { // // 找到后, // foundMachineObj = MachineRoomManager.Instance.listObjes[i]; // } //} #endregion if (foundItem != null && foundItem.tagId != foundID) { //foundItem.gameObject.SetActive(false); // foundItem.Hide(); foundItem.isSelect = false; foundItem.SetSelect(false); foundItem = null; } } } public void EditorTag( Text text) { if(foundItem!=null) { text.text = state ? "打开" : "关闭"; text.text += "机柜Tag编辑"; state = !state; if(state) { //selectPanel.eulerAngles = foundItem.transform.eulerAngles; //selectPanel.position = foundItem.transform.position; //selectPanel.gameObject.SetActive(true); foundItem.isSelect = true; foundItem.SetSelect(true); } else { foundItem.SaveEdiotrData(foundTag.transform); //selectPanel.gameObject.SetActive(false); foundItem.isSelect = false; foundItem.SetSelect(false); } } if(!state) { //for (int i = 0; i < listTagTracking.Count; i++) //{ // listTagTracking[i].SaveData(); //} foundItem.SaveData(); // Servermanager.Instance.Save(); MachineRoomManager.Instance.SaveAllData(); } } public void SelectPointerEnter() { //if(foundItem!=null) // foundItem.SelectObj(selectPanel); } public void SelectPointerDown() { if (foundItem != null&& foundTag!=null) { foundItem.isSelect = true; foundItem.SetSelect( true); } } public void SelectPointerUp() { if (foundItem != null && foundTag != null) { foundItem.isSelect = false; foundItem.SetSelect(false); foundItem.SaveEdiotrData(foundTag.transform); } } private void SaveData() { /* * * */ } }