Unity中如何实现富文本可点击并检测点击事件?
用TextMeshPro-Text(UI)实现富文本可点击词汇及弹窗触发
1. 给可点击词汇添加富文本标签
在TextMeshPro组件的文本输入框中,使用<link>标签标记需要点击的内容,自定义ID区分不同目标:
By clicking, you agree to our <link="protocol">Platform Protocol</link> and <link="privacy">Privacy Policy</link>
protocol、privacy是自定义的链接标识,后续用来判断点击的是哪个词汇。
2. 编写点击检测脚本
创建名为TMP_LinkClickHandler的C#脚本,挂载到TextMeshPro-Text(UI)所在的游戏对象上,代码如下:
using UnityEngine; using UnityEngine.EventSystems; using TMPro; public class TMP_LinkClickHandler : MonoBehaviour, IPointerClickHandler { private TMP_Text _tmpText; void Awake() { _tmpText = GetComponent<TMP_Text>(); } public void OnPointerClick(PointerEventData eventData) { // 检测点击位置是否命中富文本链接 int linkIndex = TMP_TextUtilities.FindIntersectingLink(_tmpText, eventData.position, eventData.pressEventCamera); if (linkIndex == -1) return; TMP_LinkInfo linkInfo = _tmpText.textInfo.linkInfo[linkIndex]; switch (linkInfo.GetLinkID()) { case "protocol": // 此处替换为Platform Protocol弹窗的显示逻辑 Debug.Log("触发Platform Protocol弹窗"); // 示例:ProtocolPopup.Instance.Show(); break; case "privacy": // 此处替换为Privacy Policy弹窗的显示逻辑 Debug.Log("触发Privacy Policy弹窗"); // 示例:PrivacyPopup.Instance.Show(); break; } } }
注意:场景中必须存在EventSystem和StandaloneInputModule(默认UI模板会自带),否则点击事件无法被捕获。
3. 可选:添加hover高亮效果
如果需要鼠标悬浮时高亮词汇,给脚本补充IPointerEnterHandler和IPointerExitHandler接口,实现样式切换:
public void OnPointerEnter(PointerEventData eventData) { int linkIndex = TMP_TextUtilities.FindIntersectingLink(_tmpText, eventData.position, eventData.pressEventCamera); if (linkIndex == -1) return; TMP_LinkInfo linkInfo = _tmpText.textInfo.linkInfo[linkIndex]; // 将链接文本设为高亮色(这里用蓝色示例) for (int i = 0; i < linkInfo.linkTextLength; i++) { int charIndex = linkInfo.linkTextfirstCharacterIndex + i; _tmpText.textInfo.characterInfo[charIndex].color = Color.blue; } _tmpText.UpdateVertexData(); } public void OnPointerExit(PointerEventData eventData) { // 恢复链接文本的原始颜色 _tmpText.textInfo.ClearLinkColors(); _tmpText.UpdateVertexData(); }
关键检查项
- 确认TextMeshPro-Text(UI)组件的
Rich Text选项处于勾选状态(默认开启)。 - 弹窗逻辑需根据你的项目结构调整,比如实例化预制体或调用单例显示方法。
- 若点击无响应,检查EventSystem是否存在,脚本是否正确挂载到目标TextMeshPro对象上。
内容的提问来源于stack exchange,提问作者Seaky Lone
相关产品推荐
相关产品推荐

