相关文章推荐

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

Unity开发有时候很头疼的一个问题就是字体。一方面UGUI的字体性能实在是不佳,另一方面在现在游戏发行全球化的趋势下,多语言也是一个游戏所要去面对的问题。所幸,Unity自身也开始认知到字体的问题,所以收购了TextMeshPro并逐步开始取代Unity的字体实现。

这个系列不是原创,是从翻译文章,后面就不再每篇注明了。本系列阐述了TextMeshPro的强大之处,看完之后你就可以知道,它为何可以取代Unity这么久以来的字体方案。我们现在也正在使用这个方案,目前多语言的技术方案还没有完全落地,等到技术方案验证完毕之后会也会重新总结实战的多语言方案。目前预期是会分成两个大的模块:

  1. 多语言方案-字体统筹
  2. 多语言方案-语言文本

在这之前先放一点TMP的相关资料供大家学习:

TextMesh Pro 支持两种 text Objects。一种是Unity Unity's UI(UGUI),一种是放置在3D场景里的。他们的功能大体相同,但是会有一些本质的区别。这篇教程会使用UI Object的方式描述TextMesh Pro的功能,但是会指出所有和3D object上不同的地方。

1、Text Objects

和UGUI的text创建方法一样,你可以通过GameObject - UI - TextMeshPro - Text的方式创建一个TextMesh Pro 的 UI Text.新的物体拥有一个Rect Transform和一个 Canvas Renderer组件。但是它的Text是由Text Mesh Pro UGUI组件来管理。这里的UGUI 其实代表的是 Unity的GUI的意思。你也可以自己新建一个空的GameObject,然后给它添加Text Mesh Pro UGUI组件,那么它也会自动的添加其他所依赖的组件。如下图:

1.1、UI Material

注意,对象的inspector面板也显示了用来渲染Text的Material。通常,UI objects都不会用这种方式显示他们的materials,因为它们是没有 Mesh Renderer组件的。但在这个例子中,它其实是UGUI组件的一部分。所以inspector显示也和UGUI Text的一致。如果你给这个物体添加更多的组件,那么将会显示在material的后面,除非你主动改变他们的顺序。

这个material 的inspector 提供了很方便的方式去访问text的材质,但是不太好的一点就是,UI层面的object的材质属性,不允许动态的变化。这也是TMP在UI层面上的一个技术限制。

1.2、3D Text Object

和UI的objects创建类似,3D的objects 可以通过 GameObject - 3D Object - TextMeshPro - Text的方式创建。text本身是平面的,就跟UI Text一样,不过不同的是,它是直接放置在3D Scene内,而不是一个Canvas下。

在这个例子下,大家可以看到,它已经拥有了自己的Mesh Renderer组件了。它也有一个material 的inspector 显示了,不过不同的是,这里的材质属性是可以动态变化的了。

3D objects没有 Canvas Renderer组件,但是相应的,它有一个Text Container。它和Rect Transform组件协同工作,共同负责文本区域的各种布局。虽然这些已经是3D objects了,但是它仍然使用的是可以替换的Rect Transform组件。

2、Text Input Box

text input box 是用来解决用户自定义输入的控件。下面这个就是一个默认创建的text input box。

2.1、从右到左的显示方式

你可以通过开启RTL的编辑器Toggle来切换文字的显示模式。所有的文字在显示前都会变为倒序,inspector 的面板也会添加一个默认倒序的提示文字给你提供参考。

RTL 的模式只是颠倒了文字顺序,所有其他的设置都是相同的,比如你仍然可以使用右对齐的方式展示文字。它也不会执行文本替换之类的额外操作,这其实是为兼容阿拉伯文的显示方式。

3、Font 设置

fonts settings面板可以让你选择font并且自定义风格。它也包含了一些文字对齐以及其他的一些设置选项。

3.1、 Font Asset

TextMesh Pro 使用自己的font 资源和格式。后面会有专门的教程讲解,这里不细述。但是会给一个默认的字体 Arial SDF asset。

3.2、Material 预设置

