(十三)文本渲染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字体渲染

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值