MeshComponents
3D网格是Unity的主要图形基元。Unity存在各种组件来渲染常规的mesh或skinned meshes,trails(轨迹),3D lines
一、Meshes
(1).Meshes
mesh构成了3D世界的很大一部分。除了一些Asset store的插件外,Unity不提供建模工具。然而,Unity与大多数3D建模软件包有很好的交互性。Unity支持三角形或四角形多边形网格。Nurbs,Nurms,Subdiv曲面必须转换为多边形。
(2).Textures
Unity将根据特定的搜索计划尝试在导入时自动查找网格使用的纹理。首先,importer将在与网格相同的文件夹中或在任何父文件夹中查找名为Textures的子文件夹。如果失败,将执行醒目中所有纹理的穷尽搜索。虽然稍慢,但穷举搜索的主要缺点是项目中可能有两个或多个具有相同名称的纹理。在这种情况下,不能保证找到合适的那个。
(3).Material生成与分配
对于每个导入的Material,Unity将应用以下规则:
如果禁用了Material生成(即取消选中"Import Material"),则会分配Default-Diffuse材质。如果已经启用,则它将执行以下操作:
·Unity将根据Material Naming设置为Unity Material选择一个名称
·Unity将尝试查找具有该名称的现有Material。Material搜索的范围由Material Search设置。
·如果Unity成功找到现有Material,那么它将用于导入的场景,否则它将生成新的Material。
(4).Colliders
Unity使用两种主要类型的colliders:Mesh Colliders和Primitive Colliders.Mesh colliders是使用导入的mesh data的组件,可用于environment collision.在Import Settings中启用Generate Colliders时,将mesh添加到scene时会自动添加Mesh collider.就物理系统而言,它被认为是实体的。
如果你正在移动物体(例如汽车),则无法使用Mesh colliders,此时可使用Primitive colliders。在这种情况下,你应该禁用Generate Conlliders设置。
(5).Animations
你可以从模型文件中导入动画。在将其导入Unity之前,要遵循从3D建模软件导出FBX文件的准则
(6).法线贴图和角色
如果你的角色具有从模型的高多边形版本生成的法线贴图,则应导入game-quality version,其Smoothing angle为180度。这可以防止由于切线分裂而导致照明时有奇怪的接缝。如果这些设置后仍然存在接缝,可以在UV接缝处启用Split tangents。
如果要将灰度图像转换为法线贴图,则无需担心这一点。
(7).Blendshapes
Unity支持BlendShapes(也称为morph-targets或vertex level animation)。Unity可以从.FBX(BlendShapes和controlling animation)和.dae(仅BlendShapes)导出的3D文件中导入BlendShape。Unity BlendShapes支持顶点,法线和切线上的vertex level animation。Mesh可能同时受skin和BlendShapes的影响。使用BlendShapes导入的所有mesh都将使用SkinnedMeshRenderer(无论它是否有skin)。BlendShape动画将作为常规动画的一部分导入。它只是在SkinnedMeshRenderer上设置BlendShape权重的动画
有两种方法可以使用法线导入BlendShapes:
1.设置Normals import模式为Calculate,这种方法将用相同的方式计算mesh和BlendShapes上的法线。
2.将smoothing groups information导出到源文件。这样,Unity将为mesh和BlendShapes的smothing groups计算法线
如果要在BlendShapes上使用切线,可将Tangents import模式设置为Calculate。
(8).提示
·尽可能将mesh合并在一起。让他们分享materials和textures.这具有巨大的性能优势。
·如果你需要在Unity中进一步设置对象(添加physics,scripts或者其他东西),注意在3D应用程序中保存一个正确命名的对象。
·使你的mesh在3D应用程序中以世界原点为中心。这将使它们更容易放入unity。
·如果网格没有顶点颜色,Unity将在第一次渲染时自动将全白顶点颜色数组添加到mesh中。
(9).Unity编辑器显示更多的顶点或三角形(与3D应用程序相比)
这是对的。你正在查看的是实际发送到GPU进行渲染的顶点/三角形的数量。除了Material要求它们被发送两次的情况之外,其他诸如hard-normal和非连续UV的情况导致比3D建模应用相比显著增加了顶点/三角形数量。三角形需要在3D和UV空间中形成连续的条带,因此当你有UV接缝时,必须使退化三角形形成条带,这也会增加计数。
二、Material
Material与Mesh Renderers,Particle Systems和Unity中使用的其他渲染组件结合使用。它们在定义对象的展示方式中起着至关重要的作用。
(1).Properties
Material inspector显示的属性由Material使用的Shader确定。Shader是一种特殊类型的图形程序,用于确定如何组合纹理和光照信息以在屏幕上生成渲染对象的像素。
三、Mesh Filter
Mesh Filter从你的assets中获取mesh,并将其传递给Mesh Renderer以在屏幕上渲染。
(1)Properties
Property | Function |
---|---|
Mesh | 将要渲染的mesh的引用。mesh位于Assets目录中 |
(2)Details
导入mesh assets时,如果mesh被蒙皮,Unity会自动创建Skinned Mesh Render,否则会自动创建Mesh Filter。
要在场景中查看mesh,可以向GameObject添加Mesh Renderer,此时会自动添加Mesh Filter。但如果从GameObject中删除它,则必须手动重新添加它。如果Mesh Renderer不存在,Mesh仍将存在于场景(和计算机内存)中,但不会被绘制。
四、Mesh Renderer
Mesh Renderer从Mesh Filter中获取几何体,并将其渲染到GameObject的Transform组件定义的位置。
(1).Properties
Property | Function |
---|---|
Light Probes | 基于探头的光照插值模式 |
Off: | 渲染器不使用任何插值Light Probes |
Blend Probes | 渲染器使用一个插值Light Probe。这是默认选项 |
Use Proxy Volume | 渲染器使用插值Light Probes的3D网格 |
Reflection Probes | 指定GameObject如何受场景中的反射影响。你无法在deferred渲染模式下禁用此属性 |
Off | Reflection Probes被禁用,skybox将用于反射 |
Blend Probes | Reflection probes已启用。仅在probes之间发生混合,在室内环境中有用。如果附近没有reflection probes,渲染器将使用默认reflection,但默认reflection和probe之间不会发生混合。 |
Blend Probes and Sky | Reflection probes已启用。混合发生在probes之间或probes与默认reflection之间,适用于室外环境。 |
Simple | 启用Reflection probes,但当存在两个重叠的体积时,probes之间不会发生混合 |
Anchor Override | 当Light Probe或Reflection Probe系统被使用时,使用Transform用于确定插值位置, |
Cast Shadows | |
On | 当shadow-casting Light照在它上面时,Mesh会投下阴影 |
Off | Mesh不会投射阴影 |
Two Sided | 从Mesh的两侧投射双面阴影。Enlighten和Progressive Lightmapper不支持双面阴影。 |
Shadows Only | Mesh中的阴影将是可见的,但Mesh本身不可见 |
Receive Shadows | 启用此复选框可使Mesh显示任何投射在其上的阴影。仅在使用Progressive Lightmapper时才支持使用Receive Shadows选项 |
Motion Vectors | 如果启用,则该线会将motion vectors渲染到Camera motion vector Texture中.可查看Renderer.motionVectorGenenationMode(通过跟踪相邻两帧之间的像素速度产生运动向量。可以使用它来应用某些特殊的图像特效,例如运动模糊和时序抗锯齿) |
Lightmap Static | 启用此复选框可向Unity指示GameObject的位置是固定的,并且它将参与全局光照计算。如果某个GameObject未标记为Lightmap Static,则仍可使用Light Probes为改GameObject提供光照 |
Materials | 用于渲染模型的Materials列表 |
Dynamic Occluded | 启用此复选框可向Unity指示应对此GameObject执行occlusion culling,即使它未标记为静态。 |
勾选lightmap static复选框以在Inspector中显示MeshRender Lightmap信息(另参阅GameObject的静态复选框)
(2).UV Charting Control
Property | Function |
---|---|
Optimize Realtime Uvs | 指定是否针对实时全局照明优化制作的Mesh UVs。启用后,为了进行优化会对制作的UV进行合并、缩放以及打包。禁用时,制作的UV将进行缩放和打包,但不会合并。注意:优化有时会对原始UV贴图中的不连续行进行误判。例如:有意锐利的边缘可能被误解为连续表面。 |
Max Distance | 指定用于简化UV图表的最大世界空间距离。如果图表在这个距离之内,它们将被简化。 |
Max Angle | 指定共享UV边缘的面之间的最大角度(以度为单位)。如果面之间的角度低于此值,则将简化UV图表。 |
Ignore normal | 选中此框可防止在Global Illumination lighting的预计算过程中拆分UV图表 |
Min Chart size | 指定用于UV图表的最小纹理像素大小。如果需要拼接,则需取值为4来创建4x4纹素的图表以存储照明和方向性。如果不需要拼接,则取值2可以降低纹理像素密度并提供更好的光照构建时间和游戏性能。 |
(3).Lightmap settings
Property | Function |
---|---|
Scale in Lightmap | 此值指定lightmap中GameObject的UV的相对大小。值为0将导致GameObject未被lightmapped,但它仍将有助于照亮场景中的其他GameObject。大于1.0的值会增加用于此GameObject的像素数(即lightmap resolution),而小于1.0的值会减小改值。你可以使用此属性来优化光照贴图,以便更精确地照亮重要和细节的区域。例如:一个拥有平坦、黑暗墙壁的隔离建筑将使用低光照贴图比例(小于1.0),而靠近在一起显示的彩色摩托车集合需要高比例值 |
Prioritize illumination | 选中此框以告知Unity始终在照明计算中包含此GameObject。对于强烈放射性的游戏对象很有用,以确保其他游戏对象将被此游戏对象照亮。 |
Lightmap Parameters | 允许你为此GameObject选择或创建一组Lightmap参数。 |
(4).Details
从3D包导入的Mesh可以使用多个Materials.Mesh Renderer使用的所有Materials都保存在Material列表中。每个子Mesh使用Material列表中的一个Material。如果为Mesh Renderer分配的Material多于Mesh中的子Mesh,则使用剩余的每个Material渲染第一个子Mesh,一个Material加在下一个Material之上。这允许你在该子Mesh上设置多次渲染。注意,这可能会影响运行时的性能。另注意,完全不透明的材质,只是覆盖以前的图层,导致性能下降而没有任何优势。
Mesh可以接收来自Light Probe系统的光和来自Reflection Probe系统的反射,具体取决于Use Light Probes和Use Reflection Probes选项的设置。对于这两种类型的Probes,单个点用作Mesh的概念位置进行Probes插值。默认情况下,这是Mesh边界框的中心,但你可以通过拖拽Transform到Anchor Override属性来更改此值(Anchor Override会影响两种类型的探测)
在GameObject包含两个相邻Mesh的情况下设置anchor可能很有用;由于每个Mesh都有一个单独的边界框,因此默认情况下两者在连接处光照不连续。但是,如果将两个Mesh设置为使用相同的锚点,则它们始终被照亮。默认情况下probe-lit Renderer从单个Light Probe接收光照,该Light Probes从场景中的周围Light Probes进行插值。因此,GameObject在整个表面上具有恒定的环境照明。它具有旋转渐变,因为它使用球谐函数,但它没有空间渐变。这在较大的游戏对象或粒子系统上更明显。GameObject上的灯光与锚点处的光照相匹配,如果GameObject跨越光照渐变,GameObject的某些部分将看起来不正确。
要缓解此行为,可将Light Probes属性设置为Use Proxy Volume,并使用额外的Light Probe Proxy Volume组件。这样就能在包围体内生成插值Light Probes的3D网格,其中网格的分辨率可由用户指定。Light Probes插值的球谐函数系数被更新到3D纹理中,在渲染时将对这些纹理进行采样以便计算对漫反射环境光照的影响。这为probe-lit的GameObject添加了空间渐变。
五、Skinned Mesh Renderer
Unity使用Skinned Mesh Render组件渲染骨骼动画,其中Mesh的形状由预定义的动画序列变形。这种技术对于关节弯曲的角色和其他物体非常有用(与hinges joints的机器相对)
Skinned Mesh Renderer会自动添加到导入时需要它的任何Mesh中。
(1).Properties
Property | Function |
---|---|
Cast Shadows | 如果启用,当合适的光照射在网格上时,网格将投射阴影 |
Receive Shadows | 如果启用,网格将显示其他对象投射的阴影 |
Motion Vectors | 如果启用,则该线会将motion vectors渲染到Camera motion vector Texture中。可参阅Renderer.motion |
Materials | 渲染Mesh使用的Material列表 |
Light Probes | 基于Probe的光照插值模式 |
Reflection Probes | 如果启用,并且场景中存在Reflection Probes,则为此GameObject拾取reflection Texture并将其设置为内置的shader的uniform变量 |
Anchor Override | Transform用于确定插值位置,当Light Probe或Reflection Probe系统被使用时 |
Quality | 定义蒙皮时每个顶点使用的最大骨骼数。骨骼数量越多,渲染的质量越高。将Quality设置为Auto以使用Quality窗口中的Blend Weight |
Skinned Motion Vectors | 如果启用,则Mesh的蒙皮数据将被双重缓冲,以便可以插值蒙皮动作并将其放入motion vector Texture中。这具有GPU内存开销,但是会得到更加正确的motion vectors |
Update When Offscreen | 如果启用,即使所有相机都无法看到skinned mesh,也会更新它。如果禁用,当GameObject在屏幕外时,他们本身的动画将停止运行 |
Mesh | 使用此选项定义此Renderer使用的Mesh |
Root Bone | 使用此选项可以定义作为动画的根骨骼(即,所有其他骨骼相对于其移动的骨骼) |
Bound | 用于判断Mesh是否超出屏幕外的Bound体积。bound是在模型文件中的mesh和animation导入时预先计算的,并在场景视图中显示为模型周围的线框。 |
(2).Details
骨骼是Skinned Mesh内的不可见对象,会影响Mesh在动画过程中变形的方式。基本思想是将骨骼连接在一起形成一个分层的"骨架(skeleton)",并通过旋转骨架的关节使其移动来定义动画。每个骨骼都关联着Mesh周围的一些顶点。播放动画时,顶点随着它们所连接的骨骼移动,因此skin跟随skeleton移动。简单的关节(例如,肘部),Mesh顶点受到这里的两个骨骼影响,并且当关节弯曲时,Mesh将随着伸展和旋转。在更复杂的情况下,可能会有两个以上的骨骼影响网格的特定区域,从而产生微妙的移动。
尽管Skinned Mesh最常用于预定义动画,但也可以将Rigidbody组件附加到skeleton上,以将其置于Physics engine的控制之下。这通常用于创建"布娃娃(ragdoll)"效果,比如角色的四肢在爆炸或爆炸击中后的表现
(3).Quality
Unity可以用一个,两个或四个骨骼对每个顶点进行skin。使用四个骨骼可以获得最佳结果,但这会带来更高的处理开销。游戏通常使用两个骨骼权重,这是在视觉质量和性能之间平衡的结果。如果Quality设置为Auto,Unity将使用Quality窗口中设置的Blend Weight值。这允许最终由用户自己选择Quality设置并获得动画质量和帧帧速率的期望平衡
(4).Update When Offscreen
默认情况下,不更新任何摄像机不可见的skinned Meshes。在Mesh回到屏幕范围内之前,不会更新Mesh。这样做是为了节省系统资源。
对象的可见性由Mesh的Bound确定(即,整个bound体积必须位于所有激活的相机的视野之外)。但是,动画Mesh的真实Bound体积可以随着动画的播放而变化(例如,如果角色在空中举手,则Bound体积会变高)。Unity在计算最大Bound体积时会考虑所有附加的动画,但有时无法计算Bound以预测每个可能的用例。
以下每个示例情况在将骨骼或顶点推出预先计算的bound体积时会出现问题:
·动画在运行时添加
·附加动画
·通过脚本改变骨骼的位置
·使用vertex shaders将顶点推到预先计算的bounds之外
·使用布娃娃(ragdolls)
在这些情况下,有两种解决方案:
·修改Bound以匹配Mesh的潜在Bound体积
·启用Update When Offscreen,以始终进行skin以及渲染skinned Mesh
通常应该使用第一个选项,因为它更有利于性能。但是如果性能不是主要问题,或者如果无法预测Bound体积的大小(例如:使用ragdolls时),第二个选项更可取。
为了使Skinned Meshes在ragdolls更好的工作,Unity会在导入时自动将Skinned Mesh Renderer重新映射到root bone。但是,只有模型文件中只有一个Skinned Mesh Renderer,Unity才会执行此操作。这意味着如果你无法将所有Skinned Mesh Renderers附加到root bone或子节点,并且你使用ragdolls,则应关闭此优化。
(5).Importing skinned Meshes
目前skinned Meshes可以从以下位置导入:
·Autodesk® Maya®
·Cinema4D
·Autodesk® 3ds Max®
·Blender
·Cheetah 3D
·XSI
·任何支持FBX格式的工具
在移动设备上,Unity使用手动编码的NEON/VFP程序集处理CPU上的skin。这里的一个限制是法线和切线没有标准化,所以如果你正在编写自己的着色器,你应该自己处理标准化。但是,如果使用Surface Shader,Unity会自动处理标准化。
注意:优化的Mesh骨骼的排序和非优化的Mesh不同,从而导致潜在的重大动画问题。这是因为非优化的Mesh依赖骨骼顺序来制作动画,而优化骨骼使用骨骼名称而不依赖于骨骼顺序。
如果你只是导入FBX文件并使用它,Unity将负责转换的顺序问题。
如果要更改SkinnedMeshRenderer.sharedMesh:
1.在非优化模式下,你需要确保SkinnedMeshRenderer.bones严格匹配SkinnedMeshRenderer.sharedMesh。引用的Transforms应该就会以以正确的顺序存在。
2.在优化模式下,会更简单,只要Avatar具有引用的骨骼,渲染就会起作用。在这种情况下,SkinnedMeshRenderer.bones始终为空。
六、Text Mesh
Text Mesh生成显示文本字符串的3D几何体
你可以通过Component>Mesh>Test Mesh创建一个新的Text Mesh
(1).Properties
Property | Function |
---|---|
Text | 将被渲染的文本 |
Offset Z | 绘制时文本应从transform.position.z偏移多远 |
Character Size | 每个字符的大小(这会缩放整个文本) |
Line Space | 文本行之间会有多少空间 |
Anchor | 文本的哪一点共享Transform的位置 |
Alignment | 如何对齐文本行(左,右,中) |
Tab Size | tab’\t’字符将插入多少空格。这是空格键(spacebar)偏移的倍数 |
Font Size | 字体的大小。这可以覆盖动态字体的大小 |
Font Style | 字体的渲染样式。字体需要标记为dynamic |
Rich Text | 选择此选项后,将在渲染文本时启用tag处理 |
Font | 渲染文本时使用的TrueType Font |
Color | 渲染文本时使用的全局颜色 |
(2).Details
Text Meshes可用于渲染道路标志,涂鸦等。Text Mesh将文本放置在3D场景中。要为GUI制作通用2D文本,请改用GUI Text组件。
按照以下步骤使用自定义字体创建Text Mesh:
1.通过将TrueType字体(.ttf文件)从Explorer(Windows)或Finder(OS X)拖动到项目视图中来导入字体。
2.在Project View中选择导入的字体
3.选择GameObject>Create Other>3D Text。你现在已经使用自定义TrueType Font创建了text mesh。你可以使用Scene View的Transform控件缩放文本并移动它。
注意:如果是要更改Text Mesh的字体,需要设置组件的字体属性,并将字体材质的纹理设置为正确的字体纹理。可使用font asset的foldout来定位此纹理。如果你忘记设置纹理,则mesh中的文本将显示为块状且未对齐。
(3).提示
·你可以从1001freefonts.com下载免费的TrueType字体(下载Windows字体,因为它们包含TrueType字体)
·如果要编写Text属性的脚本,则可以通过在字符串中插入转义字符"\n"来添加换行符。
·可以使用简单标记设置Text meshes样式。【StyledText】
·通过首先将字体自行渲染到纹理贴图来渲染Unity的字体。如果字体大小设置得太小,这些字体纹理将显示为块状。由于TextMesh资源是使用四边形渲染的,因此如果TextMesh和字体纹理的大小不同,TextMesh可能会出错。
7.Text Asset
Text Assets是导入文本文件的格式。将文本文件拖放到项目文件夹中时,它将转换为Text Asset。支持的文本格式为:
.txt,.html,.htm,.xml,.bytes,.json,.csv,.yaml,.fnt
注意:出于使用AssetDatabase.FindAssets函数的目的,脚本文件也被视为text asset,因此当此函数与"t:TextAsset"过滤器一起使用时,它们也将包含在结果列表中。
(1).Properties
Property | Function |
---|---|
Text | asset的全文作为单个字符串 |
(2).Details
Text Asset是一个非常详细的用例。在构建游戏时,将文本从不同的文本文件添加到游戏中非常有用。你可以编写一个简单的.txt文件,在游戏中可以很容易的读取这个文本。但它不适用于在运行时生成文本文件。为此你需要使用传统的Input/Output编程技术来读写外部文件。
请考虑以下情形:你正在制作一个传统的文字冒险游戏。为简化生产,你希望将游戏中的所有文本分解为不同的房间。在这种情况下,你将创建一个文本文件,其中包含将在一个房间中使用的所有文本。从那里可以很容易地为你输入的房间引入正确的text asset。然后使用一些自定义的解析逻辑,你可以非常轻松地管理大量文本。
(3).Binary data
text asset的一个特殊功能是它可以存储二进制数据。通过为文件提供扩展名.bytes,可以将其作为text asset加载,并且可以通过bytes属性访问数据。
例如:将一个jpeg文件放入Resources文件夹并将扩展名更改为.bytes,然后使用以下脚本代码在运行时读取数据:
using UnityEngine;
public class LoadBinaryData : MonoBehaviour
{
void Start()
{
TextAsset bindata = Resources.Load("Texture") as TextAsset;
Texture2D tex = new Texture2D(1, 1);
tex.LoadImage(bindata.bytes);
}
void Update()
{
}
}
注意:扩展名为.txt和.bytes的文件将分别视为文本和二进制文件。不要尝试使用.txt扩展名存储二进制文件,因为这会在尝试从中读取数据时发生意外行为。
(4).提示
·Text Assets与构建中的所有其他资产一样被序列化。发布游戏时不包含物理文本文件
·Text Assets不适用于在运行时生成文本文件。
8.Font
可以创建或导入Font以在GUI Text或Text Mesh组件中使用。
(1).Importing Font files
要在项目中添加字体,需要将字体文件放在Assets文件夹中。然后Unity会自动导入它。支持的字体格式是TrueType字体(.ttf文件)和OpenType字体(.otf文件)
要更改字体的大小,请在Project View中点击改字体,此时Inspector的Import Settings中有许多选项。
Property | Function |
---|---|
Font Size | 字体的大小,基于任何文字处理器中设置的大小 |
Rendering mode | 字体渲染模式,告诉Unity如何对字形应用平滑 |
Character | 要导入字体纹理的字体的字符集 |
将此模式设置为Dynamic会导致Unity嵌入字体数据本身在运行时渲染字体字形(参见下文) |
导入特定于dynamic font的设置:
Property | Function |
---|---|
Include Font Data | 与Dynamic font属性一起使用时,此设置控制字体的packaging。选择后,TTF将包含在构建的输出中。如果未选择,则假定最终用户将在其计算机上安装该字体。注意:字体受版权包含,你应包含已为自己许可或创建的字体。 |
Font Names | 当字体或字符不可用时使用的后备字体列表(见下文) |
导入字体后,可以在"Project View"中展开字体,以查看它是否已自动生成某些资源。导入期间创建两个资源:“font material"和"font texture”。可能与你熟悉的许多应用程序不同,Unity中的字体会转换为纹理,并且你显示的字形将使用纹理四边形进行渲染。有效地调整字体大小会更改此生成纹理中每个字形使用的像素数。Text Mesh是使用这些自动生成的字体纹理的3d几何texture。你需要改变字体的大小以使这些asset看起来清晰。
(2).Dynamic fonts
在Import Setting中将Characters下拉列表设置为Dynamic时,Unity不会预先生成包含所有font characters的纹理。相反,它将使用FreeType font字体渲染引擎动态创建纹理。这样做的好处是它可以节省下载大小和纹理内存,特别是当你使用通常包含在用户系统中的字体时,你不必包含字体数据,或者当你需要支持亚洲语言或大字体大小(使用普通纹理会使字体纹理非常大)
当Unity尝试使用dynamic font渲染文本,但无法找到字体时(为选择Include Font Data,并且用户计算机上未安装字体),或者字体中不包含请求的字形(例如:尝试使用latin font在Asian脚本中渲染文本,或者使用粗体/斜体文本时),它将尝试Font Name字段中列出的每种字体,以查看它是否可以在项目中找到匹配字体名称的字体(包含字体数据).或安装在具有请求的字形的用户机器上的字体。如果没有返回当前请求的字形的字体,Unity将调用hard-coded golbal字体列表,其中包含当前运行平台上通常会安装的各种国际字体。
注意:某些目标平台(WebGL,某些控制台)没有Unity可以访问的默认字体来渲染文本。对于这些平台,将忽略Include Font Data设置,始终包含font data。所有用于调用的字体都必须包含在项目中,因此如果需要渲染国际文本或粗体/斜体版本的字体,则需要添加一个具有项目所需字符的字体文件,并设置该字体在其他字体的Font Names列表中用作后备。如果字体设置正确,则后备字体将在Font Importer inspector中列出,作为对项目中其他字体的引用。
(3).Default font asset
默认font asset是dynamic font,设置为使用Arial.如果Unity无法再你的计算机上找到Arial字体(例如,如果你没有安装它),它将调用unity捆绑的字体,名为Liberation Sans。
Liberation Sans看起来像Arial,但它不包括粗体或斜体字体样式,并且只有一个基本的Latin字符集-所以样式文本或non-latin字符可能会调用其他字体渲染或无法渲染。但是它有许可证,允许它包含在玩家构建中。
(4).Custom fonts
要创建自定义字体,从project窗口中选择"Create->custom font"。这会将自定义font asset添加到项目库中。
Ascii Start Offset字段是一个十进制数,它定义了你想要从Character Rects索引中开始的Ascii索引。例如,如果你的Ascii Start Offset设置为0,则大写字母将位于所以65处,但如果Ascii Start Offset设置为65,则字母A将位于索引0.你可以在此查阅【Ascii】,但是你应该记住,自定义字体使用十进制Ascii编号系统。
Tracking用于修改同一行的相邻字符的接近程度,Line Spacing用于设置行间距以定义每行与下一行的接近程度。
要创建font material,你需要将字体作为纹理导入,然后将该纹理应用于材质,然后拖拽font material到Default Material处。
Character Rects用于定义字体的每个字符的位置。
Size字段用于定义字体中的字符数。
在每个Element中,有一个用于字符Ascii索引的Index字符,这是一个整数,表示此元素中的字符
要计算出UV值,你需要确定字符在0-1范围内的位置。为此应将1除以尺寸上的字符数。例如,你有一个字体,其上的图像尺寸为256x128,横跨4个字符,向上2个(即每个字符为64x64),则UV宽度将为0.25,UV高度为0.5。
对于UV X和Y,只需要确定所需的字符,并将宽度或高度值乘以字母的列/行。
Vert尺寸基于字符的像素大小,例如:你的字符每个都是128x128,将128和-128放入Vert Width和Height,将给出正确比例的字母。VertY必须为负数
Advance是从该字符的原点到下一个字符的原点所需的水平距离(以像素为单位).在计算实际距离时,应将其乘以Tracking。
(5).Unicode support
Unity拥有完整的unicode支持。Unicode文本允许你显示ASCII字符集通常不支持的德语、法语、丹麦语或日语字符。如果你的字体支持,你还可以输入许多不同的特殊用途的字符,例如箭头符号或选项键符号。
要使用unicode字符,可从Import Setting中的Characters的下拉列表中选择Unicode或Dynamic。你现在可以使用此字体显示unicode字符。如果你使用的是GUIText或Text Mesh,则可以在Inspector的组件的Text字段中输入unicode字符。
如果要从脚本中设置显示的文本,也可以使用unicode字符。c#编译器完全支持基于unicode的脚本。你必须使用UTF-16编码保存脚本。现在,你可以将unicode字符添加到脚本中的字符串中,他们将在UnityGUI,GUIText或Text Mesh中按预期显示。
注意:不支持surrogate pairs。
(6)Changing Font Color
根据字体的使用方式,有多种方法可以更改显示字体的颜色。
GUIText and Text Mesh
如果你使用的是GUIText或Text Mesh,可以使用字体的自定义材质更改其颜色。在Project View中,单击Create->Material,然后在Inspector中选择并设置新创建的材质。确保将纹理从font asset指定给材质。如果对font asset使用内置GUI/Text Shader着色,则可以在材质的Text Color属性中选择颜色。
UnityGUI
如果使用UnityGUI脚本来显示字体,则可以在不同情况下更好地控制字体颜色。要更改字体的颜色,可以从Assets>Create>GUI Skin创建GUISkin,并定义特定控件状态的颜色,例如:Assets>Create>GUI Skin
(7).提示
·要显示导入的字体,可以选择font并选择GameObject>Create Other->3D Text
·你可以通过仅使用小写或大写字符来减少生成的字体纹理大小。
参考资料
【法线贴图原理及常见问题】https://bopsun.wordpress.com/2015/07/02/法线贴图原理及常见问题/
【Unity预计算实时GI(一)介绍】https://blog.csdn.net/SwordMaster8060/article/details/78639901
【StyledText】https://docs.unity3d.com/Manual/StyledText.html
【Ascii】https://ascii.cl/
【自定义字体】https://liusuwanxia.github.io/unity/2017/08/16/Custom-Font
【GUISkin】https://docs.unity3d.com/Manual/class-GUISkin.html