每个字体都有一个默认的材质,但是你也可以为它创建自定义的材质。你可以通过一个下拉框快速选择一个材质的变体。

预制列表是通过搜索材质名称来匹配想要的材质的。一般是匹配对应font 资源名字,然后去匹配对应的font atlas texture。

3.3、Font Style

一共有7种字体样式的切换按钮可以用来调整text的外观。如果你想要文本的某一部分有特殊表现,那么就需要使用到富文本的标签了。(富文本也是有单独章节的教程)正常的字体。

最开始的两个是 黑体和斜体。他们的出现取决于font Asset。

渐变的颜色会与vertex color相乘,如果想得到一个原始的渐变色,那就需要把vertex color设置为白色。

如果 override tags 选项勾选了,那么Rich Text的样式和颜色就会被忽略了。

3.5、Font Size

Font Size定义了字符的显示大小。你可以使用一个固定大小的,也可以使用一个自动大小的。

如果 auto size启用的话,你只需要指定一个最大值和一个最小值,TextMesh Pro会根据实际的情况决定字符的Size,通过多次的布局直到发现最合适的青睐。最终的大小会在 font size 的输入区域内显示。

WD% 区域是包含字符宽度缩减的最大百分比,它会让一个字符变的瘦长,一般会用在数字上。

你可以通过调整line的高度来适应超大的字。可以在 Line 区域填写大小。

auto size如果开启的话,text在布局的时候,会进行调整很多次,以确保找到一个最合适的方式。所以如果不是有必要最好不要去使用,如果要使用也尽量避免去显示会频繁变化的文本。如果你的文本不需要变化,你其实可以使用auto size来找到最合适的字体大小,然后切换为固定字体来显示它。

3.6、Spacing Options

字符之间,行之间或者段落之间的空隙都是可以增加或者减少的。段落是由显示换行符定义的,你可以使用这些设置来微调你的文本显示,而不需要去改变font资源。

这些设置也可以通过使用Rich text 在单个 text object里进行更改。

3.7、Alignment

一共有10中对齐方式,分割成2个组,每个组之间是互斥的。

3.7.1、Horizontal

有四种水平的对齐模式可以选择。左、中间和右 模式控制显示区域内行的显示区域。这些模式不会改变每一行的内容,但是会改变每一行的水平位置。

下面分别是左对齐,中间对齐和右对齐的文字位置。

只有完整的行才会被拉伸,如果行中间发生了中断,或者在文字的末尾,都会按照左对齐的方式执行。

3.7.2、Vertical

有六种竖对齐的模式,顶、中间、和底部对齐,就像前面水平对齐的那三种一样,只不过这是在垂直方向的。

第四种方式是baseline,它定位内容,使第一行文本的基线与显示区域的中间对齐。当只有一行文本时,这可能比较有用。

第五种方式是midline ,它的行为类似于中间垂直对齐,但它使用文本网格的边界来确定垂直位置,而不是行高。

这在比较狭小的空间内比较有用,在ascender或者descender的时候不至于差距太大。

最后一种是 capline,它和baseline 比较像,但是是使用第一行文本的中间进行对齐。

3.8、Wrapping & Overflow

当 wrapping启用的时候,文字将会被自动换行。文字换行会确保它们的宽度不会超过显示区域,通常是会在某个单词结尾的时候进行换行,但是如果一个单词真的是太长了,也会被截断。

overflow通常在文本区域显示不下文字内容的时候发生。Overflow 意味着,文字将会超出它的显示边界。althrough 则会强制换行,Ellipsis 会被强制截断并且插入"…",Truncate 简单切掉显示不下的内容。

下面分别显示的是 Overflow, ellipsis, 和 truncate的情况。

Page 的模式会将文字单独裁减成适合显示的几个页面来适配选择区域。然后你可以选择显示哪一页。由于每一页的显示变成了独立的,所以垂直对齐就是基于每一个来进行作用了。你也可以使用Rich Text手动插入分页符达到同样的效果。

