NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/Localization/LinkText.cs

78 lines
2.4 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
2024-08-13 15:19:31 +08:00
using TMPro;
using UnityEngine;
2024-08-13 16:11:48 +08:00
using UnityEngine.Events;
using UnityEngine.EventSystems;
[RequireComponent(typeof(TMP_Text))]
public class LinkText : MonoBehaviour, IPointerClickHandler
{
2024-08-13 16:11:48 +08:00
List<UnityAction> ClickAction;
UnityAction otherAreaClickAction;
2024-08-13 16:11:48 +08:00
public void SetLinkAction(List<UnityAction> unityActions)
{
ClickAction = unityActions;
}
public void SetOtherAreaClicked(UnityAction callback)
{
otherAreaClickAction = callback;
}
2024-08-13 16:11:48 +08:00
public void OnPointerClick(PointerEventData eventData)
{
DebugUtil.Log("OnPointerClick called.");
TMP_Text pTextMeshPro = GetComponent<TMP_Text>();
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];
DebugUtil.Log("OnPointerClick called.");
DebugUtil.Log("Link ID: \"" + linkInfo.GetLinkID() + "\" Link Text: \"" + linkInfo.GetLinkText());
2024-08-13 15:19:31 +08:00
//Application.OpenURL(linkInfo.GetLinkID());
2024-08-13 16:11:48 +08:00
if (ClickAction != null && linkIndex < ClickAction.Count)
2024-08-13 15:19:31 +08:00
{
2024-08-13 16:11:48 +08:00
ClickAction[linkIndex]();
2024-08-13 15:19:31 +08:00
}
2024-08-13 16:11:48 +08:00
else
2024-08-13 15:19:31 +08:00
{
2024-08-13 16:11:48 +08:00
DebugUtil.LogError("Link index out of range.");
2024-08-13 15:19:31 +08:00
}
}
else
{
otherAreaClickAction?.Invoke();
}
}
2024-10-24 16:45:46 +08:00
/// <summary>
/// 设置含超链接跳转<link>的文本
/// </summary>
/// <param name="text"></param>
public void SetText(string text)
{
TMP_Text pTextMeshPro = GetComponent<TMP_Text>();
pTextMeshPro.text = text;
string pattern = "<link=\"(.*?)\">(.*?)</link>";
System.Text.RegularExpressions.MatchCollection matches = System.Text.RegularExpressions.Regex.Matches(text, pattern);
List<UnityAction> 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);
}
}