【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.rhkb.cn/news/455931.html

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

相关文章

【数据结构与算法】之队列详解

队列&#xff08;Queue&#xff09;是一种重要的线性数据结构&#xff0c;遵循先进先出、后进后出的原则。本文将更详细地介绍队列的概念、特点、Java 实现以及应用场景。 模运算小复习&#xff1a; a % b 的值总是小于b 5 % 4 1 5 % 2 1 1 % 5 1 4 % 5 4 1. 队列…

windows|常见的文件伪装方法

几种常见的文件伪装方法&#xff1a; 扩展名伪装unicode字符伪装压缩包伪装隐写术 方法仅限于学习目的&#xff0c;不用于任何恶意或非法用途。 ———— 一、扩展名伪装&#xff1a;假装是另一种类型的文件 修改文件的扩展名&#xff0c;使得文件看起来像其他类型的文件&a…

取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题

标题 问题展示 修改后 <div class="loginForm"><el-formref="formB":model="formDataB":rules="rulesB"class="login-form"label-position="left"><el-form-item prop="userNo" clas…

CentOS 7(Linux)详细安装教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 一、CentOS镜像的下载&#xff08;准备工作&#xff09; 我选择的是其他镜像源的下载地址&#xff1a; Index of /centos-vault/7.6.1810/isos/x86_64/ | 南阳理工学院开源镜…

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f;下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台&#xff0c;求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才&#xff0c;求职者则通过上传简历寻找合适的工作。在这种复杂的场景中&#xff0c;我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

【分立元件】电阻的额定电压和最高电压

在文章:【分立元件】贴片电阻的额定功率中我们讲到使用电阻器时,不仅要注意额定功率,还要注意电压相关的一些项目。 本文我们将对与电阻基本参数关联的额定电压和元件最高电压这两个术语及其定义(包括它们之间的关系)进行解说。 额定电压 如下所示国巨片式电阻规…

ARM学习(33)英飞凌(infineon)PSOC 6 板子学习

笔者来聊一下psoc62 系列板子的知识 1、PSOC62板子介绍 Psoc6-evaluationkit-062S2 与RT-Thread联合推出的一款32位的双core的板子&#xff0c;基于CortexM4以及CortexM0。 管脚兼容Arduio。板载DAP-Link&#xff0c;可以支持调试以及串口&#xff0c;无需外接2MB的Flash以及…

Java 开发——(下篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

上篇速递 - Spring Boot 3 MybatisPlus 五、静态资源访问 1. 基础配置 在 Spring Boot 中访问静态资源非常方便。Spring Boot 默认支持从以下位置加载静态资源&#xff1a; /META-INF/resources//resources//static//public/ 这些目录下的文件可以直接通过 URL 访问。 例…

【python实操】python小程序之参数化以及Assert(断言)

引言 python小程序之参数化以及Assert&#xff08;断言&#xff09; 文章目录 引言一、参数化2.1 题目2.2 代码2.3 代码解释 二、Assert&#xff08;断言&#xff09;2.1 概念2.1.1 Assert语句的基本语法&#xff1a;2.1.2 基本断言2.1.3 断言函数参数2.1.4 断言前后状态一致 2…

【计网】从零开始认识IP协议 --- 理解网段划分,NAT策略,私有IP和公网IP,认识公网

任何收获都不是偶然&#xff0c; 一点一滴的进步终会让未来的你焕然一新&#xff01; 从零开始认识IP协议 1 为什么要进行网段划分2 特殊IP地址与数量限制3 私有IP和公网IP4 彻底理解网段划分5 认识公网 1 为什么要进行网段划分 我们以一个例子来讲解为什么要进行网段划分&a…

Java【多线程】单例模式

目录 单例模式 饿汉模式 懒汉模式 懒汉模式-多线程版 单例模式 单例模式是一种设计模式 设计模式相当于棋谱 棋谱&#xff0c;大佬把一些对局整个推演过程&#xff0c;写出来 设计模式&#xff0c;是属于程序员的棋谱 单例模式&#xff08;单个实例/对象&#xff09;&…

sqli-labs靶场安装以及刷题记录-docker

sqli-labs靶场安装以及刷题记录-docker sqli-labs靶场安装-dockersqli-labs靶场刷题less-1 单引号less-2 数字型less-3 单引号括号less-4 双引号括号less-5 单引号布尔盲注less-6 双引号布尔盲注less-7 单引号加括号、输出到文件less-8 单引号布尔盲注less-9 单引号时间盲注les…

背景动态变化的html页面

首先看下效果图&#xff1a; 把下面的代码保存到 .html 结尾的文件里&#xff0c;用浏览器打开即可。 <!DOCTYPE html> <html> <head><title>动态背景</title><style>/* 样式表 */body {height: 100vh;display: flex;align-items: cente…

基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

NLP--一起学习Word Vector【实践】

纸上得来终觉浅&#xff0c;绝知此事要躬行。 《冬夜读书示子聿》 值此1024的程序员节&#xff0c;我们一起学习 Word Vector。 本章一起学习文本向量化&#xff0c;掌握文本向量的相关概念&#xff0c;了解各个文本向量&#xff0c;实现文本向量的算法 我开启了一个NLP共学坊…

echarts散点图

一、类似散点图折线图不展示折线 option {grid: {left: 10,right: 20,top: 35,bottom: 15,containLabel: true},tooltip: {show: true,trigger: item,backgroundColor: "rgba(0,0,0,0)", // 提示框浮层的背景颜色。formatter: function (params) {var html <d…

洞见数据未来,StarRocks Summit Asia 2024 即将启幕!

在 AI 时代&#xff0c;我们需要怎样的数据基础软件&#xff1f; 数据量和数据类型的需求飞速上涨&#xff0c;我们不仅需要将历史上各种基础设施中的数据进行分析使用&#xff0c;还要关注性能、灵活性、性价比&#xff0c;以及确保单一可信数据源。这一切构成了当前大数据领…

【实战案例】Django框架表单处理及数据库交互

本文基于之前内容列表如下&#xff1a; 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 【实战案例】Django框架使用模板渲染视图页面及异常处理 更新编…