Masking的渲染方式和overflow比较像,但是所有在显示区域外的文字会被Shader隐藏。这个只在UI objects上有效,3D objects上无效。Scroll Rect 其实和这个是同样的表现,但是它不太受欢迎。

3.9、UV Mapping

你可以通过Shader使用一张额外的纹理贴图覆盖在文字之上。UV映射控制纹理的表现情况。每个维度都可以使用不同的设置。X维度或者是Y维度。

纹理的wrap mode应该设置为 repeat 不然 显示可能会不正确。

字符的纹理依据每个字符sprite,所以每个字符显示的是同一个Image,但是拉伸确实基于自己的宽高比。

Character–character mapping

Line 拉伸纹理是依据行的高和宽。(Line–line mapping)

Paragraph–paragraph mapping.

Match Aspect确保纹理在一个维上被缩放到它保持原来的纵横比。这可以确保纹理不会变形。纹理如何映射到文本是由另一个维度控制的,因此不能将两者都设置为匹配方面。

Character–match aspect mapping.

UV offset可以用来调整纹理在X和Y方向的相对位置。当这些偏移被添加到纹理坐标中时,为了直观地向正方向移动纹理,将不得不应用负偏移量。

在使用Line或Paragraph 映射时,还有一个行偏移量,它被添加到每个连续行的X偏移量中。你可以用这个做倾斜变形。

Line–line mapping with offset

3.10、Kerning and Padding

kerning用来控制是否使用字体的字间距数据,这对于没有字间距数据的字体没有影响。

Extra padding 使渲染每个字符的sprites最大化。创建一些几何图形是为了适应可见的文本,但是这并不是每次都是完美契合的,在sprites 加入一些额外的填充来阻止多边形在sprite的边界被切割。

4、Extra Settings

Extra Settings的区域,包含了一些乱七八糟的小选项。

Margins的数值可以用给文本和内容边界之间添加一些空隙。你也可以使用一些负边距,这可能会导致文本超出文本框的边界之外。你也在场景视图里,通过拖拽的黄色矩形的方式来调整Margins。

Rich Text的功能是默认开启的,你可以根据需要手动关闭。那么所有的样式都不会被解析,直接原文呈现。

你可以自己勾选是否把text当做是 raycast target。如果禁用的话,UI会忽略鼠标或者点击事件。

Parse Escape Characters 如果开启的话,反斜杠转义字符会被解析为特殊的字符。所以\n就会换行,\t就会制表,等等。请注意,这适用于实际文本,如用户输入。但在代码中,会由编译器解析转义字符。

可以通过脚本限制多少个字符可见。这个可以用来模拟打字机效果。

Visible Descender控制底部垂直对齐的的工作方式,如果它开启了,文本会在底部显示,随着行被释放,文本会慢慢的向上推高。如果禁用的话,就正常的从上往下显示。

4.1、 3D Text Object

3D text objects有一些不同,它不包含margins 和 raycast-target 的设置。

Sorting Layer 和 Order settings用于微调对象的渲染顺序。

Orthographic 的选项用于 正焦摄像机的模式,防止字体产生透视。

默认的,quads用来显示字母。Volumetric Setup 激活另外一个模式,这种模式下使用多维数据集。这允许立体字符渲染,但目前还没有对此功能支持的着色器。

5、 Text Container

UI text object是依赖于UI canvas来确定它的位置和大小的,这是通过RectTransform 组件实现的。虽然3D text object也有RectTransform 组件,但是它并不能访问canvas 的布局系统。所以,它需要一个自己的容器组件。

Anchor Position 和Dimensions 的设置,模仿画布的功能实现。

Margins 的一些数值也在这里进行设定,而不是在UI text object的Extra Settings里设置。

