using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections; namespace UIWidgets { /// /// Tooltip. /// http://ilih.ru/images/unity-assets/UIWidgets/Tooltip.png /// [AddComponentMenu("UI/UIWidgets/Tooltip")] [RequireComponent(typeof(RectTransform))] public class Tooltip : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler { [SerializeField] GameObject tooltipObject; /// /// Seconds before tooltip shown after pointer enter. /// [SerializeField] public float ShowDelay = 0.3f; /// /// The tooltip object. /// public GameObject TooltipObject { get { return tooltipObject; } set { tooltipObject = value; if (tooltipObject!=null) { tooltipObjectParent = tooltipObject.transform.parent; } } } Vector2 anchoredPosition; Transform canvasTransform; Transform tooltipObjectParent; void Start() { TooltipObject = tooltipObject; if (TooltipObject!=null) { canvasTransform = Utilites.FindTopmostCanvas(tooltipObjectParent); TooltipObject.SetActive(false); } } IEnumerator currentCorutine; IEnumerator ShowCorutine() { yield return new WaitForSeconds(ShowDelay); if (canvasTransform!=null) { anchoredPosition = (TooltipObject.transform as RectTransform).anchoredPosition; tooltipObjectParent = tooltipObject.transform.parent; TooltipObject.transform.SetParent(canvasTransform); } TooltipObject.SetActive(true); } /// /// Show this tooltip. /// public void Show() { if (TooltipObject==null) { return ; } currentCorutine = ShowCorutine(); StartCoroutine(currentCorutine); } IEnumerator HideCoroutine() { if (currentCorutine!=null) { StopCoroutine(currentCorutine); } if (TooltipObject!=null) { TooltipObject.SetActive(false); yield return null; if (canvasTransform!=null) { TooltipObject.transform.SetParent(tooltipObjectParent); (TooltipObject.transform as RectTransform).anchoredPosition = anchoredPosition; } } } /// /// Hide this tooltip. /// public void Hide() { StartCoroutine(HideCoroutine()); } /// /// Raises the pointer enter event. /// /// Current event data. public void OnPointerEnter(PointerEventData eventData) { Show(); } /// /// Raises the pointer exit event. /// /// Current event data. public void OnPointerExit(PointerEventData eventData) { Hide(); } /// /// Raises the select event. /// /// Current event data. public void OnSelect(BaseEventData eventData) { Show(); } /// /// Raises the deselect event. /// /// Current event data. public void OnDeselect(BaseEventData eventData) { Hide(); } #if UNITY_EDITOR void CreateTooltipObject() { TooltipObject = Utilites.CreateWidgetFromAsset("Tooltip"); TooltipObject.transform.SetParent(transform); var tooltipRectTransform = TooltipObject.transform as RectTransform; tooltipRectTransform.anchorMin = new Vector2(1, 1); tooltipRectTransform.anchorMax = new Vector2(1, 1); tooltipRectTransform.pivot = new Vector2(1, 0); tooltipRectTransform.anchoredPosition = new Vector2(0, 0); } /// /// Reset this instance. /// protected void Reset() { if (TooltipObject==null) { CreateTooltipObject(); } } #endif } }