mirror of
https://github.com/RHeavenStudio/HeavenStudio.git
synced 2025-06-12 11:47:38 +02:00
Editor stuff
This commit is contained in:
@ -0,0 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dcabbd73a79cd8c4a966e44d7f276790
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
userData:
|
@ -0,0 +1,56 @@
|
||||
///Credit Martin Nerurkar // www.martin.nerurkar.de // www.sharkbombs.com
|
||||
///Sourced from - http://www.sharkbombs.com/2015/02/10/tooltips-with-the-new-unity-ui-ugui/
|
||||
|
||||
namespace UnityEngine.UI.Extensions
|
||||
{
|
||||
[AddComponentMenu("UI/Extensions/Bound Tooltip/Bound Tooltip Item")]
|
||||
public class BoundTooltipItem : MonoBehaviour
|
||||
{
|
||||
public bool IsActive
|
||||
{
|
||||
get
|
||||
{
|
||||
return gameObject.activeSelf;
|
||||
}
|
||||
}
|
||||
|
||||
public UnityEngine.UI.Text TooltipText;
|
||||
public Vector3 ToolTipOffset;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
instance = this;
|
||||
if(!TooltipText) TooltipText = GetComponentInChildren<Text>();
|
||||
HideTooltip();
|
||||
}
|
||||
|
||||
public void ShowTooltip(string text, Vector3 pos)
|
||||
{
|
||||
if (TooltipText.text != text)
|
||||
TooltipText.text = text;
|
||||
|
||||
transform.position = pos + ToolTipOffset;
|
||||
|
||||
gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
public void HideTooltip()
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
// Standard Singleton Access
|
||||
private static BoundTooltipItem instance;
|
||||
public static BoundTooltipItem Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
instance = GameObject.FindObjectOfType<BoundTooltipItem>();
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d6f5ec6d595a31459e6942110d86aaa
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
@ -0,0 +1,54 @@
|
||||
///Credit Martin Nerurkar // www.martin.nerurkar.de // www.sharkbombs.com
|
||||
///Sourced from - http://www.sharkbombs.com/2015/02/10/tooltips-with-the-new-unity-ui-ugui/
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
namespace UnityEngine.UI.Extensions
|
||||
{
|
||||
[AddComponentMenu("UI/Extensions/Bound Tooltip/Bound Tooltip Trigger")]
|
||||
public class BoundTooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler
|
||||
{
|
||||
[TextAreaAttribute]
|
||||
public string text;
|
||||
|
||||
public bool useMousePosition = false;
|
||||
|
||||
public Vector3 offset;
|
||||
|
||||
public void OnPointerEnter(PointerEventData eventData)
|
||||
{
|
||||
if (useMousePosition)
|
||||
{
|
||||
StartHover(new Vector3(eventData.position.x, eventData.position.y, 0f));
|
||||
}
|
||||
else
|
||||
{
|
||||
StartHover(transform.position + offset);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnSelect(BaseEventData eventData)
|
||||
{
|
||||
StartHover(transform.position);
|
||||
}
|
||||
|
||||
public void OnPointerExit(PointerEventData eventData)
|
||||
{
|
||||
StopHover();
|
||||
}
|
||||
|
||||
public void OnDeselect(BaseEventData eventData)
|
||||
{
|
||||
StopHover();
|
||||
}
|
||||
|
||||
void StartHover(Vector3 position)
|
||||
{
|
||||
BoundTooltipItem.Instance.ShowTooltip(text, position);
|
||||
}
|
||||
|
||||
void StopHover()
|
||||
{
|
||||
BoundTooltipItem.Instance.HideTooltip();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4d7c934af453a9469701b72267593ec
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
@ -0,0 +1,331 @@
|
||||
/// Credit drHogan
|
||||
/// Sourced from - http://www.hammerandravens.com/multi-use-tooltip-system-in-unity3d/
|
||||
|
||||
namespace UnityEngine.UI.Extensions
|
||||
{
|
||||
[AddComponentMenu("UI/Extensions/HoverTooltip")]
|
||||
public class HoverTooltip : MonoBehaviour
|
||||
{
|
||||
//manually selectable padding for the background image
|
||||
public int horizontalPadding;
|
||||
public int verticalPadding;
|
||||
|
||||
//tooltip text
|
||||
public Text thisText;
|
||||
|
||||
//horizontal layout of the tooltip
|
||||
public HorizontalLayoutGroup hlG;
|
||||
|
||||
//tooltip background image
|
||||
public RectTransform bgImage;
|
||||
Image bgImageSource;
|
||||
|
||||
//needed as the layout refreshes only on the first Update() call
|
||||
bool firstUpdate;
|
||||
|
||||
//if the tooltip is inside a UI element
|
||||
bool inside;
|
||||
|
||||
//size of the tooltip, needed to track if out of screen
|
||||
// public float width;
|
||||
// public float height;
|
||||
|
||||
//detect canvas mode so to apply different behaviors to different canvas modes, currently only RenderMode.ScreenSpaceCamera implemented
|
||||
//int canvasMode;
|
||||
RenderMode GUIMode;
|
||||
|
||||
//the scene GUI camera
|
||||
Camera GUICamera;
|
||||
|
||||
//the default tooltip object has the following pivots, so that the offset from the mouse is always proportional to the screen resolution (the y pivot)
|
||||
//Pivot(0.5,-0.5)
|
||||
|
||||
//screen viewport corners for out of screen detection
|
||||
Vector3 lowerLeft;
|
||||
Vector3 upperRight;
|
||||
|
||||
//scale factor of proportionality to the reference resolution (1280x720)
|
||||
float currentYScaleFactor;
|
||||
float currentXScaleFactor;
|
||||
|
||||
//standard X and Y offsets of the new tooltip
|
||||
float defaultYOffset;
|
||||
float defaultXOffset;
|
||||
|
||||
//real on screen sizes of the tooltip object
|
||||
float tooltipRealHeight;
|
||||
float tooltipRealWidth;
|
||||
|
||||
// Use this for initialization
|
||||
void Start()
|
||||
{
|
||||
//in this line you need to change the string in order to get your Camera //TODO MAYBE DO IT FROM THE INSPECTOR
|
||||
GUICamera = GameObject.Find("GUICamera").GetComponent<Camera>();
|
||||
GUIMode = this.transform.parent.parent.GetComponent<Canvas>().renderMode;
|
||||
|
||||
bgImageSource = bgImage.GetComponent<Image>();
|
||||
|
||||
//at start the pointer is never to be considered over and UI element
|
||||
inside = false;
|
||||
|
||||
//assign the tooltip to the singleton GUI class manager for fast access
|
||||
//TacticalGUIManager.tgm.mmttp = this;
|
||||
|
||||
//hide the tooltip
|
||||
HideTooltipVisibility();
|
||||
this.transform.parent.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
|
||||
//single string input tooltip
|
||||
public void SetTooltip(string text)
|
||||
{
|
||||
NewTooltip();
|
||||
|
||||
//init tooltip string
|
||||
thisText.text = text;
|
||||
|
||||
//call the position function
|
||||
OnScreenSpaceCamera();
|
||||
}
|
||||
|
||||
|
||||
//multi string/line input tooltip (each string of the input array is a new line)
|
||||
public void SetTooltip(string[] texts)
|
||||
{
|
||||
NewTooltip();
|
||||
|
||||
//build up the tooltip line after line with the input
|
||||
string tooltipText = "";
|
||||
int index = 0;
|
||||
foreach (string newLine in texts)
|
||||
{
|
||||
if (index == 0)
|
||||
{
|
||||
tooltipText += newLine;
|
||||
}
|
||||
else
|
||||
{
|
||||
tooltipText += ("\n" + newLine);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
//init tooltip string
|
||||
thisText.text = tooltipText;
|
||||
|
||||
//call the position function
|
||||
OnScreenSpaceCamera();
|
||||
}
|
||||
|
||||
//temporary call to not mess up old code, will be removed
|
||||
public void SetTooltip(string text, bool test)
|
||||
{
|
||||
NewTooltip();
|
||||
|
||||
//init tooltip string
|
||||
thisText.text = text;
|
||||
|
||||
//call the position function
|
||||
OnScreenSpaceCamera();
|
||||
}
|
||||
|
||||
|
||||
//position function, currently not working correctly due to the use of pivots and not manual offsets, soon to be fixed
|
||||
public void OnScreenSpaceCamera()
|
||||
{
|
||||
//get the dynamic position of the pos in viewport coordinates
|
||||
Vector3 newPos = GUICamera.ScreenToViewportPoint(UIExtensionsInputManager.MousePosition);
|
||||
|
||||
// store in val the updated position (x or y) of the tooltip edge of interest
|
||||
float val;
|
||||
|
||||
//store the new offset to impose in case of out of screen
|
||||
float yOffSet = 0f;
|
||||
float xOffSet = 0f;
|
||||
|
||||
//check for right edge of screen
|
||||
//obtain the x coordinate of the right edge of the tooltip
|
||||
val = ((GUICamera.ViewportToScreenPoint(newPos).x) + (tooltipRealWidth * bgImage.pivot.x));
|
||||
|
||||
//evaluate if the right edge of the tooltip goes out of screen
|
||||
if (val > (upperRight.x))
|
||||
{
|
||||
float distFromRight = upperRight.x - val;
|
||||
|
||||
if (distFromRight > (defaultXOffset * 0.75))
|
||||
{
|
||||
//shorten the temporary offset up to a certain distance from the tooltip
|
||||
xOffSet = distFromRight;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if the distance becomes too short flip the tooltip to below the pointer (by offset+twice the height of the tooltip)
|
||||
xOffSet = ((defaultXOffset) - (tooltipRealWidth) * 2f);
|
||||
}
|
||||
|
||||
//assign the new modified coordinates to the tooltip and convert to screen coordinates
|
||||
Vector3 newTooltipPos = new Vector3(GUICamera.ViewportToScreenPoint(newPos).x + xOffSet, 0f, 0f);
|
||||
|
||||
newPos.x = GUICamera.ScreenToViewportPoint(newTooltipPos).x;
|
||||
}
|
||||
|
||||
//check for left edge of screen
|
||||
//obtain the x coordinate of the left edge of the tooltip
|
||||
val = ((GUICamera.ViewportToScreenPoint(newPos).x) - (tooltipRealWidth * bgImage.pivot.x));
|
||||
|
||||
//evaluate if the left edge of the tooltip goes out of screen
|
||||
if (val < (lowerLeft.x))
|
||||
{
|
||||
float distFromLeft = lowerLeft.x - val;
|
||||
|
||||
if (distFromLeft < (defaultXOffset * 0.75 - tooltipRealWidth))
|
||||
{
|
||||
//shorten the temporary offset up to a certain distance from the tooltip
|
||||
xOffSet = -distFromLeft;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if the distance becomes too short flip the tooltip to above the pointer (by twice the height of the tooltip)
|
||||
xOffSet = ((tooltipRealWidth) * 2f);
|
||||
}
|
||||
|
||||
//assign the new modified coordinates to the tooltip and convert to screen coordinates
|
||||
Vector3 newTooltipPos = new Vector3(GUICamera.ViewportToScreenPoint(newPos).x - xOffSet, 0f, 0f);
|
||||
|
||||
newPos.x = GUICamera.ScreenToViewportPoint(newTooltipPos).x;
|
||||
}
|
||||
|
||||
//check for upper edge of the screen
|
||||
//obtain the y coordinate of the upper edge of the tooltip
|
||||
val = ((GUICamera.ViewportToScreenPoint(newPos).y) - ((bgImage.sizeDelta.y * currentYScaleFactor * (bgImage.pivot.y)) - (tooltipRealHeight)));
|
||||
//evaluate if the upper edge of the tooltip goes out of screen
|
||||
if (val > (upperRight.y))
|
||||
{
|
||||
float distFromUpper = upperRight.y - val;
|
||||
yOffSet = (bgImage.sizeDelta.y * currentYScaleFactor * (bgImage.pivot.y));
|
||||
|
||||
if (distFromUpper > (defaultYOffset * 0.75))
|
||||
{
|
||||
//shorten the temporary offset up to a certain distance from the tooltip
|
||||
yOffSet = distFromUpper;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if the distance becomes too short flip the tooltip to below the pointer (by offset+twice the height of the tooltip)
|
||||
yOffSet = ((defaultYOffset) - (tooltipRealHeight) * 2f);
|
||||
}
|
||||
|
||||
//assign the new modified coordinates to the tooltip and convert to screen coordinates
|
||||
Vector3 newTooltipPos = new Vector3(newPos.x, GUICamera.ViewportToScreenPoint(newPos).y + yOffSet, 0f);
|
||||
newPos.y = GUICamera.ScreenToViewportPoint(newTooltipPos).y;
|
||||
}
|
||||
|
||||
//check for lower edge of the screen
|
||||
//obtain the y coordinate of the lower edge of the tooltip
|
||||
val = ((GUICamera.ViewportToScreenPoint(newPos).y) - ((bgImage.sizeDelta.y * currentYScaleFactor * (bgImage.pivot.y))));
|
||||
|
||||
//evaluate if the upper edge of the tooltip goes out of screen
|
||||
if (val < (lowerLeft.y))
|
||||
{
|
||||
float distFromLower = lowerLeft.y - val;
|
||||
yOffSet = (bgImage.sizeDelta.y * currentYScaleFactor * (bgImage.pivot.y));
|
||||
|
||||
if (distFromLower < (defaultYOffset * 0.75 - tooltipRealHeight))
|
||||
{
|
||||
//shorten the temporary offset up to a certain distance from the tooltip
|
||||
yOffSet = distFromLower;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if the distance becomes too short flip the tooltip to above the pointer (by twice the height of the tooltip)
|
||||
yOffSet = ((tooltipRealHeight) * 2f);
|
||||
}
|
||||
|
||||
//assign the new modified coordinates to the tooltip and convert to screen coordinates
|
||||
Vector3 newTooltipPos = new Vector3(newPos.x, GUICamera.ViewportToScreenPoint(newPos).y + yOffSet, 0f);
|
||||
newPos.y = GUICamera.ScreenToViewportPoint(newTooltipPos).y;
|
||||
}
|
||||
|
||||
this.transform.parent.transform.position = new Vector3(GUICamera.ViewportToWorldPoint(newPos).x, GUICamera.ViewportToWorldPoint(newPos).y, 0f);
|
||||
this.transform.parent.gameObject.SetActive(true);
|
||||
inside = true;
|
||||
}
|
||||
|
||||
//call to hide tooltip when hovering out from the object
|
||||
public void HideTooltip()
|
||||
{
|
||||
if (GUIMode == RenderMode.ScreenSpaceCamera)
|
||||
{
|
||||
if (this != null)
|
||||
{
|
||||
this.transform.parent.gameObject.SetActive(false);
|
||||
inside = false;
|
||||
HideTooltipVisibility();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
LayoutInit();
|
||||
if (inside)
|
||||
{
|
||||
if (GUIMode == RenderMode.ScreenSpaceCamera)
|
||||
{
|
||||
OnScreenSpaceCamera();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//this function is used in order to setup the size of the tooltip by cheating on the HorizontalLayoutBehavior. The resize is done in the first update.
|
||||
void LayoutInit()
|
||||
{
|
||||
if (firstUpdate)
|
||||
{
|
||||
firstUpdate = false;
|
||||
|
||||
bgImage.sizeDelta = new Vector2(hlG.preferredWidth + horizontalPadding, hlG.preferredHeight + verticalPadding);
|
||||
|
||||
defaultYOffset = (bgImage.sizeDelta.y * currentYScaleFactor * (bgImage.pivot.y));
|
||||
defaultXOffset = (bgImage.sizeDelta.x * currentXScaleFactor * (bgImage.pivot.x));
|
||||
|
||||
tooltipRealHeight = bgImage.sizeDelta.y * currentYScaleFactor;
|
||||
tooltipRealWidth = bgImage.sizeDelta.x * currentXScaleFactor;
|
||||
|
||||
ActivateTooltipVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
//init basic variables on a new tooltip set
|
||||
void NewTooltip()
|
||||
{
|
||||
firstUpdate = true;
|
||||
|
||||
lowerLeft = GUICamera.ViewportToScreenPoint(new Vector3(0.0f, 0.0f, 0.0f));
|
||||
upperRight = GUICamera.ViewportToScreenPoint(new Vector3(1.0f, 1.0f, 0.0f));
|
||||
|
||||
currentYScaleFactor = Screen.height / this.transform.root.GetComponent<CanvasScaler>().referenceResolution.y;
|
||||
currentXScaleFactor = Screen.width / this.transform.root.GetComponent<CanvasScaler>().referenceResolution.x;
|
||||
|
||||
}
|
||||
|
||||
//used to visualize the tooltip one update call after it has been built (to avoid flickers)
|
||||
public void ActivateTooltipVisibility()
|
||||
{
|
||||
Color textColor = thisText.color;
|
||||
thisText.color = new Color(textColor.r, textColor.g, textColor.b, 1f);
|
||||
bgImageSource.color = new Color(bgImageSource.color.r, bgImageSource.color.g, bgImageSource.color.b, 0.8f);
|
||||
}
|
||||
|
||||
//used to hide the tooltip so that it can be made visible one update call after it has been built (to avoid flickers)
|
||||
public void HideTooltipVisibility()
|
||||
{
|
||||
Color textColor = thisText.color;
|
||||
thisText.color = new Color(textColor.r, textColor.g, textColor.b, 0f);
|
||||
bgImageSource.color = new Color(bgImageSource.color.r, bgImageSource.color.g, bgImageSource.color.b, 0f);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 87cd933870c6506418344281b3cb86fc
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
@ -0,0 +1,320 @@
|
||||
/// Credit drHogan
|
||||
/// Sourced from - http://forum.unity3d.com/threads/screenspace-camera-tooltip-controller-sweat-and-tears.293991/#post-1938929
|
||||
/// updated simonDarksideJ - refactored code to be more performant.
|
||||
/// updated lucasvinbr - mixed with BoundTooltip, should work with Screenspace Camera (non-rotated) and Overlay
|
||||
/// *Note - only works for non-rotated Screenspace Camera and Screenspace Overlay canvases at present, needs updating to include rotated Screenspace Camera and Worldspace!
|
||||
|
||||
//ToolTip is written by Emiliano Pastorelli, H&R Tallinn (Estonia), http://www.hammerandravens.com
|
||||
//Copyright (c) 2015 Emiliano Pastorelli, H&R - Hammer&Ravens, Tallinn, Estonia.
|
||||
//All rights reserved.
|
||||
|
||||
//Redistribution and use in source and binary forms are permitted
|
||||
//provided that the above copyright notice and this paragraph are
|
||||
//duplicated in all such forms and that any documentation,
|
||||
//advertising materials, and other materials related to such
|
||||
//distribution and use acknowledge that the software was developed
|
||||
//by H&R, Hammer&Ravens. The name of the
|
||||
//H&R, Hammer&Ravens may not be used to endorse or promote products derived
|
||||
//from this software without specific prior written permission.
|
||||
//THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
||||
//IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
//WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
namespace UnityEngine.UI.Extensions
|
||||
{
|
||||
[RequireComponent(typeof(RectTransform))]
|
||||
[AddComponentMenu("UI/Extensions/Tooltip/Tooltip")]
|
||||
public class ToolTip : MonoBehaviour
|
||||
{
|
||||
//text of the tooltip
|
||||
private Text _text;
|
||||
private RectTransform _rectTransform, canvasRectTransform;
|
||||
|
||||
[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")]
|
||||
public Canvas canvas;
|
||||
|
||||
[Tooltip("Sets if tooltip triggers will run ForceUpdateCanvases and refresh the tooltip's layout group " +
|
||||
"(if any) when hovered, in order to prevent momentousness misplacement sometimes caused by ContentSizeFitters")]
|
||||
public bool tooltipTriggersCanForceCanvasUpdate = false;
|
||||
|
||||
/// <summary>
|
||||
/// the tooltip's Layout Group, if any
|
||||
/// </summary>
|
||||
private LayoutGroup _layoutGroup;
|
||||
|
||||
//if the tooltip is inside a UI element
|
||||
private bool _inside;
|
||||
|
||||
private float width, height;//, canvasWidth, canvasHeight;
|
||||
|
||||
public float YShift,xShift;
|
||||
|
||||
[HideInInspector]
|
||||
public RenderMode guiMode;
|
||||
|
||||
private Camera _guiCamera;
|
||||
|
||||
public Camera GuiCamera
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_guiCamera) {
|
||||
_guiCamera = Camera.main;
|
||||
}
|
||||
|
||||
return _guiCamera;
|
||||
}
|
||||
}
|
||||
|
||||
private Vector3 screenLowerLeft, screenUpperRight, shiftingVector;
|
||||
|
||||
/// <summary>
|
||||
/// a screen-space point where the tooltip would be placed before applying X and Y shifts and border checks
|
||||
/// </summary>
|
||||
private Vector3 baseTooltipPos;
|
||||
|
||||
private Vector3 newTTPos;
|
||||
private Vector3 adjustedNewTTPos;
|
||||
private Vector3 adjustedTTLocalPos;
|
||||
private Vector3 shifterForBorders;
|
||||
|
||||
private float borderTest;
|
||||
|
||||
// Standard Singleton Access
|
||||
private static ToolTip instance;
|
||||
|
||||
public static ToolTip Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
instance = FindObjectOfType<ToolTip>();
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Reset() {
|
||||
canvas = GetComponentInParent<Canvas>();
|
||||
canvas = canvas.rootCanvas;
|
||||
}
|
||||
|
||||
// Use this for initialization
|
||||
public void Awake()
|
||||
{
|
||||
instance = this;
|
||||
if (!canvas) {
|
||||
canvas = GetComponentInParent<Canvas>();
|
||||
canvas = canvas.rootCanvas;
|
||||
}
|
||||
|
||||
_guiCamera = canvas.worldCamera;
|
||||
guiMode = canvas.renderMode;
|
||||
_rectTransform = GetComponent<RectTransform>();
|
||||
canvasRectTransform = canvas.GetComponent<RectTransform>();
|
||||
_layoutGroup = GetComponentInChildren<LayoutGroup>();
|
||||
|
||||
_text = GetComponentInChildren<Text>();
|
||||
|
||||
_inside = false;
|
||||
|
||||
this.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public void SetTooltip(string ttext)
|
||||
{
|
||||
SetTooltip(ttext, transform.position);
|
||||
}
|
||||
|
||||
//Call this function externally to set the text of the template and activate the tooltip
|
||||
public void SetTooltip(string ttext, Vector3 basePos, bool refreshCanvasesBeforeGetSize = false)
|
||||
{
|
||||
|
||||
baseTooltipPos = basePos;
|
||||
|
||||
//set the text
|
||||
if (_text) {
|
||||
_text.text = ttext;
|
||||
}
|
||||
else {
|
||||
Debug.LogWarning("[ToolTip] Couldn't set tooltip text, tooltip has no child Text component");
|
||||
}
|
||||
|
||||
ContextualTooltipUpdate(refreshCanvasesBeforeGetSize);
|
||||
|
||||
}
|
||||
|
||||
//call this function on mouse exit to deactivate the template
|
||||
public void HideTooltip()
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
_inside = false;
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (_inside)
|
||||
{
|
||||
ContextualTooltipUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// forces rebuilding of Canvases in order to update the tooltip's content size fitting.
|
||||
/// Can prevent the tooltip from being visibly misplaced for one frame when being resized.
|
||||
/// Only runs if tooltipTriggersCanForceCanvasUpdate is true
|
||||
/// </summary>
|
||||
public void RefreshTooltipSize() {
|
||||
if (tooltipTriggersCanForceCanvasUpdate) {
|
||||
Canvas.ForceUpdateCanvases();
|
||||
|
||||
if (_layoutGroup) {
|
||||
_layoutGroup.enabled = false;
|
||||
_layoutGroup.enabled = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs the appropriate tooltip placement method, according to the parent canvas's render mode
|
||||
/// </summary>
|
||||
/// <param name="refreshCanvasesBeforeGettingSize"></param>
|
||||
public void ContextualTooltipUpdate(bool refreshCanvasesBeforeGettingSize = false) {
|
||||
switch (guiMode) {
|
||||
case RenderMode.ScreenSpaceCamera:
|
||||
OnScreenSpaceCamera(refreshCanvasesBeforeGettingSize);
|
||||
break;
|
||||
case RenderMode.ScreenSpaceOverlay:
|
||||
OnScreenSpaceOverlay(refreshCanvasesBeforeGettingSize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//main tooltip edge of screen guard and movement - camera
|
||||
public void OnScreenSpaceCamera(bool refreshCanvasesBeforeGettingSize = false)
|
||||
{
|
||||
shiftingVector.x = xShift;
|
||||
shiftingVector.y = YShift;
|
||||
|
||||
baseTooltipPos.z = canvas.planeDistance;
|
||||
|
||||
newTTPos = GuiCamera.ScreenToViewportPoint(baseTooltipPos - shiftingVector);
|
||||
adjustedNewTTPos = GuiCamera.ViewportToWorldPoint(newTTPos);
|
||||
|
||||
gameObject.SetActive(true);
|
||||
|
||||
if (refreshCanvasesBeforeGettingSize) RefreshTooltipSize();
|
||||
|
||||
//consider scaled dimensions when comparing against the edges
|
||||
width = transform.lossyScale.x * _rectTransform.sizeDelta[0];
|
||||
height = transform.lossyScale.y * _rectTransform.sizeDelta[1];
|
||||
|
||||
// check and solve problems for the tooltip that goes out of the screen on the horizontal axis
|
||||
|
||||
RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform, Vector2.zero, GuiCamera, out screenLowerLeft);
|
||||
RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform, new Vector2(Screen.width, Screen.height), GuiCamera, out screenUpperRight);
|
||||
|
||||
|
||||
//check for right edge of screen
|
||||
borderTest = (adjustedNewTTPos.x + width / 2);
|
||||
if (borderTest > screenUpperRight.x)
|
||||
{
|
||||
shifterForBorders.x = borderTest - screenUpperRight.x;
|
||||
adjustedNewTTPos.x -= shifterForBorders.x;
|
||||
}
|
||||
//check for left edge of screen
|
||||
borderTest = (adjustedNewTTPos.x - width / 2);
|
||||
if (borderTest < screenLowerLeft.x)
|
||||
{
|
||||
shifterForBorders.x = screenLowerLeft.x - borderTest;
|
||||
adjustedNewTTPos.x += shifterForBorders.x;
|
||||
}
|
||||
|
||||
// check and solve problems for the tooltip that goes out of the screen on the vertical axis
|
||||
|
||||
//check for lower edge of the screen
|
||||
borderTest = (adjustedNewTTPos.y - height / 2);
|
||||
if (borderTest < screenLowerLeft.y) {
|
||||
shifterForBorders.y = screenLowerLeft.y - borderTest;
|
||||
adjustedNewTTPos.y += shifterForBorders.y;
|
||||
}
|
||||
|
||||
//check for upper edge of the screen
|
||||
borderTest = (adjustedNewTTPos.y + height / 2);
|
||||
if (borderTest > screenUpperRight.y)
|
||||
{
|
||||
shifterForBorders.y = borderTest - screenUpperRight.y;
|
||||
adjustedNewTTPos.y -= shifterForBorders.y;
|
||||
}
|
||||
|
||||
//failed attempt to circumvent issues caused when rotating the camera
|
||||
adjustedNewTTPos = transform.rotation * adjustedNewTTPos;
|
||||
|
||||
transform.position = adjustedNewTTPos;
|
||||
adjustedTTLocalPos = transform.localPosition;
|
||||
adjustedTTLocalPos.z = 0;
|
||||
transform.localPosition = adjustedTTLocalPos;
|
||||
|
||||
_inside = true;
|
||||
}
|
||||
|
||||
|
||||
//main tooltip edge of screen guard and movement - overlay
|
||||
public void OnScreenSpaceOverlay(bool refreshCanvasesBeforeGettingSize = false) {
|
||||
shiftingVector.x = xShift;
|
||||
shiftingVector.y = YShift;
|
||||
newTTPos = (baseTooltipPos - shiftingVector) / canvas.scaleFactor;
|
||||
adjustedNewTTPos = newTTPos;
|
||||
|
||||
gameObject.SetActive(true);
|
||||
|
||||
if (refreshCanvasesBeforeGettingSize) RefreshTooltipSize();
|
||||
|
||||
width = _rectTransform.sizeDelta[0];
|
||||
height = _rectTransform.sizeDelta[1];
|
||||
|
||||
// check and solve problems for the tooltip that goes out of the screen on the horizontal axis
|
||||
//screen's 0 = overlay canvas's 0 (always?)
|
||||
screenLowerLeft = Vector3.zero;
|
||||
screenUpperRight = canvasRectTransform.sizeDelta;
|
||||
|
||||
//check for right edge of screen
|
||||
borderTest = (newTTPos.x + width / 2);
|
||||
if (borderTest > screenUpperRight.x) {
|
||||
shifterForBorders.x = borderTest - screenUpperRight.x;
|
||||
adjustedNewTTPos.x -= shifterForBorders.x;
|
||||
}
|
||||
//check for left edge of screen
|
||||
borderTest = (adjustedNewTTPos.x - width / 2);
|
||||
if (borderTest < screenLowerLeft.x) {
|
||||
shifterForBorders.x = screenLowerLeft.x - borderTest;
|
||||
adjustedNewTTPos.x += shifterForBorders.x;
|
||||
}
|
||||
|
||||
// check and solve problems for the tooltip that goes out of the screen on the vertical axis
|
||||
|
||||
//check for lower edge of the screen
|
||||
borderTest = (adjustedNewTTPos.y - height / 2);
|
||||
if (borderTest < screenLowerLeft.y) {
|
||||
shifterForBorders.y = screenLowerLeft.y - borderTest;
|
||||
adjustedNewTTPos.y += shifterForBorders.y;
|
||||
}
|
||||
|
||||
//check for upper edge of the screen
|
||||
borderTest = (adjustedNewTTPos.y + height / 2);
|
||||
if (borderTest > screenUpperRight.y) {
|
||||
shifterForBorders.y = borderTest - screenUpperRight.y;
|
||||
adjustedNewTTPos.y -= shifterForBorders.y;
|
||||
}
|
||||
|
||||
//remove scale factor for the actual positioning of the TT
|
||||
adjustedNewTTPos *= canvas.scaleFactor;
|
||||
transform.position = adjustedNewTTPos;
|
||||
|
||||
_inside = true;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8a649d0fc284fb7458094a7a02315f07
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
@ -0,0 +1,108 @@
|
||||
using System.Collections;
|
||||
///Credit Martin Nerurkar // www.martin.nerurkar.de // www.sharkbombs.com
|
||||
///Sourced from - http://www.sharkbombs.com/2015/02/10/tooltips-with-the-new-unity-ui-ugui/
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
namespace UnityEngine.UI.Extensions
|
||||
{
|
||||
[RequireComponent(typeof(RectTransform))]
|
||||
[AddComponentMenu("UI/Extensions/Tooltip/Tooltip Trigger")]
|
||||
public class TooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler
|
||||
{
|
||||
[TextAreaAttribute]
|
||||
public string text;
|
||||
|
||||
public enum TooltipPositioningType {
|
||||
mousePosition,
|
||||
mousePositionAndFollow,
|
||||
transformPosition
|
||||
}
|
||||
|
||||
[Tooltip("Defines where the tooltip will be placed and how that placement will occur. Transform position will always be used if this element wasn't selected via mouse")]
|
||||
public TooltipPositioningType tooltipPositioningType = TooltipPositioningType.mousePosition;
|
||||
|
||||
/// <summary>
|
||||
/// This info is needed to make sure we make the necessary translations if the tooltip and this trigger are children of different space canvases
|
||||
/// </summary>
|
||||
private bool isChildOfOverlayCanvas = false;
|
||||
|
||||
private bool hovered = false;
|
||||
|
||||
public Vector3 offset;
|
||||
|
||||
|
||||
void Start() {
|
||||
//attempt to check if our canvas is overlay or not and check our "is overlay" accordingly
|
||||
Canvas ourCanvas = GetComponentInParent<Canvas>();
|
||||
if (ourCanvas && ourCanvas.renderMode == RenderMode.ScreenSpaceOverlay) {
|
||||
isChildOfOverlayCanvas = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the tooltip and the transform this trigger is attached to are children of differently-spaced Canvases
|
||||
/// </summary>
|
||||
public bool WorldToScreenIsRequired
|
||||
{
|
||||
get
|
||||
{
|
||||
return (isChildOfOverlayCanvas && ToolTip.Instance.guiMode == RenderMode.ScreenSpaceCamera) ||
|
||||
(!isChildOfOverlayCanvas && ToolTip.Instance.guiMode == RenderMode.ScreenSpaceOverlay);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnPointerEnter(PointerEventData eventData)
|
||||
{
|
||||
switch (tooltipPositioningType) {
|
||||
case TooltipPositioningType.mousePosition:
|
||||
StartHover(UIExtensionsInputManager.MousePosition + offset, true);
|
||||
break;
|
||||
case TooltipPositioningType.mousePositionAndFollow:
|
||||
StartHover(UIExtensionsInputManager.MousePosition + offset, true);
|
||||
hovered = true;
|
||||
StartCoroutine(HoveredMouseFollowingLoop());
|
||||
break;
|
||||
case TooltipPositioningType.transformPosition:
|
||||
StartHover((WorldToScreenIsRequired ?
|
||||
ToolTip.Instance.GuiCamera.WorldToScreenPoint(transform.position) :
|
||||
transform.position) + offset, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerator HoveredMouseFollowingLoop() {
|
||||
while (hovered) {
|
||||
StartHover(UIExtensionsInputManager.MousePosition + offset);
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnSelect(BaseEventData eventData)
|
||||
{
|
||||
StartHover((WorldToScreenIsRequired ?
|
||||
ToolTip.Instance.GuiCamera.WorldToScreenPoint(transform.position) :
|
||||
transform.position) + offset, true);
|
||||
}
|
||||
|
||||
public void OnPointerExit(PointerEventData eventData)
|
||||
{
|
||||
StopHover();
|
||||
}
|
||||
|
||||
public void OnDeselect(BaseEventData eventData)
|
||||
{
|
||||
StopHover();
|
||||
}
|
||||
|
||||
void StartHover(Vector3 position, bool shouldCanvasUpdate = false)
|
||||
{
|
||||
ToolTip.Instance.SetTooltip(text, position, shouldCanvasUpdate);
|
||||
}
|
||||
|
||||
void StopHover()
|
||||
{
|
||||
hovered = false;
|
||||
ToolTip.Instance.HideTooltip();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abe02588cca16964c8571b21eefea5d6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user