using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using UnityEngine.UIElements; public class ObsIconCtrl : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler { private RectTransform rect; private Camera _camera; private UnityEngine.UI.Button _button; public ObsData _data; public Transform targetTransForm; public GameObject tint; public Text tintName; private float currentTime = 0.0f; public void Init(ObsData data) { _data = data; tintName.text = data.name; rect = this.GetComponent(); _button = this.transform.Find("Root").Find("Icon").GetComponent(); if (!data.status) { this.transform.Find("Root").Find("Icon").GetComponent().color = Color.red; this.transform.Find("Root").Find("Icon").GetChild(0).GetComponent().color = Color.red; } else { _button.onClick.AddListener(() => { if (GlobalData.pageIndex == PageIndex.Page1) { GCJKLayer._Instance.ShowObsPlayerPanel(_data); } if (GlobalData.pageIndex == PageIndex.Page3) { SPJKLayer._Instance.ShowObsPanel(_data); } }); } rect.anchoredPosition = new Vector2(2000, 0); _camera = CameraManager.instance.mainCamera; _camera.GetComponent().OnCameraBeginChange += CameraBeginChange; _camera.GetComponent().OnCameraEndChange += CameraEndChange; targetTransForm =StaticLod.instance.GetStaticObj(_data.targetName).transform; } void Update() { if (targetTransForm != null) { rect.transform.position = _camera.WorldToScreenPoint(targetTransForm.position); } } // 分离的委托方法,便于解除绑定 private void CameraBeginChange() { this.transform.Find("Root").gameObject.SetActive(false); } private void CameraEndChange() { this.transform.Find("Root").gameObject.SetActive(true); } // 在物体销毁前调用这个方法来解除绑定 private void OnDestroy() { if (_camera) { _camera.GetComponent().OnCameraBeginChange -= CameraBeginChange; _camera.GetComponent().OnCameraEndChange -= CameraEndChange; } } bool IsObjectInCameraView(Transform objectTransform, Camera camera) { Vector3 objectScreenPosition = camera.WorldToScreenPoint(objectTransform.position); return objectScreenPosition.z > 0 && objectScreenPosition.x > 0 && objectScreenPosition.x < Screen.width && objectScreenPosition.y > 0 && objectScreenPosition.y < Screen.height; } public void OnPointerEnter(PointerEventData eventData) { tint.gameObject.SetActive(true); LayoutRebuilder.ForceRebuildLayoutImmediate(tintName.GetComponent()); // 强制重新计算布局 LayoutRebuilder.ForceRebuildLayoutImmediate(tint.GetComponent()); // 强制重新计算布局 } public void OnPointerExit(PointerEventData eventData) { tint.gameObject.SetActive(false); } }