25 [RequireComponent(typeof(RectTransform))]
26 [AddComponentMenu(
"UI/Extensions/Tooltip/Tooltip")]
31 private RectTransform _rectTransform, canvasRectTransform;
33 [Tooltip(
"The canvas used by the tooltip as positioning and scaling reference. Should usually be the root Canvas of the hierarchy this component is in")]
36 [Tooltip(
"Sets if tooltip triggers will run ForceUpdateCanvases and refresh the tooltip's layout group " +
37 "(if any) when hovered, in order to prevent momentousness misplacement sometimes caused by ContentSizeFitters")]
43 private LayoutGroup _layoutGroup;
48 private float width, height;
55 private Camera _guiCamera;
62 _guiCamera = Camera.main;
69 private Vector3 screenLowerLeft, screenUpperRight, shiftingVector;
74 private Vector3 baseTooltipPos;
76 private Vector3 newTTPos;
77 private Vector3 adjustedNewTTPos;
78 private Vector3 adjustedTTLocalPos;
79 private Vector3 shifterForBorders;
81 private float borderTest;
84 private static ToolTip instance;
91 instance = FindObjectOfType<ToolTip>();
98 canvas = GetComponentInParent<Canvas>();
107 canvas = GetComponentInParent<Canvas>();
111 _guiCamera =
canvas.worldCamera;
113 _rectTransform = GetComponent<RectTransform>();
114 canvasRectTransform =
canvas.GetComponent<RectTransform>();
115 _layoutGroup = GetComponentInChildren<LayoutGroup>();
117 _text = GetComponentInChildren<Text>();
121 this.gameObject.SetActive(
false);
125 public void SetTooltip(
string ttext, Vector3 basePos,
bool refreshCanvasesBeforeGetSize =
false)
128 baseTooltipPos = basePos;
135 Debug.LogWarning(
"[ToolTip] Couldn't set tooltip text, tooltip has no child Text component");
145 gameObject.SetActive(
false);
165 Canvas.ForceUpdateCanvases();
168 _layoutGroup.enabled =
false;
169 _layoutGroup.enabled =
true;
182 case RenderMode.ScreenSpaceCamera:
185 case RenderMode.ScreenSpaceOverlay:
194 shiftingVector.x =
xShift;
195 shiftingVector.y =
YShift;
197 baseTooltipPos.z =
canvas.planeDistance;
199 newTTPos =
GuiCamera.ScreenToViewportPoint(baseTooltipPos - shiftingVector);
200 adjustedNewTTPos =
GuiCamera.ViewportToWorldPoint(newTTPos);
202 gameObject.SetActive(
true);
207 width = transform.lossyScale.x * _rectTransform.sizeDelta[0];
208 height = transform.lossyScale.y * _rectTransform.sizeDelta[1];
212 RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform, Vector2.zero,
GuiCamera, out screenLowerLeft);
213 RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform,
new Vector2(Screen.width, Screen.height),
GuiCamera, out screenUpperRight);
217 borderTest = (adjustedNewTTPos.x + width / 2);
218 if (borderTest > screenUpperRight.x)
220 shifterForBorders.x = borderTest - screenUpperRight.x;
221 adjustedNewTTPos.x -= shifterForBorders.x;
224 borderTest = (adjustedNewTTPos.x - width / 2);
225 if (borderTest < screenLowerLeft.x)
227 shifterForBorders.x = screenLowerLeft.x - borderTest;
228 adjustedNewTTPos.x += shifterForBorders.x;
234 borderTest = (adjustedNewTTPos.y - height / 2);
235 if (borderTest < screenLowerLeft.y) {
236 shifterForBorders.y = screenLowerLeft.y - borderTest;
237 adjustedNewTTPos.y += shifterForBorders.y;
241 borderTest = (adjustedNewTTPos.y + height / 2);
242 if (borderTest > screenUpperRight.y)
244 shifterForBorders.y = borderTest - screenUpperRight.y;
245 adjustedNewTTPos.y -= shifterForBorders.y;
249 adjustedNewTTPos = transform.rotation * adjustedNewTTPos;
251 transform.position = adjustedNewTTPos;
252 adjustedTTLocalPos = transform.localPosition;
253 adjustedTTLocalPos.z = 0;
254 transform.localPosition = adjustedTTLocalPos;
262 shiftingVector.x =
xShift;
263 shiftingVector.y =
YShift;
264 newTTPos = (baseTooltipPos - shiftingVector) /
canvas.scaleFactor;
265 adjustedNewTTPos = newTTPos;
267 gameObject.SetActive(
true);
271 width = _rectTransform.sizeDelta[0];
272 height = _rectTransform.sizeDelta[1];
276 screenLowerLeft = Vector3.zero;
277 screenUpperRight = canvasRectTransform.sizeDelta;
280 borderTest = (newTTPos.x + width / 2);
281 if (borderTest > screenUpperRight.x) {
282 shifterForBorders.x = borderTest - screenUpperRight.x;
283 adjustedNewTTPos.x -= shifterForBorders.x;
286 borderTest = (adjustedNewTTPos.x - width / 2);
287 if (borderTest < screenLowerLeft.x) {
288 shifterForBorders.x = screenLowerLeft.x - borderTest;
289 adjustedNewTTPos.x += shifterForBorders.x;
295 borderTest = (adjustedNewTTPos.y - height / 2);
296 if (borderTest < screenLowerLeft.y) {
297 shifterForBorders.y = screenLowerLeft.y - borderTest;
298 adjustedNewTTPos.y += shifterForBorders.y;
302 borderTest = (adjustedNewTTPos.y + height / 2);
303 if (borderTest > screenUpperRight.y) {
304 shifterForBorders.y = borderTest - screenUpperRight.y;
305 adjustedNewTTPos.y -= shifterForBorders.y;
309 adjustedNewTTPos *=
canvas.scaleFactor;
310 transform.position = adjustedNewTTPos;
Credit Erdener Gonenc - @PixelEnvision.