U4S5L21——TMP_TextUtilities

本章代码关键字

1
2
3
4
5
TMP_TextUtilities.FindIntersectingLink()            //传入点击相关参数,获取点击的超链接索引
textMeshProUGUI.textInfo.linkInfo //文本的超链接数组
textMeshProUGUI.textInfo.linkInfo[] //超链接数组索引器
textMeshProUGUI.textInfo.linkInfo[].GetLinkText() //获取超链接显示文本
textMeshProUGUI.textInfo.linkInfo[].GetLinkID() //获取超链接指向的链接

TMP_TextUtilities

TMP_TextUtilities​ 是 TextMeshPro 中提供的一个实用工具类
包含多个常用方法,主要用于获取指定位置的文本信息
我们主要在点击文本时,利用该类来获取点击到的具体内容

注意!

为了检测准确,TMP_TextUtilities​ 会配合上节课的 TMP_TextEventHandler​ 一起使用
因此需要在想要监听点击的文本上同时添加 TMP_TextEventHandler​ 脚本

TMP_TextUtilities类中的常用API

以下方法的参数基本一致,分别为:

  • 参数一:要查找索引的 TMP 控件
  • 参数二:点击事件的屏幕坐标
  • 参数三:点击事件的摄像机(可不填,将会默认使用 UI 摄像机)

基于以上参数,这些方法最好配合 UGUI 的 IPointerClickHandler​ 接口使用,
使用方法详见:UG3L11——UI事件监听接口

  1. 获取给定位置文本中的具体信息的方法

    • 获取链接索引:int FindIntersectingLink(TMP_Text text, Vector3 position, Camera camera)
    • 获取单词索引:int FindIntersectingWord(TMP_Text text, Vector3 position, Camera camera)
    • 获取单字符索引:int FindIntersectingCharacter(TMP_Text text, Vector3 position, Camera camera)
    • 获取行索引:int FindIntersectingLine(TMP_Text text, Vector3 position, Camera camera)
  2. 获取离给定位置最新的文本中的具体信息的方法

    • 获取链接索引:int FindNearestLink(TMP_Text text, Vector3 position, Camera camera)
    • 获取单词索引:int FindNearestWord(TMP_Text text, Vector3 position, Camera camera)
    • 获取单字符索引:int FindNearestCharacterOnLine (TMP_Text text, Vector3 position, Camera camera)
    • 获取行索引:int FindNearestLine(TMP_Text text, Vector3 position, Camera camera)

更多API可见:Class TMP_TextUtilities | TextMeshPro | 4.0.0-pre.2 (unity3d.com)

上边的方法返回的都是索引值,如果没有获取到信息,返回的索引为 -1
利用获取到的索引可以在 TMP 文本控件中的 textInfo​ 属性中的如下属性来获取信息

  • 行信息:linkInfo

  • 单词信息:wordInfo

  • 字符信息:characterInfo

  • 行信息:lineInfo

  • 超链接信息:linkInfo​(数组,通过索引器获取具体的超链接索引)

    • GetLinkText()​ 获取超链接显示文本
    • GetLinkID()​ 获取超链接指向的链接

使用示例(以超链接为例)

需要通过 IPointerClickHandler​ 接口声明 OnPointerClick​ 方法,
OnPointerClick​ 方法内获取点击的超链接消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class linkClickTest : MonoBehaviour, IPointerClickHandler
{
public TextMeshProUGUI tmpUIText;

public void OnPointerClick(PointerEventData eventData)
{
int index = TMP_TextUtilities.FindIntersectingLink(tmpUIText, eventData.position, null);
// 不为-1即说明找到了超链接信息
if (index != -1)
{
string text = tmpUIText.textInfo.linkInfo[index].GetLinkText();
string linkInfo = tmpUIText.textInfo.linkInfo[index].GetLinkID();
print($"linkInfo: {linkInfo}, text: {text}");
}
}
}

imageimage

依次点击得到输出:

image