// Object Tooltip|Prefabs|0060
|
|
namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
/// <summary>
|
|
/// Event Payload
|
|
/// </summary>
|
|
/// <param name="newText">The optional new text that is given to the tooltip.</param>
|
|
public struct ObjectTooltipEventArgs
|
|
{
|
|
public string newText;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event Payload
|
|
/// </summary>
|
|
/// <param name="sender">this object</param>
|
|
/// <param name="e"><see cref="ObjectTooltipEventArgs"/></param>
|
|
public delegate void ObjectTooltipEventHandler(object sender, ObjectTooltipEventArgs e);
|
|
|
|
/// <summary>
|
|
/// Adds a World Space Canvas that can be used to provide additional information about an object by providing a piece of text with a line drawn to a destination point.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// **Prefab Usage:**
|
|
/// * Place the `VRTK/Prefabs/ObjectTooltip/ObjectTooltip` prefab into the scene hierarchy, preferably as a child of the GameObject it is associated with.
|
|
/// * Set the `Draw Line To` option to the Transform component of the GameObject the Tooltip will be assoicated with.
|
|
/// </remarks>
|
|
/// <example>
|
|
/// `VRTK/Examples/029_Controller_Tooltips` displays two cubes that have an object tooltip added to them along with tooltips that have been added to the controllers.
|
|
/// </example>
|
|
public class VRTK_ObjectTooltip : MonoBehaviour
|
|
{
|
|
[Tooltip("The text that is displayed on the tooltip.")]
|
|
public string displayText;
|
|
[Tooltip("The size of the text that is displayed.")]
|
|
public int fontSize = 14;
|
|
[Tooltip("The size of the tooltip container where `x = width` and `y = height`.")]
|
|
public Vector2 containerSize = new Vector2(0.1f, 0.03f);
|
|
[Tooltip("An optional transform of where to start drawing the line from. If one is not provided the centre of the tooltip is used for the initial line position.")]
|
|
public Transform drawLineFrom;
|
|
[Tooltip("A transform of another object in the scene that a line will be drawn from the tooltip to, this helps denote what the tooltip is in relation to. If no transform is provided and the tooltip is a child of another object, then the parent object's transform will be used as this destination position.")]
|
|
public Transform drawLineTo;
|
|
[Tooltip("The width of the line drawn between the tooltip and the destination transform.")]
|
|
public float lineWidth = 0.001f;
|
|
[Tooltip("The colour to use for the text on the tooltip.")]
|
|
public Color fontColor = Color.black;
|
|
[Tooltip("The colour to use for the background container of the tooltip.")]
|
|
public Color containerColor = Color.black;
|
|
[Tooltip("The colour to use for the line drawn between the tooltip and the destination transform.")]
|
|
public Color lineColor = Color.black;
|
|
[Tooltip("If this is checked then the tooltip will be rotated so it always face the headset.")]
|
|
public bool alwaysFaceHeadset = false;
|
|
|
|
/// <summary>
|
|
/// Emitted when the object tooltip is reset.
|
|
/// </summary>
|
|
public event ObjectTooltipEventHandler ObjectTooltipReset;
|
|
/// <summary>
|
|
/// Emitted when the object tooltip text is updated.
|
|
/// </summary>
|
|
public event ObjectTooltipEventHandler ObjectTooltipTextUpdated;
|
|
|
|
protected LineRenderer line;
|
|
protected Transform headset;
|
|
|
|
public virtual void OnObjectTooltipReset(ObjectTooltipEventArgs e)
|
|
{
|
|
if (ObjectTooltipReset != null)
|
|
{
|
|
ObjectTooltipReset(this, e);
|
|
}
|
|
}
|
|
|
|
public virtual void OnObjectTooltipTextUpdated(ObjectTooltipEventArgs e)
|
|
{
|
|
if (ObjectTooltipTextUpdated != null)
|
|
{
|
|
ObjectTooltipTextUpdated(this, e);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// The ResetTooltip method resets the tooltip back to its initial state.
|
|
/// </summary>
|
|
public virtual void ResetTooltip()
|
|
{
|
|
SetContainer();
|
|
SetText("UITextFront");
|
|
SetText("UITextReverse");
|
|
SetLine();
|
|
if (drawLineTo == null && transform.parent != null)
|
|
{
|
|
drawLineTo = transform.parent;
|
|
}
|
|
OnObjectTooltipReset(SetEventPayload());
|
|
}
|
|
|
|
/// <summary>
|
|
/// The UpdateText method allows the tooltip text to be updated at runtime.
|
|
/// </summary>
|
|
/// <param name="newText">A string containing the text to update the tooltip to display.</param>
|
|
public virtual void UpdateText(string newText)
|
|
{
|
|
displayText = newText;
|
|
OnObjectTooltipTextUpdated(SetEventPayload(newText));
|
|
ResetTooltip();
|
|
}
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
VRTK_SDKManager.AttemptAddBehaviourToToggleOnLoadedSetupChange(this);
|
|
}
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
ResetTooltip();
|
|
headset = VRTK_DeviceFinder.HeadsetTransform();
|
|
}
|
|
|
|
protected virtual void OnDestroy()
|
|
{
|
|
VRTK_SDKManager.AttemptRemoveBehaviourToToggleOnLoadedSetupChange(this);
|
|
}
|
|
|
|
protected virtual void Update()
|
|
{
|
|
DrawLine();
|
|
if (alwaysFaceHeadset)
|
|
{
|
|
transform.LookAt(headset);
|
|
}
|
|
}
|
|
|
|
protected virtual ObjectTooltipEventArgs SetEventPayload(string newText = "")
|
|
{
|
|
ObjectTooltipEventArgs e;
|
|
e.newText = newText;
|
|
return e;
|
|
}
|
|
|
|
protected virtual void SetContainer()
|
|
{
|
|
transform.Find("TooltipCanvas").GetComponent<RectTransform>().sizeDelta = containerSize;
|
|
Transform tmpContainer = transform.Find("TooltipCanvas/UIContainer");
|
|
tmpContainer.GetComponent<RectTransform>().sizeDelta = containerSize;
|
|
tmpContainer.GetComponent<Image>().color = containerColor;
|
|
}
|
|
|
|
protected virtual void SetText(string name)
|
|
{
|
|
Text tmpText = transform.Find("TooltipCanvas/" + name).GetComponent<Text>();
|
|
tmpText.material = Resources.Load("UIText") as Material;
|
|
tmpText.text = displayText.Replace("\\n", "\n");
|
|
tmpText.color = fontColor;
|
|
tmpText.fontSize = fontSize;
|
|
}
|
|
|
|
protected virtual void SetLine()
|
|
{
|
|
line = transform.Find("Line").GetComponent<LineRenderer>();
|
|
line.material = Resources.Load("TooltipLine") as Material;
|
|
line.material.color = lineColor;
|
|
#if UNITY_5_5_OR_NEWER
|
|
line.startColor = lineColor;
|
|
line.endColor = lineColor;
|
|
line.startWidth = lineWidth;
|
|
line.endWidth = lineWidth;
|
|
#else
|
|
line.SetColors(lineColor, lineColor);
|
|
line.SetWidth(lineWidth, lineWidth);
|
|
#endif
|
|
if (drawLineFrom == null)
|
|
{
|
|
drawLineFrom = transform;
|
|
}
|
|
}
|
|
|
|
protected virtual void DrawLine()
|
|
{
|
|
if (drawLineTo != null)
|
|
{
|
|
line.SetPosition(0, drawLineFrom.position);
|
|
line.SetPosition(1, drawLineTo.position);
|
|
}
|
|
}
|
|
}
|
|
}
|