当前位置: 首页 > news >正文

越秀做网站乔拓云智能建站官网

越秀做网站,乔拓云智能建站官网,开发公司工程部经理竞聘演讲稿,wordpress中文用户名称推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求,研究了实现…

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

在开发中遇到了要给Text加超链接的需求,研究了实现方式,将代码和使用方法总结出来,分享一下。

二、正文

2-1、实现思路

主要有两种实现思路,一种是使用Text Mesh Pro,可以直接加入超链接,实现点击事件。

另一种,就是继承Text脚本组件,重载OnPopulateMesh方法,替换最终绘制的文本。

接下来就分别讲解如何使用。

2-2、继承Text脚本组件,重载OnPopulateMesh方法

让Text显示超链接的文本内容需要以下几步:
(1)使用正则表达式提取超链接标签及里面的内容,并保存顶点信息(点击的时候使用)
(2)将文本内容加上颜色进行标识
(3)设置监听事件,在点击的时候调用

正则表达式:

//提取以<a link=>开头,以</a>结束的内容。
<a link=([^>\n\s]+)>(.*?)(</a>)

整体代码如下:

新建一个脚本命名为HyperlinkText.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;/// <summary>
/// 超链接信息类
/// </summary>
/// 
[Serializable]
public class HyperlinkInfo
{public int startIndex;public int endIndex;public string name;public readonly List<Rect> boxes = new List<Rect>();
}
/// <summary>
/// 文本控件,支持超链接
/// </summary>
public class HyperlinkText : Text, IPointerClickHandler
{/// <summary>/// 解析完最终的文本/// </summary>private string m_OutputText;/// <summary>/// 超链接信息列表/// </summary>private readonly List<HyperlinkInfo> _mLinkInfos = new List<HyperlinkInfo>();/// <summary>/// 文本构造器/// </summary>protected static readonly StringBuilder s_TextBuilder = new StringBuilder();/// <summary>/// 超链接正则表达式/// </summary>private static readonly Regex s_HrefRegex = new Regex(@"<a link=([^>\n\s]+)>(.*?)(</a>)", RegexOptions.Singleline);/// <summary>/// 文本超链接控件/// </summary>private HyperlinkText mHyperlinkText;protected override void Awake(){base.Awake();mHyperlinkText = GetComponent<HyperlinkText>();}#region 回调事件public Action<string> onLinkClick;/// <summary>/// 点击事件检测是否点击到超链接文本/// </summary>/// <param name="eventData"></param>public void OnPointerClick(PointerEventData eventData){RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out var lp);foreach (var info in _mLinkInfos){var boxes = info.boxes;for (var i = 0; i < boxes.Count; ++i){if (!boxes[i].Contains(lp)) continue;onLinkClick?.Invoke(info.name);return;}}}#endregion#region 生成超链接/// <summary>/// 重新渲染网格/// </summary>public override void SetVerticesDirty(){base.SetVerticesDirty();m_OutputText = GetOutputText(text);}/// <summary>/// 处理Text顶点数据/// </summary>/// <param name="toFill"></param>protected override void OnPopulateMesh(VertexHelper toFill){var orignText = m_Text;m_Text = m_OutputText;base.OnPopulateMesh(toFill);m_Text = orignText;UIVertex vert = new UIVertex();// 处理超链接包围框foreach (var hrefInfo in _mLinkInfos){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));}}/// <summary>/// 获取超链接解析后的最后输出文本/// </summary>/// <returns></returns>protected virtual string GetOutputText(string outputText){s_TextBuilder.Length = 0;_mLinkInfos.Clear();var indexText = 0;foreach (Match match in s_HrefRegex.Matches(outputText)){s_TextBuilder.Append(outputText.Substring(indexText, match.Index - indexText));string str = s_TextBuilder.ToString();char[] array = str.ToCharArray();                //把字符串转化成字符数组IEnumerator enumerator = array.GetEnumerator();         //得到枚举器StringBuilder stringBuilder = new StringBuilder();while (enumerator.MoveNext())                         //开始枚举{if ((char)enumerator.Current != ' ')         //向StringBuilder类对象添加非空格字符stringBuilder.Append(enumerator.Current.ToString());}var group = match.Groups[1];var hrefInfo = new HyperlinkInfo{startIndex = stringBuilder.Length * 4, // 超链接里的文本起始顶点索引endIndex = (stringBuilder.Length + match.Groups[2].Length - 1) * 4 + 3,name = group.Value};_mLinkInfos.Add(hrefInfo);s_TextBuilder.Append("<color=blue>");  // 超链接颜色s_TextBuilder.Append(match.Groups[2].Value);s_TextBuilder.Append("</color>");indexText = match.Index + match.Length;}s_TextBuilder.Append(outputText.Substring(indexText, outputText.Length - indexText));return s_TextBuilder.ToString();}#endregion
}

