图文混排更新到超链接这儿,好像也差不多了,不过就在最后一点,博主也表现得相当不专业,直接整合了山中双木林同学提供的超链接的解决方案,博主甚至没来得及细看就直接复制了,但感觉还是挺好用的。

博主已经将超链接的功能直接整合到了之前的InlineText和InlineSpriteText的两个脚本中

1.定义超链接的正则表达式和事件监听

#region 超链接/// <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>)", RegexOptions.Singleline);[System.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(text.Substring(indexText, match.Index - indexText));s_TextBuilder.Append("<color=blue>");  // 超链接颜色var group = match.Groups[1];var hrefInfo = new HrefInfo{startIndex = s_TextBuilder.Length * 4, // 超链接里的文本起始顶点索引endIndex = (s_TextBuilder.Length + match.Groups[2].Length - 1) * 4 + 3,name = group.Value};m_HrefInfos.Add(hrefInfo);s_TextBuilder.Append(match.Groups[2].Value);s_TextBuilder.Append("</color>");indexText = match.Index + match.Length;}s_TextBuilder.Append(text.Substring(indexText, text.Length - indexText));return s_TextBuilder.ToString();}/// <summary>/// 点击事件检测是否点击到超链接文本/// </summary>/// <param name="eventData"></param>public void OnPointerClick(PointerEventData eventData){Vector2 lp;RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out lp);foreach (var hrefInfo in m_HrefInfos){var boxes = hrefInfo.boxes;for (var i = 0; i < boxes.Count; ++i){if (boxes[i].Contains(lp)){m_OnHrefClick.Invoke(hrefInfo.name);return;}}}}/// <summary>/// 超链接信息类/// </summary>private class HrefInfo{public int startIndex;public int endIndex;public string name;public readonly List<Rect> boxes = new List<Rect>();}#endregion

2.在文本绘制完成后处理超链接的包围盒

 #region 处理超链接的包围盒// 处理超链接包围框UIVertex vert = new UIVertex();foreach (var hrefInfo in m_HrefInfos){hrefInfo.boxes.Clear();if (hrefInfo.startIndex >= toFill.currentVertCount){continue;}// 将超链接里面的文本顶点索引坐标加入到包围框toFill.PopulateUIVertex(ref vert, hrefInfo.startIndex);var pos = vert.position;var bounds = new Bounds(pos, Vector3.zero);for (int i = hrefInfo.startIndex, m = hrefInfo.endIndex; i < m; i++){if (i >= toFill.currentVertCount){break;}toFill.PopulateUIVertex(ref vert, i);pos = vert.position;if (pos.x < bounds.min.x) // 换行重新添加包围框{hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size));bounds = new Bounds(pos, Vector3.zero);}else{bounds.Encapsulate(pos); // 扩展包围框}}hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size));}#endregion

3.看一下文中中超链接的输入规则

4.简单写了一个测试脚本,用来监听点击事件

