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; public void Init(ObsData data) { _data = data; tintName.text = data.name; rect = this.GetComponent(); _button = this.transform.Find("Icon").GetComponent(); if (!data.status) { this.transform.Find("Icon").GetComponent().color = Color.red; this.transform.Find("Icon").GetChild(0).GetComponent().color = Color.red; } else { _button.onClick.AddListener(() => { GCJKLayer._Instance.ShowObsPlayerPanel(_data); }); } rect.anchoredPosition = new Vector2(2000, 0); _camera = CameraManager.instance.mainCamera; targetTransForm=StaticLod.instance.GetStaticObj(_data.targetName).transform; } void Update() { if (targetTransForm != null) { if (IsObjectInCameraView(targetTransForm, _camera)) { rect.transform.position=_camera.WorldToScreenPoint(targetTransForm.position); } else { rect.transform.position = new Vector3(2000, 0, 0); } } } 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); } }