【效果】
用于解决文本显示地方有限的问题,当光标移到该文本控件上,额外悬浮显示全部文本内容。
【解决方案】
思路:额外增加一个通用的带背景内容显示面板,通过光标的停留来选定需要特殊显示的对象,然后控制显示和赋值内容面板,内容面板背景可随文字数量变大变小。
步骤:
1、增加一个Image对象,以及增加一个Text作为其子对象。
2、给Text对象添加ContentSizeFitter组件。用于设置水平或垂直内容的自动调整
3、给Image对象也添加ContentSizeFitter组件,并增加VerticalLayoutGroup组件用于自动调节背景的大小。
?4、然后就是给需要特别显示内容的文本对象 写一个控制内容显示面板的脚本,后面其他有需要的对象,只需要将这个脚本直接绑上去就可以了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ZoomInShow : MonoBehaviour
{
//当前文本对象
private RectTransform rect;
private Text rect_txt;
//额外的内容显示面板(带背景)
private Transform objImage;
private Text content;
//用于update里单次进出
private bool isEnter;
void Awake()
{
rect = transform.GetComponent<RectTransform>();
rect_txt = transform.GetComponent<Text>();
objImage = transform.Find("/Canvas/ObjImage");
content = objImage.GetChild(0).GetComponent<Text>();
}
void Update()
{
//判断鼠标是否悬浮在该UI上
if (RectTransformUtility.RectangleContainsScreenPoint(rect, Input.mousePosition) && !isEnter)
{
print("进入");
isEnter = true;
//光标停留延时显示内容面板
Invoke("ShowContentPanel", 0.2f);
}
if (RectTransformUtility.RectangleContainsScreenPoint(rect, Input.mousePosition) == false && isEnter == true)
{
print("移出");
isEnter = false;
objImage.gameObject.SetActive(false);
}
}
/// <summary>
/// 显示内容面板
/// </summary>
void ShowContentPanel()
{
if (RectTransformUtility.RectangleContainsScreenPoint(rect, Input.mousePosition))
{
//显示内容面板,设置面板位置,赋值文本内容
objImage.gameObject.SetActive(true);
objImage.localPosition = rect.localPosition;
content.text = rect_txt.text;
//更新背景大小
LayoutRebuilder.ForceRebuildLayoutImmediate(content.rectTransform);
LayoutRebuilder.ForceRebuildLayoutImmediate(content.transform.parent.transform as RectTransform);
}
}
}
|