【Unity】Unity中文本中插入超链接且可点击响应,TextMeshPro的进阶用法

一、需求和尝试

今天遇到这样一个需求:在文本中插入超链接,且这个链接可以点击跳转对应的url,具体形式如下图所示。
在这里插入图片描述

其实这个有一个简单粗暴的方法,就是把需要加超链接的文本单独拿出来,和其他文本进行拼接,然后在需要加超链接的文本上添加点击事件。但是这样做会对文本适配有很大考验,且文本变换或者修改了,就要重新调整文本的布局。最最关键的是,这种方法对于游戏需要多语言的没有用,因为文本的长短会随着语言变化而动态进行变化,所以这种方法还是pass。

二、解决方案

找了一遍网上的文档,其中不少用Text组件去做的,这种方法确实可以实现文本中添加点击效果跳转超链接,但是当一个文本中有多个超链接时,就会只响应一个,或者点击一个,然后所有点击事件全部响应,没法实现我们需要的效果。

最终确定的方法就是使用TextMeshPro组件来实现
首先unity官方的TextMeshPro组件富文本中就可以添加超链接,其所有富文本标签效果在下面,最后有超链接添加方法

<b>粗体标签</b>
<i>斜体标签</i>
<u>下划线标签</u>
<s>删除线标签</s>
<sup>上标标签</sup>前面后面上标签 5<sup></sup>C
<sub>下标标签,如:</sub>H<sub>2</sub>O
<size=48>文字大小</size>
<size=55%>文字大小-百分比</size>
<size=+18>默认大小上再增加文字大小</size>
<size=-18>默认大小上减去指定文字大小</size>
<pos=40>距离左侧的缩进,可以实现类似首行缩进的,文字大小不同这个值缩进程度不同
<color=yellow>颜色标签写法一</color>
<#00ff00>颜色标签写法二</color>
<alpha=#FF><alpha=#CC><alpha=#AA><alpha=#88><alpha=#66><alpha=#44>明度 <alpha=#22><alpha=#00>变化
<alpha=#FF>
<align="left">左对齐<sprite=2>也是默认对齐</align>
<align="center">居中对齐<sprite=2></align>
<align="right">右对齐<sprite=5></align>
1. <indent=15%>缩进15%.
多行有效</indent>
2. <indent=100>缩进100像素
多行有效</indent>
3. <indent=5em>缩进5em
多行有效</indent>
4. <indent=15%>缩进15%.
<cspace=1em>1em字体单位间距</cspace>
<cspace=10>10像素字体单位间距</cspace>
<cspace=-4>-10像素缩小间距
使用 <font="LiberationSans SDF">different font?</font>或者使用<font="YouYuan SDF" material="YouYuan SDF - Outline">不同材质?
<line-height=50%>50%行间距
行间距</line-height>
<line-height=100%>100%行间距
正常</line-height>
<line-height=150%>
150%
行间距</line-height>
<line-indent=15%>行缩进只影响单行显示,多行不受影响</line-indent>
<lowercase>ABCDEFG</lowercase>
<uppercase>ABCDEFG</uppercase>
<smallcaps>AbcdeFg</smallcaps>
设置 <mark=#ff0000aa>标注</mark> 前面是标注,需要透明度
<noparse><b></noparse> 取消标签的作用,如b加粗没效果
<style=H1>内置</style><style=H2></style><style=C1>样式名</style>
<width=50%>设定高可用宽度,超出后即使没换行会自动换行的</width>
<link="https://blog.csdn.net/qq_41789645?spm=1010.2135.3001.5421">网站,需要额外脚本</link>

上面需求中的文本形式如下图
在这里插入图片描述
其中需要添加一个LinkOpener脚本,来监听点击事件,脚本在下面

