using UnityEngine; using System.Collections.Generic; /// /// Example script that can be used to show tooltips. /// [AddComponentMenu("NGUI/UI/Tooltip")] public class UITooltip : MonoBehaviour { static protected UITooltip mInstance; public Camera uiCamera; public UILabel text; public GameObject tooltipRoot; public UISprite background; public float appearSpeed = 10f; public bool scalingTransitions = true; protected GameObject mTooltip; protected Transform mTrans; protected float mTarget = 0f; protected float mCurrent = 0f; protected Vector3 mPos; protected Vector3 mSize = Vector3.zero; protected UIWidget[] mWidgets; /// /// Whether the tooltip is currently visible. /// static public bool isVisible { get { return (mInstance != null && mInstance.mTarget == 1f); } } void Awake () { mInstance = this; } void OnDestroy () { mInstance = null; } /// /// Get a list of widgets underneath the tooltip. /// protected virtual void Start () { mTrans = transform; mWidgets = GetComponentsInChildren(); mPos = mTrans.localPosition; if (uiCamera == null) uiCamera = NGUITools.FindCameraForLayer(gameObject.layer); SetAlpha(0f); } /// /// Update the tooltip's alpha based on the target value. /// protected virtual void Update () { if (mTooltip != UICamera.tooltipObject) { mTooltip = null; mTarget = 0f; } if (mCurrent != mTarget) { mCurrent = Mathf.Lerp(mCurrent, mTarget, RealTime.deltaTime * appearSpeed); if (Mathf.Abs(mCurrent - mTarget) < 0.001f) mCurrent = mTarget; SetAlpha(mCurrent * mCurrent); if (scalingTransitions) { Vector3 offset = mSize * 0.25f; offset.y = -offset.y; Vector3 size = Vector3.one * (1.5f - mCurrent * 0.5f); Vector3 pos = Vector3.Lerp(mPos - offset, mPos, mCurrent); mTrans.localPosition = pos; mTrans.localScale = size; } } } /// /// Set the alpha of all widgets. /// protected virtual void SetAlpha (float val) { for (int i = 0, imax = mWidgets.Length; i < imax; ++i) { UIWidget w = mWidgets[i]; Color c = w.color; c.a = val; w.color = c; } } /// /// Set the tooltip's text to the specified string. /// protected virtual void SetText (string tooltipText) { if (text != null && !string.IsNullOrEmpty(tooltipText)) { mTarget = 1f; mTooltip = UICamera.tooltipObject; text.text = tooltipText; // Orthographic camera positioning is trivial mPos = UICamera.lastEventPosition; Transform textTrans = text.transform; Vector3 offset = textTrans.localPosition; Vector3 textScale = textTrans.localScale; // Calculate the dimensions of the printed text mSize = text.printedSize; // Scale by the transform and adjust by the padding offset mSize.x *= textScale.x; mSize.y *= textScale.y; if (background != null) { Vector4 border = background.border; mSize.x += border.x + border.z + (offset.x - border.x) * 2f; mSize.y += border.y + border.w + (-offset.y - border.y) * 2f; background.width = Mathf.RoundToInt(mSize.x); background.height = Mathf.RoundToInt(mSize.y); } if (uiCamera != null) { // Since the screen can be of different than expected size, we want to convert // mouse coordinates to view space, then convert that to world position. mPos.x = Mathf.Clamp01(mPos.x / Screen.width); mPos.y = Mathf.Clamp01(mPos.y / Screen.height); // Calculate the ratio of the camera's target orthographic size to current screen size float activeSize = uiCamera.orthographicSize / mTrans.parent.lossyScale.y; float ratio = (Screen.height * 0.5f) / activeSize; // Calculate the maximum on-screen size of the tooltip window Vector2 max = new Vector2(ratio * mSize.x / Screen.width, ratio * mSize.y / Screen.height); // Limit the tooltip to always be visible mPos.x = Mathf.Min(mPos.x, 1f - max.x); mPos.y = Mathf.Max(mPos.y, max.y); // Update the absolute position and save the local one mTrans.position = uiCamera.ViewportToWorldPoint(mPos); mPos = mTrans.localPosition; mPos.x = Mathf.Round(mPos.x); mPos.y = Mathf.Round(mPos.y); mTrans.localPosition = mPos; } else { // Don't let the tooltip leave the screen area if (mPos.x + mSize.x > Screen.width) mPos.x = Screen.width - mSize.x; if (mPos.y - mSize.y < 0f) mPos.y = mSize.y; // Simple calculation that assumes that the camera is of fixed size mPos.x -= Screen.width * 0.5f; mPos.y -= Screen.height * 0.5f; } // Force-update all anchors below the tooltip if (tooltipRoot != null) tooltipRoot.BroadcastMessage("UpdateAnchors"); else text.BroadcastMessage("UpdateAnchors"); } else { mTooltip = null; mTarget = 0f; } } /// /// Show a tooltip with the specified text. /// [System.Obsolete("Use UITooltip.Show instead")] static public void ShowText (string text) { if (mInstance != null) mInstance.SetText(text); } /// /// Show the tooltip. /// static public void Show (string text) { if (mInstance != null) mInstance.SetText(text); } /// /// Hide the tooltip. /// static public void Hide () { if (mInstance != null) { mInstance.mTooltip = null; mInstance.mTarget = 0f; } } }