using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class esPrefab : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { public Image esIcon; public Text esName; private int skillGroupId; private GameObject descriptionPrefab; private RectTransform descriptionRoot; private GameObject spawnedDescription; private RectTransform rectTransform; private Canvas rootCanvas; private Camera uiCamera; private Vector2 descriptionOffset = new Vector2(20f, 30f); private void Awake() { rectTransform = transform as RectTransform; rootCanvas = GetComponentInParent(); if (rootCanvas != null && rootCanvas.renderMode != RenderMode.ScreenSpaceOverlay) { uiCamera = rootCanvas.worldCamera; } } private void OnDisable() { DestroyDescription(); } private void OnDestroy() { DestroyDescription(); } public void BindSkillGroup(int groupId, string displayName, Sprite icon, GameObject desPrefab, RectTransform ownerRoot, Vector2 offset) { skillGroupId = Mathf.Max(0, groupId); descriptionPrefab = desPrefab; descriptionRoot = ownerRoot; descriptionOffset = offset; if (esName != null) { esName.text = displayName ?? string.Empty; } if (esIcon != null) { esIcon.sprite = icon; esIcon.enabled = icon != null; } } public void OnPointerEnter(PointerEventData eventData) { ShowDescription(); } public void OnPointerExit(PointerEventData eventData) { DestroyDescription(); } private void ShowDescription() { if (spawnedDescription != null || descriptionPrefab == null || descriptionRoot == null || skillGroupId <= 0) { return; } SkillGroup skillGroup = EquipmentSkillGroupLibrary.ResolveSkillGroup(skillGroupId); if (skillGroup == null) { return; } spawnedDescription = Instantiate(descriptionPrefab, descriptionRoot); spawnedDescription.SetActive(true); spawnedDescription.transform.SetAsLastSibling(); esDesPrefab description = spawnedDescription.GetComponent(); if (description != null) { description.Bind(skillGroup.groupName, skillGroup.groupIcon, skillGroup.skillDescriptionsText); } PositionDescription(spawnedDescription.transform as RectTransform); } private void PositionDescription(RectTransform descriptionRect) { if (descriptionRect == null || rectTransform == null || descriptionRoot == null) { return; } Vector3[] corners = new Vector3[4]; rectTransform.GetWorldCorners(corners); Vector3 rightCenterWorld = (corners[2] + corners[3]) * 0.5f; Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(uiCamera, rightCenterWorld); if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(descriptionRoot, screenPoint, uiCamera, out Vector2 localPoint)) { return; } descriptionRect.anchorMin = new Vector2(0f, 1f); descriptionRect.anchorMax = new Vector2(0f, 1f); descriptionRect.pivot = new Vector2(0f, 1f); descriptionRect.anchoredPosition = localPoint + descriptionOffset; } private void DestroyDescription() { if (spawnedDescription == null) { return; } if (Application.isPlaying) { Destroy(spawnedDescription); } else { DestroyImmediate(spawnedDescription); } spawnedDescription = null; } }