using UnityEngine;
using System.Collections;public class TestClickInlineText : MonoBehaviour {private InlieText _text;void Awake(){_text = GetComponent<InlieText>();}void OnEnable(){_text.onHrefClick.AddListener(OnHrefClick);}void OnDisable(){_text.onHrefClick.RemoveListener(OnHrefClick);}private void OnHrefClick(string hrefName){Debug.Log("点击了 " + hrefName);//  Application.OpenURL("www.baidu.com");}
}

5.运行截图:

6.更新速度实在太慢,为了早点完结图文混排,这里的功能是复制的,有什么疑问的话,可以再讨论,这里的功能也就更新得差不多了,最后再给一个最新的源码链接,短时间没有特殊的功能或者bug,就不打算再更新了

工程源码链接:https://github.com/coding2233/TextInlineSprite

Unity UGUI图文混排(六) -- 超链接相关推荐

  1. Unity UGUI图文混排源码(二)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

  2. Unity UGUI图文混排源码(三) -- 动态表情

    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...

  3. Unity UGUI图文混排源码--优化版

    前言 因为有不少同学反应在使用图文混排的时候,出现很大的性能问题,导致画面帧率不稳定,甚至极低.博主对此非常抱歉,当时仅凭兴趣,在一个个功能上不断叠加,几乎没有考虑到性能的优化.这次有几天的空余时间, ...

  4. Unity UGUI图文混排(七) -- 下划线

    之前更新超链接的时候,忘了搭配实现一个下划线的功能,这篇文章就是来补上这一个功能,时间有点长,一方面没有很好的思路,一方面也没多少时间. 先在网上收集了一下下划线的实现操作,一种是在文本下再创建一个文 ...

  5. Unity Text 实现图文混排和超链接功能

    unity 已经在2021版本使用了全面使用了TMP实现图文混排和超链接这两个功能.由于当前项目并没有使用TMP.所以需要基于Text实现这两个功能,但是在2019之后的版本,Text 生成顶点时不再 ...

  6. Unity TextMeshPro图文混排

    笔者最近项目使用TextMeshPro完成图文混排的需求,以及图文超链接,总的来说功能很强大,没遇到什么坑. 这里记录一下图文混排实现的基本流程流程. 制作需要混排图片.asset文件 方式一 使用图 ...

  7. UGUI图文混排插件Text Mesh Pro

    Text Mesh Pro插件下载地址: https://github.com/UnityTechnologies/Test_ShaderGraphBlog 插件在线文档: http://digita ...

  8. Unity UGUI实现图文混排

    目前在unity实现图文混排的好像都是通过自定义字体然后在文本获取字符的位置,用图片替换掉图片标签,这样对于支持英文来说,并没有什么影响.然后对于中文来说就是一个相当麻烦的事了,毕竟图文混排多用于游戏 ...

  9. 【游戏开发实战】Unity UGUI Text图文混排(聊天文字混表情),支持动态表情,出招吧表情帝

    文章目录 一.前言 二.最终效果 三.具体使用 1.导入表情素材 2.设置图片格式 3.生成表情图集 4.UI-EmojiFont.shader 5.材质球 四.测试 五.结束语 一.前言 点关注不迷 ...

最新文章

  1. Linux-CAN Bus
  2. Android 学习视频
  3. ssh中exit命令退出远程服务器_解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止...
  4. 海贼王革命家—龙—实力到底如何?
  5. 没错!Python杀死了Excel!
  6. 飞鸽_飞鸽2007_飞鸽传书_飞鸽传书2007
  7. android 表格xml,【Android】利用表格布局,Android中xml文件与java的交互制作登录界面...
  8. 不同类型的官网应该如何设计?
  9. 此时本机的BootLoader程序坏了,也就是说grub第一阶段坏掉了,该如何修复
  10. Access denied for user ‘‘@‘localhost‘ (using password: YES)报错原因分享
  11. HTML5在vivo手机适配问题
  12. Google Adsense西联快汇收款流程
  13. PhpSpreadsheet 实现Excel多sheet导出
  14. revit出图建模【尺寸定位标注】功能
  15. Qt用SVG图片作为背景图
  16. 什么是promise?promise的作用是什么?
  17. 机器学习贝叶斯分类(理论及代码实现)
  18. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记...
  19. 《网络末日战》精彩剧情生和每天都有小惊喜
  20. 概论_第3章_二维随机变量__均匀分布

热门文章

  1. Winsock中accept函数获取到的ip地址一直为204.204.204.204或0xcccccccc的解决方案
  2. scardsvr 智能卡修复工具原理及代码
  3. 【转】 中兴OLT-C300常用命令
  4. oop三大特性--封装性
  5. 2019中国大学生程序设计竞赛-女生专场(重现赛)
  6. 飞刀又见飞刀在线观看
  7. Java程序的类体两部分_一般Java程序的类体由两部分组成:一部分是____,另一部分是____。...
  8. 民法典假房产证过户有效吗
  9. 顺丰--Java丰桥接口整体封装(下单、查询、打印)
  10. 如何构建智慧矿山管理平台?