using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.Rendering; using UnityEngine.UI; public class LinkTextAOT : MonoBehaviour,IPointerClickHandler { List ClickAction; UnityAction otherAreaClickAction; public void SetLinkAction(List unityActions) { ClickAction = unityActions; } public void SetOtherAreaClicked(UnityAction callback) { otherAreaClickAction = callback; } public void OnPointerClick(PointerEventData eventData) { TMP_Text pTextMeshPro = GetComponent(); int linkIndex = TMP_TextUtilities.FindIntersectingLink(pTextMeshPro, eventData.position, eventData.pressEventCamera); // If you are not in a Canvas using Screen Overlay, put your camera instead of null if (linkIndex != -1) { TMP_LinkInfo linkInfo = pTextMeshPro.textInfo.linkInfo[linkIndex]; //Application.OpenURL(linkInfo.GetLinkID()); if (ClickAction != null && linkIndex < ClickAction.Count) { ClickAction[linkIndex](); } } else { otherAreaClickAction?.Invoke(); } } /// /// 设置含超链接跳转的文本 /// /// public void SetText(string text) { TMP_Text pTextMeshPro = GetComponent(); pTextMeshPro.text = text; string pattern = "(.*?)"; System.Text.RegularExpressions.MatchCollection matches = System.Text.RegularExpressions.Regex.Matches(text, pattern); List LinkActions = new(); foreach (System.Text.RegularExpressions.Match match in matches) { string linkID = match.Groups[1].Value; string linkText = match.Groups[2].Value; LinkActions.Add(() => Application.OpenURL(linkID)); } SetLinkAction(LinkActions); } }