原文链接: https://zhuanlan.zhihu.com/p/90759281 更方便的做法是专门创建一个用于补字的兜底字库,将它放在fallbackList的最后,其对应ttf字体包含几乎所有字形,其CharacterSequence仅按需添加。最终保存为asset文件。由于 Text Mesh Pro 创建的几何图形每个字符使用两个三角形,就像 Unity 的文本组件一样,因此这种改进的视觉质量和灵活性没有额外的性能成本。在这个前提下,我们希望各个字库间尽可能无重复(防止不同语言下看同一个字的样式不同),所以我们需要将源ttf文件进行子集筛选,让它仅存在对应语言的字,或仅存在符号字。 转载原文地址: Unity 3d Text Mesh Pro 教程 Text Mesh Pro Unity 默认文本组件的替代品。 Text Mesh Pro 和默认组件一样拥有高性能,它使用了完全不同的Signed Distance Field(SDF)渲染技术,该技术最初由Valve在《军团要塞2》中使用。 Text Mesh Pro 能够很轻松就能让文本看起来更美观,还提供了更高级的控制功能,你可以通过检视窗口和脚本控制文本效果。 当你在项目中使用 Text Mesh Pro ,它拥有改进的视觉效果。由于使用SDF渲染技术,你可以 本人英语渣渣翻译,稍微删减了些自认为可以忽视的部分,原文地址 http://digitalnativestudios.com/ text mesh pro /docs/ text mesh pro -component/ Text Object s Text Mesh Pro 可分为两种游戏物体,一个用于 Unity UI,另一个是用于3D场景。二者功能大体相同,但也有少许本质区别。本文使用UI方面那类来描述功能,也会指出二者的不同。 1 Text Object s 你可以通过Game Object >UI> Text - Text Color Gradient:勾选之后会出现渐变色的控制参数 Override Tags:勾选之后富文本的<color>标签会失效 Spacing Options:字体、单词、行、段落间距。单词的判定依据是空格,段落. 0.动态字体生成 新版本的 Text Mesh Pro 已经支持动态字体库生成,像中文日文韩语这些,不需要再像以前那样把整个字体库生成,这样会占用很多内存 测试新生成的空动态字体在8k左右,测试3500个汉字都能够正常显示 1. Text Mesh Pro UGUI 文本框,支持标签如下且不仅限于 表情<sprite=1> 字体大小<size=30>大小 字体颜色<color=#FFFFFF>白色 项目背景所谓选型,我认为就是为了实现某(些)个需求或者解决某(些)个问题所使用的解决方案。它可能是一个技术方案,也可能是一个管理方案,也可以是一个软件、工具或者是流程规范。这篇的主题是技... Text Mesh Pro Unity 默认文本组件的替代品。 Text Mesh Pro 和默认组件一样拥有高性能,它使用了完全不同的Signed Distance Field(SDF)渲染技术,该技术最初由Valve在《军团要塞2》中使用。 Text Mesh Pro 能够很轻松就能让文本看起来更美观,还提供了更高级的控制功能,你可以通过检视窗口和脚本控制文本效果。 当你在项目中使用 Text Mesh . 这是侑虎科技第605篇文章,感谢作者放牛的星星供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859) 作者主页:https://www.zhihu.com/people/niuxingxing,作者也是U Sparkle活动参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划,这个舞台有你更精彩! 一、ECS设... 1 游戏是一个项目 这是从0开始 SLG 系列的开篇,但是本篇却不准备讲 SLG 类型相关的东西。在开始 SLG 项目搭建之前,想先说下我理解的游戏开发到底是个什么东西。 游戏开发从开发模式上可以理解为一个做一个项目,和各种工程项目相比它们都有一个共同的特征,用PMP里的定义就是: 项目是为创造独特的产品、服务或成果而进行的临时性工作。 对的 你没看错,它其实是一个临时性的工作。或许你会拿《魔兽世界》来打比方,05年运行到现在已经10几年了,怎么可能是临时性的呢?那么我要说明两点: 1、即使一个项目持续100年,它也是 国内政策的收紧,让游戏行业不得不转向海外市场以谋求生存。一方面,国外市场的游戏监管目前还较为宽松(得益于分级制度),另一方面,相对于内卷的国内市场而言,国外市场还是一大片的蓝海,短时间内...
 
推荐文章