(十三)文本渲染Text
作者:互联网
文章目录
1.前言
unity的文本渲染通过Text组件实现,文字的渲染也离不开贴图、mesh以及材质。材质则是根据MaskableGraphic材质,所以了解Text的主线则是了解如何生成贴图和mesh即可。本文不会去讨论文字贴图和mesh产生的技术细节,只讨论如何利用unity现有的组件去获取贴图和mesh。
2.逻辑梳理
基本逻辑如下:
1)当需要更新时(比如更新文字大小时)标记更新材质和mesh
2)Canvas处于preRender时通过Font类获取贴图。
3)Canvas处于preRender时通过TextGenerator获取Mesh信息
3.贴图获取
贴图获取是通过字体获取,即(font.material.mainTexture)如下所示:
public override Texture mainTexture
{
get
{
if (font != null && font.material != null && font.material.mainTexture != null)
return font.material.mainTexture;
if (m_Material != null)
return m_Material.mainTexture;
return base.mainTexture;
}
}
Font字体类存储了字体的相关信息,如果项目种中使用了多个字体,则每个字体对应的Text列表则是通过FontUpdateTracker维护的,并且当字体贴图更改时(比如添加新字符时),通过FontTextureChanged通知Text去更新mesh以及贴图(如果cavas处于rebuilding中则只更新mesh)。
4.获取Mesh
mesh的获取是通过TextGenerator,根据字体的设置,在OnPopulateMesh中去更新网格。如下所示:其中verts 还包含了uv信息。
// Apply the offset to the vertices
IList<UIVertex> verts = cachedTextGenerator.verts;
float unitsPerPixel = 1 / pixelsPerUnit;
//Last 4 verts are always a new line... (\n)
int vertCount = verts.Count - 4;
在获取顶点数据前先通过PopulateWithErrors传入设置、文本以及本游戏物体来生成相关数据。
Vector2 extents = rectTransform.rect.size;
var settings = GetGenerationSettings(extents);
cachedTextGenerator.PopulateWithErrors(text, settings, gameObject);
TextGenerator在InputField中使用比较多,可以通过它获取更多信息。
5.结语
上述时Text相关实现的基本逻辑,Text组件还需要进行一些特殊情况处理。下面附几篇文字渲染相关的文章:
附录一 OpenGL实现文字渲染
附录二 Unity字体渲染
标签:贴图,渲染,Text,获取,mesh,字体,文本,mainTexture 来源: https://www.cnblogs.com/llstart-new0201/p/16302325.html