调用如下,新建脚本命名为HyperlinkLogic.cs,双击编辑代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HyperlinkLogic : MonoBehaviour
{public HyperlinkText hyperlinkText;void Start(){// 动态显示文本hyperlinkText.text = "文本测试:<a link=https://blog.csdn.net/q764424567>[恬静的小魔龙]</a>";// 绑定事件hyperlinkText.onLinkClick = (info) => onclick(info);}void onclick(string info){Debug.Log(info);Application.OpenURL(info);}
}

运行结果:
在这里插入图片描述

2-3、使用Text Mesh Pro加入超链接

使用Text Mesh Pro就方便了,因为TMP自身支持超链接,只要使用标签link即可。

标签:

<link="id_01"></link>//超链接
<#0C86BA></color>//颜色
<u></u>//下划线

演示文本:

<link="id_01"><u><#0C86BA>Insert link text here</u></color></link>

在这里插入图片描述
新建脚本命名为TMPLink.cs,双击编辑代码:

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;public class TMPLink : MonoBehaviour, IPointerClickHandler
{private TextMeshProUGUI m_TextMeshPro;void Awake(){m_TextMeshPro = gameObject.GetComponent<TextMeshProUGUI>();}void Start(){}public void OnPointerClick(PointerEventData eventData){int linkIndex = TMP_TextUtilities.FindIntersectingLink(m_TextMeshPro, Input.mousePosition, eventData.pressEventCamera);TMP_LinkInfo linkInfo = m_TextMeshPro.textInfo.linkInfo[linkIndex];RectTransformUtility.ScreenPointToLocalPointInRectangle(m_TextMeshPro.rectTransform, eventData.position, eventData.pressEventCamera, out var worldPointInRectangle);switch (linkInfo.GetLinkID()){case "id_01":Debug.Log("点击了id:id_01的超链接");Application.OpenURL("https://blog.csdn.net/q764424567");break;}}
}

运行点击结果:
在这里插入图片描述

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
http://www.ahscrl.com/news/12413.html

相关文章:

  • 做电影网站会不会侵权品牌服务推广
  • 无线网络优化工程师学seo需要多久
  • 信阳市人民政府办公室江苏seo和网络推广
  • 南宁住房和城乡建设委员会网站搜狗网站收录提交入口
  • 建设网站可选择的方案有友情链接2598
  • 怎么做祝福网站百度数据中心
  • 做网站待遇官网seo哪家公司好
  • 智慧政务门户网站建设方案网络推广公司可不可靠
  • 上海做网站设计公司私域运营软件
  • 信誉比较好的网上做任务的网站seo关键字优化技巧
  • 网站运行时错误如何做怎样免费制作网页
  • 做淘宝客网站要注意什么青岛seo关键词优化排名
  • 撸撸撸做最好的导航网站网站关键词推广优化
  • 阿拉尔市建设局网站火锅店营销方案
  • wordpress建站环境小程序开发教程
  • 灵犀科技-网站开发宁波seo在线优化方案公司
  • 电脑用虚拟机做网站网站seo系统
  • 服装网站建设效果用广州seo推广获精准访问量
  • 网站接做网站单关键词诊断优化全部关键词
  • wordpress站点描述sem
  • 银川网站开发推广企业最大免费发布平台
  • 淮安网站建设百度seo怎么样优化
  • 视频号广告推广热狗网站排名优化外包
  • 天津河东区网站建设专业seo排名优化费用
  • 做网站的市场前景怎样推广一个产品
  • js特效素材网整站优化seo
  • 输入网址跳到别的网站公关负面处理公司
  • 网站后台怎么做alt标签头条搜索站长平台
  • 做字体的网站电脑培训学校能学什么
  • 做网站的公司找客户seo技巧seo排名优化