也许你也曾被游戏中的对话系统深深吸引,那些精心设计的对白、鲜活的角色配音、甚至是简单的文字对话,往往能让玩家产生强烈的代入感和情感共鸣。如果你正在开发一款游戏,或者计划为你的项目加入一个引人入胜的对话系统,那么 Unity 中的 TextMesh Pro (TMP) 是你不可忽视的利器。
在这篇博客中,我们将深入探讨如何利用 TMP 实现一个灵活而精致的对话系统。
前置知识
一.富文本
1.定义
富文本(Rich Text)是指一种支持多种格式、样式和布局的文本内容,区别于普通的纯文本。它允许在文本中包含不同的字体、颜色、大小、加粗、斜体、下划线、列表、超链接等元素,从而提供更加丰富和多样的视觉呈现。
显著特征:标签的作用域和嵌套
标签的作用域是用来定义它影响文本的范围,通常情况下添加的标签会影响它之后的所有文本。
例如:We are <b>not</b> friend 此处的字体加粗格式只会应用在not字符串。
2.Unity中的富文本
在 Unity 中,富文本通常通过 Text
组件或 TextMeshPro
组件来实现。Unity 允许开发者在文本中嵌入HTML-like 标签,以达到不同的视觉效果。
该标记系统受 HTML 的启发,但并不打算与标准 HTML 严格兼容。基本思想是可以将文本的一部分包含在一对匹配标签内。 ——摘自unity文档
TMP支持非常多样的富文本标签
二.正则表达式
正则表达式(Regular Expression,简称Regex)是一种用于描述字符串匹配规则的工具。它允许你通过特定的语法来定义字符串的模式,从而用于查找、匹配、替换、验证或分割字符串。正则表达式广泛应用于文本处理、数据验证、日志分析、编程语言的词法分析等领域。
在 Unity 中,正则表达式(Regular Expressions,简称 Regex)通常用于处理和分析字符串数据,尤其是当你需要在字符串中查找、替换、验证或者提取特定模式的信息时,正则表达式显得非常有用。
在我们的实验中,将会使用正则表达式来完成 字符匹配,字符替换,字符删除等相关操作。实现基于个性化需求的富文本格式。
三.TextMeshPro
在 Unity 中,TextMeshProUGUI
是用于在 UGUI 系统中显示文本的组件类,它是 TextMesh Pro 插件的一部分。TextMesh Pro 是 Unity 的一种高级文本渲染技术,提供比标准 Unity UI 文字渲染更好的字体效果、更高的性能和更多的文本样式定制功能。
我们可以打开TextMeshPro-Text组件的脚本,其实这个组件就是TextMeshProUGUI类实现的
。
我们可以写一个继承TextMeshProUGUI 的子
类,挂载到一个UI物体上发现效果和我们直接创建一个TextMeshPro是一样的效果。
public class AdvancedText : TextMeshProUGUI
{}
1.关键变量概念:
1*preprocesser(预处理器)
preprocesser 是 TextMesh Pro 内部的一个核心组成部分,它的主要作用是将文本内容转换为适合渲染的格式,并进行一些必要的预计算和优化。预处理器通常在文本内容或样式更新时运行,确保文本的渲染更加高效和准确。
主要作用
-
文本解析与标记处理:TextMesh Pro 支持 富文本(Rich Text),这意味着它可以解析并渲染包含特定标签(如
<b>
,<i>
,<size=24>
等)的文本。预处理器负责解析这些富文本标签,并将其转化为 样式信息,以便在后续的渲染过程中使用 -
字符映射与字体纹理:TextMesh Pro 使用 位图字体 或 动态字体 来渲染字符。预处理器会根据文本内容查找每个字符对应的 字符映射,然后从 字体纹理图集 中提取出相应的字符纹理。
-
文本布局与排版:预处理器还负责进行 文本布局 和 排版,如换行、字符间距、行间距等。TextMesh Pro 支持复杂的排版效果,比如自动换行、文本缩放、字母和行的对齐等,预处理器会根据这些规则来决定每个字符的位置
2*characterinfo
CharacterInfo
主要用于存储与单个字符相关的详细信息。它通常表示一个字符(包括其位置、大小、样式、纹理等)在渲染过程中的一些元数据。每个 CharacterInfo
对象包含了该字符的所有渲染信息,包括它的 位置、宽度、高度、基线、字符的材质信息 等。
在 TMP 中,CharacterInfo
是非常基础的单位,表示一个单独字符的几何数据。它通常用于生成每个字符的渲染网格,并帮助计算字符之间的距离、对齐等。
3*textinfo
TextInfo
是 TMP 渲染过程中更高级别的结构体,它包含了整个文本块的详细信息。TextInfo
汇总了文本中所有字符的信息,并对整个文本的渲染过程进行更广泛的管理。它不仅包含了字符信息,还包括文本的布局、材质、字体、字体图集等各种信息。
TextInfo
是对文本内容的高层次表示,它将所有字符、行和字词的信息都组织起来,使得 TMP 可以更高效地处理文本渲染、样式应用和布局计算等操作。它负责将 CharacterInfo 集合在一起,形成一个完整的文本渲染结构。
注意
CharacterInfo 是 TextInfo 的组成部分:TextInfo
是一个包含多个 CharacterInfo
对象的结构体。在渲染过程中,TMP 会通过 TextInfo.textElementInfo[]
数组来访问所有字符的详细信息,而每个 CharacterInfo
则存储一个字符的具体几何信息(如顶点位置、纹理等)。
TextInfo
包含了整个文本块的布局信息,包括字符的数量、排版、字体样式,而 CharacterInfo
则专注于每个字符的具体渲染数据。
2.TMP运作原理
-
初始化阶段:当你第一次创建或修改
TextMeshProUGUI
组件时,预处理器会解析文本内容,并创建对应的 字符网格、材质 和 字体图集。此时会加载字体纹理图集,并计算所有字符的排列。 -
文本内容变更时:每当你更新文本内容(例如修改
text
属性)时,TextMesh Pro 会调用预处理器preprocessor重新解析新的文本。预处理器会根据新的文本内容生成新的字符网格、更新字符的字体材质,重新计算布局。 -
渲染阶段:在渲染过程中,TextMesh Pro 会根据预处理器生成的网格数据在 GPU 上渲染文本。如果文本内容没有发生变化,TextMesh Pro 会尽可能复用现有的网格和材质,从而提高渲染效率.
实现需求
我们将一起实现一个完备的对话系统,包含的功能如下:
1.自定义富文本格式的应用
2.淡入淡出动画效果
3.打字机动画效果
4.头缀注释
5.多样回答选择
在你的Unity编辑器项目中导入TMP资源,至此,我们完成了简单的知识介绍和前置准备。
本篇完