(十三)文本渲染Text
unity的文本渲染通过Text组件实现,文字的渲染也离不开贴图、mesh以及材质。材质则是根据MaskableGraphic材质,所以了解Text的主线则是了解如何生成贴图和mesh即可。本文不会去讨论文字贴图和mesh产生的技术细节,只讨论如何利用unity现有的组件去获取贴图和mesh。
基本逻辑如下:
1)当需要更新时(比如更新文字大小时)标记更新材质和mesh
2)Canvas处于preRender时通过Font类获取贴图。
3)Canvas处于preRender时通过TextGenerator获取Mesh信息
贴图获取是通过字体获取,即(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)。
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中使用比较多,可以通过它获取更多信息。
上述时Text相关实现的基本逻辑,Text组件还需要进行一些特殊情况处理。下面附几篇文字渲染相关的文章:
附录一 OpenGL实现文字渲染
附录二 Unity字体渲染
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-05-23 unity基础命令