Unity Text 插入超链接

时间:2025-01-23 07:42:05
     /// <summary>
     /// 超链接信息列表
     /// </summary>
     private  readonly List<HrefInfo> m_HrefInfos =  new List<HrefInfo>();
 
     /// <summary>
     /// 文本构造器
     /// </summary>
     private  static  readonly StringBuilder s_TextBuilder =  new StringBuilder();
 
     /// <summary>
     /// 超链接正则
     /// </summary>
     private  static  readonly Regex s_HrefRegex =
         new Regex(@ "<a href=([^>\n\s]+)>(.*?)(</a>)", );
 
    [Serializable]
     public  class HrefClickEvent : UnityEvent< string> { }
 
    [SerializeField]
     private HrefClickEvent m_OnHrefClick =  new HrefClickEvent();
 
     /// <summary>
     /// 超链接点击事件
     /// </summary>
     public HrefClickEvent onHrefClick
    {
        get {  return m_OnHrefClick; }
        set { m_OnHrefClick = value; }
    }
 
     /// <summary>
     /// 获取超链接解析后的最后输出文本
     /// </summary>
     /// <returns></returns>
     protected  string GetOutputText()
    {
        s_TextBuilder.Length =  0;
        m_HrefInfos.Clear();
        var indexText =  0;
         foreach (Match match  in s_HrefRegex.Matches(text))
        {
            s_TextBuilder.Append((indexText,  - indexText));
            s_TextBuilder.Append( "<color=blue>");   // 超链接颜色
 
            var group = [ 1];
            var hrefInfo =  new HrefInfo
            {
                startIndex = s_TextBuilder.Length *  4// 超链接里的文本起始顶点索引
                endIndex = (s_TextBuilder.Length + [ 2].Length -  1) *  4 +  3,
                name = 
            };
            m_HrefInfos.Add(hrefInfo);
 
            s_TextBuilder.Append([ 2].Value);
            s_TextBuilder.Append( "</color>");
            indexText =  + ;
        }
        s_TextBuilder.Append((indexText,  - indexText));
         return s_TextBuilder.ToString();
    }
 
     /// <summary>
     /// 点击事件检测是否点击到超链接文本
     /// </summary>
     /// <param name="eventData"></param>
     public  void OnPointerClick(PointerEventData eventData)
    {
        Vector2 lp;
        (
            rectTransform, , ,  out lp);
 
         foreach (var hrefInfo  in m_HrefInfos)
        {
            var boxes = ;
             for (var i =  0; i < ; ++i)
            {
                 if (boxes[i].Contains(lp))
                {
                    m_OnHrefClick.Invoke();
                     return;
                }
            }
        }
    }
 
     /// <summary>
     /// 超链接信息类
     /// </summary>
     private  class HrefInfo
    {
         public  int startIndex;
 
         public  int endIndex;
 
         public  string name;
 
         public  readonly List<Rect> boxes =  new List<Rect>();
    }