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

猜你喜欢

转载自blog.csdn.net/qq_37833413/article/details/124931165