U4S5L20——TMP_TextEventHandler

本章代码关键字

1
2
3
4
5
6
​TMP_TextEventHandler​                        //监听并响应TMP文本中的特定区域或标签的点击和鼠标悬停事件
tmp_TextEventHandler.onLinkSelection //当用户悬停超链接时触发的事件
tmp_TextEventHandler.onCharacterSelection //当用户悬停超链接时触发的事件
tmp_TextEventHandler.onWordSelection //当用户悬停某个单词时触发的事件
tmp_TextEventHandler.onLineSelection //当用户悬停某一行文本时触发的事件
tmp_TextEventHandler.onSpriteSelection //当用户悬停某一精灵图片时触发的事件

TMP_TextEventHandler

TMP_TextEventHandler​ 是 TextMeshPro 中提供的一个交互工具类,主要用于处理用户和TMP文本之间的交互事件
主要作用是监听并响应 TMP 文本中的特定区域或标签(如链接 <link>​ 和特定字符)的点击和鼠标悬停事件
这个类可以让你对文本的某些部分进行交互式操作,适用于创建如 超链接、工具提示、弹出信息 等效果

TMP_TextEventHandler类的使用

TMP_TextEventHandler​ 是一个继承 MonoBehaviour​ 的类,它挂载在TMP控件对象下即可工作

它拥有以下的 UnityEvent​ 事件:

  • 链接:onLinkSelection​ —— 当用户悬停超链接时触发
  • 字符:onCharacterSelection​ —— 当用户悬停某个字符时触发
  • 单词:onWordSelection​ —— 当用户悬停某个单词时触发
  • 行:onLineSelection​ —— 当用户悬停某一行文本时触发
  • 精灵图片:onSpriteSelection​ —— 当用户悬停某一精灵图片时触发

image

以上的 UnityEvent​ 事件都可以在 Inspector 面板上去直接添加某个脚本上的事件

image

超链接悬停事件

onLinkSelection​ 会在鼠标悬停在超链接上时触发,它需要如下参数的监听函数:

  1. 参数一:触发事件的超链接指向的链接内容(即 <link="">​ 内的内容)
  2. 参数二:触发事件的超链接的显示的文本内容(即 <link></link>​ 之间的内容)
  3. 参数三:触发事件的超链接在文本中的索引

示例:

1
2
3
4
5
6
7
8
9
10
11
public TMP_TextEventHandler tmp_TextEventHandler;

void Start()
{
tmp_TextEventHandler.onLinkSelection.AddListener(LinkSelectionHander);
}

public void LinkSelectionHander(string linkInfo, string text, int index)
{
Debug.Log($"linkInfo: {linkInfo}, text: {text}, index: {index}");
}

imageimage

依次悬停在两个超链接文字上的输出内容:

image

字符悬停事件

onCharacterSelection​ 会在鼠标悬停在文本上的某个字符时触发,它需要如下参数的监听函数:

  1. 参数一:触发悬停事件的字符
  2. 参数二:悬停的字符在文本中的索引

示例:

1
2
3
4
5
6
7
8
9
10
11
public TMP_TextEventHandler tmp_TextEventHandler;

void Start()
{
tmp_TextEventHandler.onCharacterSelection.AddListener(CharSelectionHandler);
}

public void CharSelectionHandler(char charInfo, int index)
{
Debug.Log($"charInfo: {charInfo}, index: {index}");
}

imageimage

输出内容:

image

单词悬停事件

注意,这里的单词划分是依据空格、换行以及部分符号决定的,因此对于中文文本来说,通过该方法获取单词效果不佳!

onWordSelection​ 会在鼠标悬停在文本上的某个单词时触发,它需要如下参数的监听函数:

  1. 参数一:触发事件的单词内容
  2. 参数二:单词首个字符在文本中的索引
  3. 参数三:单词长度

示例:

1
2
3
4
5
6
7
8
9
10
11
public TMP_TextEventHandler tmp_TextEventHandler;

void Start()
{
tmp_TextEventHandler.onWordSelection.AddListener(WordSelectionHander);
}

public void WordSelectionHander(string wordText, int index, int wordLength)
{
Debug.Log($"wordText: {wordText}, index: {index}, wordLength: {wordLength}");
}

imageimage

输出内容:

image

行悬停事件

onLineSelection​ 会在鼠标悬停在文本上的某行时触发,它需要如下参数的监听函数:

  1. 参数一:触发事件的行内容
  2. 参数二:行的首个字符在文本中的索引
  3. 参数三:行的长度

示例:

1
2
3
4
5
6
7
8
9
10
11
public TMP_TextEventHandler tmp_TextEventHandler;

void Start()
{
tmp_TextEventHandler.onLineSelection.AddListener(LineSelectionHandler);
}

public void LineSelectionHandler(string lineText, int index, int lineLength)
{
Debug.Log($"lineText: {lineText}, index: {index}, lineLength: {lineLength}");
}

imageimage

输出内容:

image

图片悬停事件

onSpriteSelection​ 会在鼠标悬停在文本上的某行时触发,它需要如下参数的监听函数:

  1. 参数一:触发事件的图片的字符(此字符可能无法直接输出)
  2. 参数二:图片在文本中的索引

示例:

1
2
3
4
5
6
7
8
9
10
11
public TMP_TextEventHandler tmp_TextEventHandler;

void Start()
{
tmp_TextEventHandler.onSpriteSelection.AddListener(SpriteSelectionHandler);
}

public void SpriteSelectionHandler(char spriteInfo, int index)
{
Debug.Log($"spriteChar: {spriteInfo}, spriteCharNum: {(int)spriteInfo}, index: {index}");
}

imageimage

输出内容:

image