TextMeshPro
最近项目使用Unity的TextMeshPro插件实现图文混排,借这个机会记录一下该插件的使用。TextMesh是原本Unity使用的文本配置组件,但是该组件功能有限,使用位图呈现文字导致放大后字体模糊,性能消耗也大。于是有人制作了该插件弥补这些缺点,并在2017年被收录进Unity引擎。
开始使用
TextMeshPro的核心是使用纹理来表现文本,插件根据Font文件(字体)生成一个Texture Atlas,通过有符号距离场进行渲染,这里不在展开说明渲染方法。并且注意,该插件有两种,TextMeshPro配合MeshRenderer进行渲染,适用于世界坐标系中的物体;TextMeshProUGUI配合CanvasRenderer进行渲染,适用于屏幕空间的物体。除了配合的插件不同,两种类型的使用方法完全相同。
新建一个物体添加该组件,这里组件名称中的UI代表的就是UGUI配合Canvas进行渲染的类型。下面表格说明了各个属性的使用:
属性 | 说明 |
---|---|
Text Input | 文本编辑 |
Text Style | 字体风格(一些预设形式) |
Font Asset | 字体资产 |
Material Preset | 材质预设 |
Font Style | 字体风格(斜体、粗体、大小写等) |
FontSize | 字体大小 |
Auto Size | 自动设置字体大小(不超过边界) |
Vertex Color | 字体颜色 |
Color Gradient | 颜色过渡 |
Override Tags | 颜色设置是否重载 |
Spacing Options | 行距、间距设置 |
Alignment | 对齐方式 |
Wrapping | 平铺模式,Enable表示水平超过文本区域时自动换行 |
Overflow | 溢出模式 |
Rich Text
有时我们希望文本中部分字词表现不同,可以使用富文本标记来实现。和HTML语言一样,需要特殊显示的文本采用<>和>进行标记,例如在文本中单独标记一段斜体,或设置不同颜色:
1 | This is a <i>good</i> game. |
Overflow
当文字溢出容器边界时,组件提供了几种可控的方式。
Overflow模式 | 说明 |
---|---|
Overflow | 直接向下连续溢出垂直边界 |
Elipsis | |
Masking | |
Truncate | |
ScrollRect | |
Page | |
Linked | 溢出到另一个Text容器中 |
实现图文混排
可以通过右键切好的图集创建一个SpriteAsset,并使用富文本标记来将图片混排在文本中。步骤如下:
- 创建图集对应的SpriteAsset;
- 设置引用关系,有三种方式,可以全局设置Default Sprite Asset,或者组件中自行绑定,还可以在TMP Settings中根据设置的Sprite Assets路径通过富文本标记访问。
如果组件的SpriteAsset为空,那么将默认使用Default Sprite Asset,在文本中添加标记:
1 | <sprite=0> |
可以对图集中inde为0的图片进行引用。如果想单独指定使用的图集,在文本中添加标记:
1 | <sprite="图集对应SpriteAsset名称" index=0> |
组件会自动将这类标记转换为图片。图集的各项属性和其中图片的设置可以在Sprite Asset的Inspector中进行编辑,主要是设置偏移量和缩放以符合需要。