首页 > 其他分享 >Unity UGUI图文混排(六) -- 超链接

Unity UGUI图文混排(六) -- 超链接

时间:2022-12-13 14:34:32浏览次数:72  
标签:TextBuilder -- text hrefInfo Unity 超链接 var new UGUI


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

博主已经将超链接的功能直接整合到了之前的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.看一下文中中超链接的输入规则


Unity UGUI图文混排(六) -- 超链接_Click

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.运行截图:

Unity UGUI图文混排(六) -- 超链接_Click_02

Unity UGUI图文混排(六) -- 超链接_图文混排_03

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

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


标签:TextBuilder,--,text,hrefInfo,Unity,超链接,var,new,UGUI
From: https://blog.51cto.com/u_15911199/5934050

相关文章

  • redisson 延迟队列实现订单过期监听
    需求:     订单下单超过两个小时以后,如果还未支付,则自动转为取消支付状态实现:    1,创建延迟队列的监听任务RedisDelayedQueueListener,消费延迟队列 ......
  • Unity Hex Map技术测试
    HexMap常用于战棋的地形,最近有这方面的需求,做一个简单的测试,从画一个正六边形开始。0x00.正六边形如上图所示,两个圆,可以很规范的画一个六变形。外圆半径定为:​​publicco......
  • Integrate the OpenOffice.org Power in a WTL (or Other Native Win32) Application
    IntegratetheOpenOffice.orgPowerinaWTL(orOtherNativeWin32)ApplicationDownloadtheWtlOOo1.1application-88.83KBDownloadtheSDKpreparatio......
  • ScriptRunner Application
    ScriptRunnerApplicationDownloadprojectdemo-222.22KBDownloadsourcefiles-101.15KBIntroductionOneofthemostsoughtafterskillsfor......
  • 【Unity】MeshEditor.Effects.Vortex 网格编辑器特效篇之涡流特效:开启你的不会Shader
    更新日期:2020年4月22日。Github源码:​​​[点我获取源码]​​索引​​前言​​​​扩展​​​​Vortex​​​​使用​​​​参数​​​​原理及算法​​​​图像展示​​前......
  • 分治法与动态规划的区别
    1.分治法与动态规划主要共同点:二者都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题,然后将子问题的解合并,形成原问题的解。2.分治法与动态规......
  • 遥感SCI期刊汇总
     1.BOLETIMDECIENCIASGEODESICAS《大地测量科学通报》​http://ojs.c3sl.ufpr.br/ojs2/index.php/bcg​Semiannual  (注:2008年开始被SCI收录)ISSN:1413-4853UNIV F......
  • 数据溢出实验
    20221427曹甲松《缓冲区溢出》的实验报告一. 实验指导书内容                          二. 缓冲区溢出的原理计......
  • Unity角色残影特效
    残影特效在网上有很多例子,比如​​这个​​,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用。这里只针对Skinne......
  • 资产运营管理系统,支持房地产业良性循环和健康发展的十条政策措施优化保障性租赁住房筹
    优化保障性租赁房融资渠道。 版权声明:本文章由“厦门多米克信息技术有限公司”编辑组汇编而成,未经授权和许可,任何个人或媒体不得对本网站的文章及其他信息资料予以复制......