我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Unity怎么将文本转换为贴图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Unity怎么将文本转换为贴图

使用Unity怎么将文本转换为贴图?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

导入字体

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

使用Unity怎么将文本转换为贴图

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

使用Unity怎么将文本转换为贴图

使用Unity怎么将文本转换为贴图

从上图可以看出:

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”,利用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;    }

看完上述内容,你们掌握使用Unity怎么将文本转换为贴图的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Unity怎么将文本转换为贴图

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Unity怎么将文本转换为贴图

使用Unity怎么将文本转换为贴图?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。导入字体导入ttf字体,修改Character为Custom set,并填入Custom Cha
2023-06-15

使用Canvas怎么将文本转换为粒子效果

使用Canvas怎么将文本转换为粒子效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现原理总的来说要做出将文本变成粒子展示的效果其实很简单,实现的原理就是使
2023-06-09

使用JAVA怎么将PDF转换为HTML文档

使用JAVA怎么将PDF转换为HTML文档?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。引入Maven依赖