Unity 文本解决方案:富文本插件TextMeshPro

2023-10-14 15:30

本文主要是介绍Unity 文本解决方案:富文本插件TextMeshPro,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • TextMeshPro是Unity收购的一个第三方插件,现在已经自动内置到编辑器中,只要使用一次就会自动导入到工程。
  • TextMesh Pro是Unity的终极文本解决方案。它是Unity的UI Text和Text Mesh网格的完美替代品。
  • 功能强大,易于使用,TextMesh Pro使用先进的文本渲染技术,以及一套自定义着色器;提供实质性的视觉质量改进,同时给用户提供难以置信的灵活性,当涉及到文本样式和纹理。
  • TextMesh Pro提供了对文本格式和布局的改进控制,具有诸如字符、单词、行和段落间距、字距、对齐文本、链接、30多个可用的富文本标记、支持多种字体和精灵、自定义样式等功能。
  • 由于TextMesh Pro创建的几何图形和Unity的文本组件一样,每个字符使用两个三角形,所以这种改进的视觉质量和灵活性并不需要额外的性能成本。
  • 优化桌面和移动设备,TextMesh Pro带来了最先进的文本渲染统一

组件介绍:

Main Setting:
Font Asset:TMP的字体资源。
Materail Preset:字体用到的材质
Font Style:字体风格,粗体,斜体,下划线等等
Auto Size:自动适应大小(和Text一样)
Vertex Color:字体颜色
Color Gradient:勾选之后会出现渐变色的控制参数
Override Tags:勾选之后富文本的<color>标签会失效
Spacing Options:字体、单词、行、段落间距。单词的判定依据是空格,段落的判定依据是换行。
Alignment:对齐方式
Wrapping:是否自动折行
Overflow:溢出方式
    Overflow:可以溢出

    Ellipsis:超出时将超出部分用...替代

    Truncate:无法溢出

    Page:将文本内容分成很多页可以通过切换页签id来切换内容

    Linked:可以关联一个其他的TMP组件多余部分将显示在新的组件里面(实际测了下没有起效果)

    Masking:不明

    ScrollRect:不明

Extra Setting:
Margins:上下左右边界调整
Geometry Sorting:不明
RichText:是否支持父文本
Raycast Target:是否支持UI事件响应
Parse Escape Characters:是否解析转义字符
Visible Descender:不明
Sprite Asset:关联的表情资源文件(如果没有设置,在使用图文混编的时候会自动启用系统默认的表情资源)
Kerning:是否开启自动紧缩。有些字母排列在一起的时候会显得比较空如T e,开启后会显示为Te。
Extra padding:官方文档说的是某些比较小的字体在排版时可能被裁剪掉,开启该选项可以防止这个现象。目前没有遇到过这个情况,如果以后遇到了就开启试试吧。
轮廓、阴影、外发光:
以上这些特性由shader实现,所以使用这些特性需要通过调整材质面板对应的参数

轮廓:

 

outline:外轮廓参数,其中:【Color】是轮廓颜色。【Thickness】决定了外轮廓的厚度。【Texture】则会将texture的纹理采样之后和color混合输出最终颜色,这里的texture应该设置为repeat模式。因为speed参数可以使得外轮廓有一个uv流动的效果,可以用来做流动的外轮廓,如果用clamp就没有流动效果了。
Face:控制内部的表现(外轮廓以内的字体部分),和outline联合使用,其中:【Color】是内部颜色,该颜色会合字体顶点色(组件面板的Vertex Color)叠加在一起作为最终字体的颜色。【Softness】是会控制外轮廓的柔和程度。【Dilate】控制的是内部区域的大小。texture同outline,不过纹理会叠加到内部区域。
阴影:

 

轮廓参数中有一个勾选框,可以开启和禁用该特性。
【Color】阴影颜色,【Offset】阴影的偏移量,【Dilate】影响阴影大小,【Softness】柔和程度。
外发光:

 

【Color】外发光颜色,【Offset】内外交界处的偏移为整数则沿法线向外偏移,【Inner】外发光向内部扩散的距离,【Outer】外发光向外部扩散的距离,【Power】强度。
表情混编使用:
      我们平时开发游戏的时候经常会遇到图文并列的情况。比如一个上商店界面,需要在购买按钮上展示消耗的货币图标和数量。一般处理的时候都是做两个预制件,一个处理图片,一个处理文字,在用布局组件控制排版。比较繁琐。。。

      有了TMP的混编功能只需要一个TMP组件加一个带富文本的字符串就可以实现功能了。如string costtxt = string.format("<sprite=index> X {0}", costnum)。极大的简化了工作量,像一些图文混编的聊天功能也可以用TMP组件轻松的实现。ps:其中index是关联的表情资源(Extra Setting里的Sprite Asset)的序号(这个可以看表情制作这块)。

下面是一个使用的参考:

 

表情资源制作:
1.导入需要用于制作表情的图片到unity中,将Sprite Mode设置为Multiple。

2.点击sprite Editor将每一个表情分割出来。(图是百度随便扒的)


 

为了使文字和图片对齐,中心点设置为左下。
3.保存退出sprite编辑界面,右键选中处理好的图片,依次选Create->TextMeshPro->Sprite Asset即可生成Sprite Asset。

4.将生成好的Sprite Asset拖到TMP组件中使用。

 

5.编写富文本

 

6.最终效果

 

中文字体制作:
字体资源的制作有很多种方式,这里只介绍一种添加中文支持的方式(因为我在自己的项目中只用了这一种 ^-^! )。

1.在window->TextMeshPro里面打开Font Asset Creator

 

Source Font File中添加支持中文的字库
Character Set 设置为Custom Characters(自定义字符集)
Custom Character List中添加需要用到的中文字符,点击保存就得到支持中文的TMP字体了。
***这里有一个内存优化点

Atlas Resolution 决定了生成字体图片的大小

Samping Point Size 可以设置为自动尺寸和自定义尺寸两种模式

如果设置为自动尺寸则生成的单个字符会自动缩放以占满整个图片

如果设置为自定义尺寸则可以指定游戏中使用最多的那个尺寸大小,然后根据最终所有字符占用的尺寸大小来调整Atlas Resolution,以避免占用多余的内存。

关于性能:
关于性能有两个点可能要注意一下。

1.使用图文混编图片和文字会分别占用一个dc(因为二者使用的材质信息不同)。因此TMP中混编的图片同样要注意不要和字体发生重叠,否则就会打断文本自身的合并处理增加dc。如果有重叠的时候就将带图片的放在上层(貌似同一个组件中图片的层级会默认比文字高),这样文字和文字之间dc仍然是合并的。

2.TMP组件支持的外发光,光照,阴影这些特性都是在shader中实现的,如果全开的话势必会增加渲染的开销。建议根据项目情况去选择不同的shader来生成字体,比如插件自己提供的mobile里的shader(mobile里的shader不仅仅是删除了部分功能如光照外发光,本身对外轮廓,阴影的算法也做了简化)。如果使用需求明确的话,也可以根据需求去裁减修改插件提供的shader。总之够用就行。
——————— 

引用:  

https://zhuanlan.zhihu.com/p/84700094

 

 

 

这篇关于Unity 文本解决方案:富文本插件TextMeshPro的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211396

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果