using System.Collections; using System.Collections.Generic; using UnityEngine; using QFramework; using Sirenix.OdinInspector; public class DeviceController : MonoBehaviour { public static DeviceController instance; public string DeviceName; public Stack m_OperationPartMarkStruct = new Stack(); [HideInInspector] public ShowState m_ShowState; public PartMark m_CurrentSelectPartItem; private void Awake() { instance = this; ResKit.Init(); UIKit.OpenPanel(); } private void Start() { DeviceOfPartDataProxy deviceOfPartDataProxy = DAL.Instance.Get(); deviceOfPartDataProxy.ReadStepMsgInfoFromTable(DeviceName); PartInfo tmpPartInfo = GetDevicePartInfos(transform.GetComponent()); UIKit.OpenPanel(new PartListPanelData() { m_PartInfo = tmpPartInfo }); } private void Update() { PartLabelCheck(); ClikPartMarkCheck(); } /// /// 标签部分检测 /// private void PartLabelCheck() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { PartMark partMark = GetParentPartMarkWithPartMark(hit.collider.transform); if (m_CurrentSelectPartItem != partMark) { if (m_CurrentSelectPartItem != null) { m_CurrentSelectPartItem.CloseHighlighter(); } m_CurrentSelectPartItem = partMark; m_CurrentSelectPartItem.OpenHighlighter(); } // 处理射线击中的对象 if (partMark != null) { UIKit.OpenPanel(UILevel.PopUI, new PartLabelPanelData() { partName = partMark.name }); } } else { if (m_CurrentSelectPartItem != null) { m_CurrentSelectPartItem.CloseHighlighter(); m_CurrentSelectPartItem = null; } UIKit.HidePanel(); } } /// /// 点击物体检测 /// private void ClikPartMarkCheck() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { PartMark tmpMark = GetParentPartMarkWithPartMark(hit.collider.transform); if (tmpMark != null) { m_OperationPartMarkStruct.Push(tmpMark); UIKit.GetPanel().SetPartItemState(tmpMark, false); //点击版不强制刷新镜头位置 //CameraSurround.instance.SetCameraPosition(this.transform); } } } } /// /// 查找携带PartMark的节点 /// /// /// private PartMark GetParentPartMarkWithPartMark(Transform traget) { PartMark tmpMark = traget.GetComponent(); if (tmpMark == null && traget.parent != null) { tmpMark = GetParentPartMarkWithPartMark(traget.parent); } return tmpMark; } public void OnDisable() { UIKit.ClosePanel(); } public PartInfo GetDevicePartInfos(PartMark partMark) { //最父级 PartInfo partInfo = new PartInfo(partMark.transform.name, partMark); //字级 foreach (var item in partMark.m_ChildPartMarks) { partInfo.childPartInfos.Add(GetDevicePartInfos(item)); } return partInfo; } [Button("为所有节点添加标记")] private void AddPartMark() { Transform[] tmpTransforms = GetComponentsInChildren(); foreach (var item in tmpTransforms) { if (item.GetComponent() == null) { item.gameObject.AddComponent(); } } } }