转载自:
unity 背包tips 动态增加icon 根据内容背景缩放_落水无痕的博客-CSDN博客
下载:Unity文字提示,弹出提示,自适应提示内容-其它文档类资源-CSDN下载
制作思路,使用Layout Element布局 ,icon与标题横向布局,再与具体内容纵向布局
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
/// <summary>
/// 通用提示框
/// </summary>
public class ToolTipsItem : MonoBehaviour, IPointerEnterHandler,IPointerExitHandler
{
public string m_BiaoTi = string.Empty;
[SerializeField, TextArea(3, 10)]
public string m_NeiRong = string.Empty;
public bool TakeFromImage;
public Sprite m_Icon = null;
public void OnPointerEnter(PointerEventData eventData)
{
ToolTips.Instance.ShowToolTip(true, m_Icon, m_BiaoTi, m_NeiRong);
}
public void OnPointerExit(PointerEventData eventData)
{
ToolTips.Instance.ShowToolTip(false);
}
}
//对tips文字修改,icon显示,具体实现
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
public class ToolTips : MonoBehaviour
{
[Header("Main")]
[SerializeField] private RectTransform m_Rect = null;
[SerializeField] private Text m_BiaotiText = null;
[SerializeField] private Text m_NeirongText = null;
[SerializeField] private Image m_image = null;
[Space(5)]
public References m_References;
private bool m_Show = false;
private UTTPlaceH H;
private UTTPlaceV V;
private Vector2 ContentPosition;
private Vector2 currentPivot;
GameObject m_Border;
private static ToolTips instance;
public static ToolTips Instance
{
get
{
if (instance == null)
instance = FindObjectOfType<ToolTips>();
return instance;
}
}
void Awake()
{
instance = this;
m_Border = transform.Find("Content").gameObject;
m_Border.SetActive(false);
}
void Update()
{
if (!m_Show)
return;
m_Rect.position = GetMouseRectPosition();
//Debug.LogError("position" + m_Rect.position);
AnchorPosition();
LerpPosition();
}
/// <summary>
/// 显示tips
/// </summary>
/// <param name="b">是否显示tips</param>
/// <param name="s">icon贴图</param>
/// <param name="biaoti">标题名</param>
/// <param name="neirong">主内容</param>
public void ShowToolTip(bool b, Sprite s = null, string biaoti = "", string neirong = "")
{
AnchorPosition();
LerpPosition();
m_Show = b;
CacheSprite = s;
biaotiText = biaoti;
neirongText = neirong;
if (b)
{
m_Border.SetActive(true);
//Invoke("ToolTip", wait);
ToolTip();
}
else
{
m_Border.SetActive(false);
m_Show = b;
}
}
private Sprite CacheSprite;
private string biaotiText;
private string neirongText;
void ToolTip()
{
m_BiaotiText.text = biaotiText;
m_NeirongText.text = neirongText;
if (CacheSprite!=null)
{
m_image.gameObject.SetActive(true);
m_image.sprite = CacheSprite;
}
else
{
m_image.gameObject.SetActive(false);
}
// LayoutElement[] element = GetComponentsInChildren<LayoutElement>();
// if (element.Length > 1)
// {
// for (int i = 0; i < element.Length; i++)
// {
// element[i].CalculateLayoutInputVertical();
// element[i].CalculateLayoutInputHorizontal();
// }
// }
// m_References.ContentLayout.CalculateLayoutInputVertical();
}
void LerpPosition()
{
m_Rect.GetChild(0).GetComponent<RectTransform>().pivot = currentPivot;
m_Rect.GetChild(0).GetComponent<RectTransform>().anchoredPosition = ContentPosition;
}
//位置更新
void AnchorPosition()
{
Vector3 v = GetMouseRectPosition();
if (v.x <= (Screen.width *0.5f))
{
H = UTTPlaceH.Left;
}
else
{
H = UTTPlaceH.Right;
}
if (v.y > (Screen.height*0.5f))
{
V = UTTPlaceV.Top;
}
else
{
V = UTTPlaceV.Botton;
}
if (V == UTTPlaceV.Top && H == UTTPlaceH.Left)
{
m_References.ToolTipBg.sprite = m_References.LeftTopBg;
SetPivot(0, 1);
}
else if (V == UTTPlaceV.Top && H == UTTPlaceH.Right)
{
m_References.ToolTipBg.sprite = m_References.RightTopBg;
SetPivot(1, 1);
}
else if (V == UTTPlaceV.Botton && H == UTTPlaceH.Left)
{
m_References.ToolTipBg.sprite = m_References.LeftBottonBg;
SetPivot(0, 0);
}
else if (V == UTTPlaceV.Botton && H == UTTPlaceH.Right)
{
m_References.ToolTipBg.sprite = m_References.RightBottonBg;
SetPivot(1, 0);
}
}
/// <summary>
/// 相对偏移量 (手指触碰时不挡住)
/// </summary>
/// <param name="x">当前所在x方向</param>
/// <param name="y">当前所在y方向</param>
void SetPivot(float x, float y)
{
currentPivot = new Vector2(x, y);
float fiy = (y > 0.5f) ? -120 : 120;
float fix = (x > 0.5f) ? -30 : 30;
ContentPosition = new Vector2(fix, fiy);
}
/// <summary>
/// 获取当前点击位置
/// </summary>
/// <returns></returns>
public Vector3 GetMouseRectPosition()
{
Canvas _Canvas = transform.parent.GetComponent<Canvas>();
Camera _Cam = Camera.main;
Vector3 Return = Vector3.zero;
if (_Canvas.renderMode == RenderMode.ScreenSpaceOverlay)
{
Vector3 mousePos = Input.mousePosition;
Return = mousePos;
}
else if (_Canvas.renderMode == RenderMode.ScreenSpaceCamera)
{
Vector2 tempVector = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(_Canvas.transform as RectTransform, Input.mousePosition, _Cam, out tempVector);
Vector3 point = _Canvas.transform.TransformPoint(tempVector);
Return = point;
}
return Return;
}
[System.Serializable]
public class References
{
public LayoutElement ContentLayout; //布局节点
public Image ToolTipBg = null; //tips背景节点
public Sprite LeftTopBg; //tips4个方向的背景图
public Sprite LeftBottonBg;
public Sprite RightTopBg;
public Sprite RightBottonBg;
}
[System.Serializable]
public enum UTTPlaceV
{
Top,
Botton,
}
[System.Serializable]
public enum UTTPlaceH
{
Left,
Right,
}
}