返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Unity实现文本转贴图
  • 880
分享到

Unity实现文本转贴图

2024-04-02 19:04:59 880人浏览 泡泡鱼
摘要

本文实例为大家分享了Unity实现文本转贴图的具体代码,供大家参考,具体内容如下 导入字体 导入ttf字体,修改Character为Custom set,并填入Custom Char

本文实例为大家分享了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;
    }

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

--结束END--

本文标题: Unity实现文本转贴图

本文链接: https://lsjlt.com/news/125993.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Unity实现文本转贴图
    本文实例为大家分享了Unity实现文本转贴图的具体代码,供大家参考,具体内容如下 导入字体 导入ttf字体,修改Character为Custom set,并填入Custom Char...
    99+
    2024-04-02
  • 使用Unity怎么将文本转换为贴图
    使用Unity怎么将文本转换为贴图?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。导入字体导入ttf字体,修改Character为Custom set,并填入Custom Cha...
    99+
    2023-06-15
  • Unity实现仿3D轮转图效果
    本文实例为大家分享了Unity实现仿3D轮转图效果的具体代码,供大家参考,具体内容如下 一、效果演示 二、实现思路 ——获取位置:可以将每个item的运行轨...
    99+
    2024-04-02
  • Unity实现贴花效果的制作教程
    目录一、前言二、实现方式介绍三、实现过程检测UV位置并替换像素颜色:修改替换信息为图片信息:运行时使用复制贴图:修改帧检测断触问题:总结一、前言 在云艾尔登法环时,看到地面上的血迹时...
    99+
    2024-04-02
  • Webjs实现复制文本到粘贴板
    本文实例为大家分享了Web js实现复制文本到粘贴板的具体代码,供大家参考,具体内容如下 一、简述 记--简单用js实现将元素的文本内容复制到粘贴板。 二、效果 三、代码 <...
    99+
    2024-04-02
  • unity实现场景跳转
    本文实例为大家分享了unity实现场景跳转的具体代码,供大家参考,具体内容如下 话不多说直接开始操作步骤。 1.打开我们的unity创建一个工程,打开后我们先搭一个场景,建立一个Bu...
    99+
    2024-04-02
  • Unity UI实现拖拽旋转
    本文实例为大家分享了Unity UI实现拖拽旋转的具体代码,供大家参考,具体内容如下 跟随鼠标旋转 第一种效果是跟随鼠标旋转,原理是计算下鼠标位置与拖拽物体的相对位移 旋转方向即可 ...
    99+
    2024-04-02
  • Vue实现输入框回车发送和粘贴文本与图片功能
    目录实现回车发送粘贴文本粘贴图片总结上一篇中,我们初步新建了一个可“双向绑定”的聊天输入框,结合实际使用的场景,如果仅仅只是实现了“双向绑定&rd...
    99+
    2024-04-02
  • js默认文本框粘贴事件怎么实现
    本文小编为大家详细介绍“js默认文本框粘贴事件怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“js默认文本框粘贴事件怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先上代码  &...
    99+
    2023-07-05
  • Python 实现语音转文本
    Python 实现语音转文本 Python可以使用多种方式来实现语音转文本,下面介绍其中两种。 方法一:使用Google Speech API Google Speech API 是 Google 在...
    99+
    2023-09-10
    python 语音识别 开发语言
  • Unity实现切割图集工具
    本文实例为大家分享了Unity实现切割图集工具的具体代码,供大家参考,具体内容如下 操作步骤 先将脚本拖入Editor 1.选中要切割的图片,texture type 选为defau...
    99+
    2024-04-02
  • unity实现方向盘转动效果
    本文实例为大家分享了unity实现方向盘转动效果的具体代码,供大家参考,具体内容如下 效果 手指或鼠标拖动方向盘旋转,有角度限制,松手后自动回转。 代码 将代码添加到方向盘Imag...
    99+
    2024-04-02
  • 基于Python实现文本文件转Excel
    目录一、前言二、openpyxl模块1、安装2、简单操作三、文本文件转excel文件1、寻找规律2、开始转换补充一、前言 Excel文件是我们常用的一种文件,在工作中使用非常频繁。E...
    99+
    2024-04-02
  • js默认文本框粘贴事件完美实现详解
    目录前言先上代码代码分析前言 本文实际是用js移动控制光标的位置!解决了网上没有可靠教程的现状 默认情况对一个文本框粘贴,应该会有这样的功能: 粘贴文本后,光标不会回到所有文本的最...
    99+
    2023-01-28
    js默认文本框粘贴事件 js文本框粘贴
  • Unity 实现删除missing脚本组件
    通过Resources.FindObjectsOfTypeAll查找所有GameObject,然后通过.hideFlags == HideFlags.None判断是否为存在于Hier...
    99+
    2024-04-02
  • Unity&Springboot实现本地登陆验证
    目录Springboot使用IDEA编译器IDEA上实现登录验证返回登录是否成功和登陆用户的id信息Unity端的请求Springboot使用IDEA编译器 IDEA上实现登录验证 ...
    99+
    2024-04-02
  • NodeJS实现图片文本分割
    本文实例为大家分享了NodeJS实现图片文本分割的具体代码,供大家参考,具体内容如下 var fs = require('fs'); var jpeg = require('j...
    99+
    2024-04-02
  • python怎么实现图片转文字
    本文小编为大家详细介绍“python怎么实现图片转文字”,内容详细,步骤清晰,细节处理妥当,希望这篇“python怎么实现图片转文字”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。python图片转文字用pytho...
    99+
    2023-07-05
  • VBS如何实现DOC转为文本文档
    这篇文章主要介绍了VBS如何实现DOC转为文本文档,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。打开记事本输入:  代码如下:ON ERROR ...
    99+
    2023-06-08
  • php怎么实现时间转文本
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php怎么实现时间转文本?可以通过strtotime函数转换。strtotime() 函数将任何字符串的日期时间描述解析为 Unix 时间戳(自 January 1 19...
    99+
    2017-06-15
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作