Unity实现文本转贴图

 更新时间:2021年05月14日 15:06:00   作者:小鸟霸哥  
这篇文章主要为大家详细介绍了Unity实现文本转贴图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Unity实现文本转贴图的具体代码,供大家参考,具体内容如下

导入字体

导入ttf字体,修改Character为Custom set,并填入Custom Chars:

可以看到,Unity为我们生成了对应的材质和贴图:

从上图可以看出:

1、Unity中Texture2D的坐标原点为左下角,和OpenGL相同,V坐标与DX相反。
2、某些字符被上下翻转,某些字符被顺时针旋转了90度
这两点需要特别注意。

原理分析

本文中使用的方法是创建一个Texture,然后利用Texture2D的

public Color[] GetPixels(int x, int y, int blockWidth, int blockHeight);

成员方法,读取字体贴图中的像素信息,然后基于特定字符,利用Texture2D的

public void SetPixel(int x, int y, Color color);

方法,将像素信息写入创建的Texrue。

确定GetPixels的参数x,y时,需要注意以下两点:

1、对于被上下翻转的字符,比如数字“1”,利用CharacterInfo. uvTopLeft计算;
2、对于被顺时针旋转90度的字符,比如字母“K”,利用CharacterInfo.uvBottomRight计算。

代码实现

public Texture2D TextToTexture(
        Font font,
        string text,
        int textureWidth, int textureHeight,
        int drawOffsetX, int drawOffsetY,
        int textGap, int spaceGap, int rowHeight,
        Color textColor,
        Color backgroundColor)
    {
        // 创建返回的Texture
        var textTexture = new Texture2D(textureWidth, textureHeight, TextureFormat.ARGB32, true);
        Color[] emptyColor = new Color[textureWidth * textureHeight];
        for (int i = 0; i < emptyColor.Length; i++)
        {
            emptyColor[i] = backgroundColor;
        }
        textTexture.SetPixels(emptyColor);

        // 字体贴图不可读,需要创建一个新的可读的
        var fontTexture = (Texture2D)font.material.mainTexture;
        var readableFontTexture = new Texture2D(fontTexture.width, fontTexture.height, fontTexture.format, fontTexture.mipmapCount, true);
        Graphics.CopyTexture(fontTexture, readableFontTexture);

        // 调整偏移量
        var originalDrawOffsetX = drawOffsetX;// 记录一下,换行用
        drawOffsetY = textureHeight - drawOffsetY - rowHeight;// 从上方开始画

        // 逐个字符绘制
        foreach (var @char in text.ToCharArray())
        {
            if (@char == ' ')
            {
                drawOffsetX += spaceGap;
                continue;
            }

            if (@char == '\n')
            {
                // 换行
                drawOffsetX = originalDrawOffsetX;
                drawOffsetY -= rowHeight;

                continue;
            }


            int charWidth, charHeight;// 字符宽高
            Color[] charColor;// 字符颜色,数组内颜色的顺序为从左至右,从下至上

            font.GetCharacterInfo(@char, out CharacterInfo info);
            if (info.uvTopLeft.x < info.uvBottomRight.x)// 处理被垂直翻转的字符
            {
                charWidth = info.glyphWidth;
                charHeight = info.glyphHeight;

                charColor = readableFontTexture.GetPixels(
                    (int)(readableFontTexture.width * info.uvTopLeft.x),
                    (int)(readableFontTexture.height * info.uvTopLeft.y),
                    charWidth, charHeight);

                for (int j = 0; j < charHeight; j++)
                {
                    for (int i = 0; i < charWidth; i++)
                    {
                        if (charColor[j * charWidth + i].a != 0)
                        {
                            textTexture.SetPixel(
                                drawOffsetX + i,
                                drawOffsetY + charHeight - j,// 从上往下画,把字符颠倒过来
                                textColor);
                        }
                    }
                }
            }
            else// 处理被顺时针旋转90度的字符
            {
                charWidth = info.glyphHeight;
                charHeight = info.glyphWidth;

                charColor = readableFontTexture.GetPixels(
                    (int)(readableFontTexture.width * info.uvBottomRight.x),
                    (int)(readableFontTexture.height * info.uvBottomRight.y),
                    charWidth, charHeight);

                for (int j = 0; j < charHeight; j++)
                {
                    for (int i = 0; i < charWidth; i++)
                    {
                        if (charColor[j * charWidth + i].a != 0)
                        {
                            // 旋转
                            textTexture.SetPixel(
                                drawOffsetX + charHeight - j,
                                drawOffsetY + i,
                                textColor);
                        }
                    }
                }
            }

            // 更新偏移
            drawOffsetX += charWidth + textGap;
        }

        textTexture.Apply();
        return textTexture;
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#.net编程创建Access文件和Excel文件的方法详解

    C#.net编程创建Access文件和Excel文件的方法详解

    这篇文章主要介绍了C#.net编程创建Access文件和Excel文件的方法,结合实例形式总结分析了C#创建Access与Excel文件的几种常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#反射之基础应用实例总结

    C#反射之基础应用实例总结

    这篇文章主要介绍了C#反射之基础应用实例总结,包括了反射的基本原理与用法实例,需要的朋友可以参考下
    2014-10-10
  • C#常见算法面试题小结

    C#常见算法面试题小结

    这篇文章主要介绍了C#常见算法面试题,包含了常见的排序、字符串操作、类的操作等技巧,需要的朋友可以参考下
    2014-09-09
  • C#中GraphicsPath的Warp方法用法实例

    C#中GraphicsPath的Warp方法用法实例

    这篇文章主要介绍了C#中GraphicsPath的Warp方法用法,实例分析了Warp方法的相关使用技巧,需要的朋友可以参考下
    2015-06-06
  • C# 一个WCF简单实例

    C# 一个WCF简单实例

    以订票为例简单应用wcf程序,需要的朋友可以参考下
    2012-10-10
  • C#获得程序的根目录以及判断文件是否存在的实例讲解

    C#获得程序的根目录以及判断文件是否存在的实例讲解

    今天小编大家分享一篇C#获得程序的根目录以及判断文件是否存在的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • C#实现冒泡排序算法的代码示例

    C#实现冒泡排序算法的代码示例

    冒泡排序即是对数组每次轮循出最大数或最小数放在队尾,这里我们来看一下C#实现冒泡排序算法的代码示例,需要的朋友可以参考下
    2016-07-07
  • C# 分支与循环介绍

    C# 分支与循环介绍

    在C# 程序中有三种结构: 顺序结构,分支结构,循环结构。
    2013-04-04
  • 通过C#实现在Word中插入或删除分节符

    通过C#实现在Word中插入或删除分节符

    在Word中,分节符是一种强大的工具,用于将文档分成不同的部分,每个部分可以有独立的页面设置,如页边距、纸张方向、页眉和页脚等,本文将介绍如何使用一个免费的.NET库通过C#实现插入或删除Word分节符,需要的朋友可以参考下
    2024-08-08
  • Qt程序中调用C#编写的dll(推荐)

    Qt程序中调用C#编写的dll(推荐)

    这篇文章主要介绍了Qt程序中调用C#编写的dll,本文图文并茂给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论