在使用UGUI搭建UI界面时,有时需要对现有的文本内容(Text)添加下划线。
如果使用文本插件Text Mesh Pro,可以在Inspector界面直接设置。
也可以自己编写代码来生成简单的下划线。
不多说,上代码,具体思路参考代码的注释。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TextUnderLine : MonoBehaviour
{
//目标文本组件
public Text targetText;
// Start is called before the first frame update
private void Start()
{
//创建下划线
CreatUnderLine();
}
//方法,创建下划线
private void CreatUnderLine()
{
//空引用直接返回
if (targetText == null) return;
//复制目标文本的属性
Text underlineText = Instantiate(targetText) as Text;
//设置下划线的父物体
underlineText.transform.SetParent(targetText.transform);
//获取RectTransform组件
RectTransform underlineRT = underlineText.rectTransform;
//设置下划线的位置
underlineRT.anchoredPosition3D = Vector3.zero;
underlineRT.anchorMax = Vector2.one;
underlineRT.anchorMin = Vector2.zero;
underlineRT.offsetMax = Vector2.zero;
underlineRT.offsetMin = Vector2.zero;
//设置下划线的缩放
underlineRT.transform.localScale = Vector3.one;
//设置下划线文本的初始值
underlineText.text = "_";
//单个下划线宽度
float singleUnderlineWidth = underlineText.preferredWidth;
//文本总宽度
float targetTextWidth = targetText.preferredWidth;
//计算需要多少个“_”字符
int underlineCount = Mathf.RoundToInt(targetTextWidth / singleUnderlineWidth);
//添加“_”字符
for (int i = 0; i < underlineCount; i++)
{
underlineText.text += "_";
}
}
}
完成的效果如下:
注意事项
上面代码实现简单,但有局限性和不足之处:
1.该代码只适合为确定的文本添加下划线,如果在程序运行过程中,文本内容实时变动,此代码不适用。后续我会继续研究实现动态更新下划线的方法。
2. 如果要为文本组件TextA添加下划线,切记,脚本TextUnderLine一定不要添加到TextA游戏物体上,因为这样会造成逻辑上的死循环,创建出无数个下划线子物体。