Files
2026-02-21 16:45:37 +08:00

179 lines
3.7 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace UIWidgets
{
[RequireComponent(typeof(RectTransform))]
[AddComponentMenu("UI/Tooltip", 300)]
public class Tooltip : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler, IEventSystemHandler
{
[SerializeField]
private GameObject tooltipObject;
[SerializeField]
private GameObject tooltipObjectNonVR;
[SerializeField]
private GameObject tooltipObjectVR;
[SerializeField]
public float ShowDelay = 0.3f;
public Vector2 anchoredPosition;
public Transform canvasTransform;
public Transform tooltipObjectParent;
public int maxVRTextSize = 22;
public bool fixWidthScale;
private IEnumerator currentCorutine;
public GameObject TooltipObject
{
get
{
return tooltipObject;
}
set
{
tooltipObject = value;
}
}
private void Start()
{
tooltipObjectParent = tooltipObject.transform.parent;
tooltipObjectNonVR = tooltipObject;
if (tooltipObjectVR != null && VRManager.IsVROn())
{
TooltipObject = tooltipObjectVR;
}
else
{
TooltipObject = tooltipObject;
}
if (TooltipObject != null)
{
anchoredPosition = (TooltipObject.transform as RectTransform).anchoredPosition;
if (maxVRTextSize > 0)
{
TooltipObject.GetComponentInChildren<Text>().resizeTextMaxSize = maxVRTextSize;
}
canvasTransform = Utilites.FindCanvas(tooltipObjectParent);
TooltipObject.SetActive(false);
tooltipObjectNonVR.SetActive(false);
if (tooltipObjectVR != null)
{
tooltipObjectVR.SetActive(false);
}
}
}
private IEnumerator ShowCorutine()
{
yield return new WaitForSecondsRealtime(ShowDelay);
if (canvasTransform != null)
{
(TooltipObject.transform as RectTransform).anchoredPosition = anchoredPosition;
TooltipObject.transform.SetParent(canvasTransform);
}
TooltipObject.SetActive(true);
if (fixWidthScale)
{
TooltipObject.transform.localScale = new Vector3(TooltipObject.transform.localScale.y, TooltipObject.transform.localScale.y, TooltipObject.transform.localScale.z);
}
}
public void Show()
{
if (!(TooltipObject == null) && currentCorutine == null)
{
currentCorutine = ShowCorutine();
StartCoroutine(currentCorutine);
}
}
private IEnumerator HideCoroutine()
{
if (currentCorutine != null)
{
StopCoroutine(currentCorutine);
currentCorutine = null;
}
if (TooltipObject != null)
{
TooltipObject.SetActive(false);
if ((bool)tooltipObjectNonVR)
{
tooltipObjectNonVR.SetActive(false);
}
if ((bool)tooltipObjectVR)
{
tooltipObjectVR.SetActive(false);
}
yield return null;
if (canvasTransform != null)
{
TooltipObject.transform.SetParent(tooltipObjectParent);
(TooltipObject.transform as RectTransform).anchoredPosition = anchoredPosition;
}
}
}
public void Hide()
{
StartCoroutine(HideCoroutine());
}
public void QuickHide()
{
if (currentCorutine != null)
{
StopCoroutine(currentCorutine);
}
if (TooltipObject != null)
{
TooltipObject.SetActive(false);
if ((bool)tooltipObjectNonVR)
{
tooltipObjectNonVR.SetActive(false);
}
if ((bool)tooltipObjectVR)
{
tooltipObjectVR.SetActive(false);
}
}
}
public void OnPointerEnter(PointerEventData eventData)
{
Show();
}
public void OnPointerExit(PointerEventData eventData)
{
Hide();
}
public void OnSelect(BaseEventData eventData)
{
Show();
}
public void OnDeselect(BaseEventData eventData)
{
Hide();
}
public void OnDisable()
{
QuickHide();
}
}
}