using TMPro;
using UnityEngine.EventSystems;
using UnityEngine;[RequireComponent(typeof(TMP_Text))]public class LinkOpener : MonoBehaviour, IPointerClickHandler
{public void OnPointerClick(PointerEventData eventData){TMP_Text pTextMeshPro = GetComponent<TMP_Text>();//int linkIndex = TMP_TextUtilities.FindIntersectingLink(pTextMeshPro, eventData.position, null); // If you are not in a Canvas using Screen Overlay, put your camera instead of nullint linkIndex = TMP_TextUtilities.FindIntersectingLink(pTextMeshPro, eventData.position, Camera.main);if (linkIndex != -1){TMP_LinkInfo linkInfo = pTextMeshPro.textInfo.linkInfo[linkIndex];Application.OpenURL(linkInfo.GetLinkID());}}
}

需要注意的是,上面脚本的

 int linkIndex = TMP_TextUtilities.FindIntersectingLink(pTextMeshPro, eventData.position, Camera.main);

这一行中,如果你的canvas设置为Screen Overlay,则该方法最后传入null,但是如果你的canvas中用的Screen Space Camera,则该方法最后传入你的uicanvas中的camera,否则点击文本的位置计算错误,就会导致文本无法点击。

最后需要注意的就是,TextMeshPro中用到的字体是需要单独制作的,通常默认的字体只会有英文,如果需要添加中文或者其他语言,则需要自己单独制作字体文件

三、TextMeshPro字体文件的制作

TextMeshPro插件中自带文本的制作,下面是制作过程
在这里插入图片描述
打开FontAssetCreator,就是下图所示,根据自身需求,填写其中的参数,点击制作就好了,然后点击保存到项目的文件夹中即可
在这里插入图片描述

我这边制作出来的字体文件有个小问题,就是TextMeshPro使用我自己做出来的字体,显示出来的效果,永远没有他默认的字体效果好,文本会有毛边之类的,修改shader后会有所改善,但是还是没法达到默认字体或者官方提供字体的效果,有知道原因的大神欢迎解答一下。

针对上面这个问题,我发现TextMeshPro的字体可以追加额外字符,就是在字体不变的基础上,添加额外的文本,这样就可以不替换原来的字体文件了

就是找到TMP Settings或者直接找到那个SDF字体文件,会发现有个Fallback Font Assets的属性,点击加号就可以继续添加额外的SDF字体库资源文件。
如下图所示
在这里插入图片描述

over~
看到这里了,点个赞再走吧,你的认可就是我创作的动力~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改huggingface的缓存目录以及镜像源

执行以下语句查看当前配置 huggingface-cli env默认输出应该如下 (py39-transformers) PS D:\py_project\transformers_demo> huggingface-cli envCopy-and-paste the text below in your GitHub issue.- huggingface_hub version: 0.26.1 - Platform: Windows-10-10.0.22…

面向垂类场景的智能化低代码引擎

背景介绍 在通信领域中&#xff0c;不同客户的数字化场景存在多种个性化大屏的定制需求&#xff0c;常见业务范围涵盖政务、金融、教育、工业、传媒、互联网等行业领域。然而&#xff0c;面对如此巨大的产业痛点诉求&#xff0c;传统低代码领域却存在数据监控粒度不统一、定制化…

学习docker第三弹------Docker镜像以及推送拉取镜像到阿里云公有仓库和私有仓库

docker目录 1 Docker镜像dockers镜像的进一步理解 2 Docker镜像commit操作实例案例内容是ubuntu安装vim 3 将本地镜像推送至阿里云4 将阿里云镜像下载到本地仓库5 后记 1 Docker镜像 镜像&#xff0c;是docker的三件套之一&#xff08;镜像、容器、仓库&#xff09;&#xff0…

基于SpringBoot+Vue+MySQL的实践性教学系统

系统展示 用户前台界面 后台界面 系统背景 随着信息技术的快速发展&#xff0c;企业对于高效、智能的管理系统需求日益迫切。传统的管理系统大多采用单机版或C/S架构&#xff0c;存在操作复杂、维护困难、数据共享性差等问题。而基于SpringBootVueMySQL的全栈管理系统&#xff…

【10分钟本地部署大语言模型】借助1Panel、MaxKb、Ollama快速部署大语言模型(qwen、llama等)及知识库

前言&#xff1a; 本文介绍一种快速在Linux服务器&#xff08;windows使用wsl也可以&#xff09;上部署大语言模型&#xff08;含知识库&#xff09;的方式。 核心内容如下&#xff1a; 1Panel&#xff1a; 开源的Linux 服务器运维管理面板&#xff0c;通过该面板安装ollama和…

Serv00 免费虚拟主机 零成本搭建 PHP / Node.js 网站

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Serv00 是一个提供免费虚拟主机的平台&#xff0c;包含了 3GB 的存储空间和 512MB 的内存空间&#xff0c;足够我们搭建一个 1IP 的小网站了。同时他还不限制每月的流量&#xff0c;并提供了 16 个数据库&…

进程间通信(一)管道

文章目录 进程间通信进程间通信概述进程间通信的方式管道通信示例--基于管道的父子进程通信示例--使用管道进程兄弟进程通信 管道的读写特性示例--不完整管道&#xff08;读一个写端关闭的管道&#xff09;示例--不完整管道&#xff08;写一个读端关闭的管道&#xff09; 标准库…

PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件

文章目录 一、使用QtDesigner创建.ui文件1、创建.ui文件2、生成.py文件3、使用新生成的.py文件4、编辑新生成的.py文件 一、使用QtDesigner创建.ui文件 1、创建.ui文件 打开PyCharm&#xff0c;使用自定义外部工具QtDesigner创建mydialog.ui文件&#xff0c;如下&#xff1a; …

大话网络协议:HTTPS协议和HTTP协议有何不同?为什么HTTPS更安全

大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。 理解HTTP协议 要解释 https 协议,当…

[mysql]聚合函数GROUP BY和HAVING的使用和sql查询语句的底层执行逻辑

#GROUP BY的使用 还是先从需求出发,我们现在想求员工表里各个部门的平均工资,最高工资 SELECT department_id,AVG(salary) FROM employees GROUP BY department_id 我们就会知道它会把一样的id分组,没有部门的就会分为一组,我们也可以用其他字段来分组,我们想查询不同jb_id…

动力电池中的基础知识总结

动力电池基础 基本定义 电池的分类方式多样&#xff0c;按工作特性和储存方式分类 一次电池&#xff08;Primary Battery&#xff09;&#xff1a;只能进行一次放电&#xff08;disposable or single-use batteries&#xff09;&#xff0c;放电后不能通过充电的方式使其恢复…

Postgresql pgsql 插件之postgis 安装配置

相关链接&#xff1a; pgsql编译安装 一、说明 postgis是pgsql最强大的几个插件之一&#xff0c;可以用于地理信息系统&#xff08;gis&#xff09;的搭建 二、插件安装启动 由于我的pgsql是编译安装的&#xff0c;所以插件也是编译安装&#xff0c;更加灵活。 1.进入到源…

草地杂草数据集野外草地数据集田间野草数据集YOLO格式VOC格式目标检测计算机视觉数据集

一、数据集概述 数据集名称&#xff1a;杂草图像数据集 数据集是一个包含野草种类的集合&#xff0c;其中每种野草都有详细的特征描述和标记。这些数据可以包括野草的图片、生长习性、叶片形状、颜色等特征。 1.1可能应用的领域 农业领域: 农业专家和农民可以利用这一数据集来…

IDEA无法生成自动化序列serialVersionUID及无法访问8080端口异常的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;IDEA 今天是1024程序员节&#xff0c;先祝大家节日快乐&#xff01; 无法生成自动化序列serialVersionUID 如果我们在idea当中想要通过generate来生成自动化序列&#xff0c;如下图…

Nest.js 实战 (十五):前后端分离项目部署的最佳实践

☘️ 前言 本项目是一个采用现代前端框架 Vue3 与后端 Node.js 框架 Nest.js 实现的前后端分离架构的应用。Vue3 提供了高性能的前端组件化解决方案&#xff0c;而 Nest.js 则利用 TypeScript 带来的类型安全和模块化优势构建了一个健壮的服务端应用。通过这种技术栈组合&…

智慧升级,知识无界:十大搭建知识库软件助你前行

在知识爆炸的时代&#xff0c;如何高效地管理、整合与利用信息&#xff0c;成为了个人与企业发展的核心竞争力。智慧升级&#xff0c;意味着我们不仅要掌握丰富的知识&#xff0c;更要学会运用工具&#xff0c;让知识无界流通&#xff0c;助力个人成长与企业创新。以下是精心挑…

全网最全开放式自动猫砂盆测评!魔铲、cewey、萌娃有什么区别?

最近我发现很多铲屎官在购买开放式自动猫砂盆时&#xff0c;总是会在cewey、魔铲、萌娃之间犹豫&#xff0c;不知道这三款自动猫砂盆到底有什么不同&#xff0c;盲选又怕选错&#xff0c;买了个祖宗回去&#xff0c;今天我就给大家好好说说&#xff0c;cewey、魔铲、萌娃之间&a…

SL3160 dcdc150V降压5.1V/1A 车载GPS定位器供电芯片

一、主要特性 宽输入电压范围&#xff1a;SL3160支持10~150V的宽输入电压范围&#xff0c;使其能够适应各种电源电压波动&#xff0c;确保稳定输出。 高效降压转换&#xff1a;该芯片采用先进的电源管理技术&#xff0c;转换效率高达90%以上&#xff0c;降低了散热压力和整体…

解决xhell连接虚拟机导致小键盘无法使用

我们在使用xhell连接虚拟机的时候经常会出现小键盘输入导致一些乱的字母输入&#xff0c;当然会解决方法也简单只需要在连接的时候调试下设置就好 1打开xhell&#xff08;我的版本是xhell6&#xff09; 2.创建连接3&#xff0c;选择vt模式-初始数字键盘模式-设置为普通 4.这些…

flutter 使用三方/自家字体

将字体放入assets/fonts下 在pubspec.yaml文件中flutter下添加如下代码&#xff1a; flutter:fonts:- family: MyCustomFontfonts:- asset: assets/fonts/MyCustomFont.ttf 在flutter Text widget中使用字体 import package:flutter/material.dart;void main() > runApp(…