Unity中制作图片字体

主要步骤:

1.新建一个字体。
在这里插入图片描述
2.新建一个材质。

在这里插入图片描述
3.把上一步新建的材质赋值给第一步创建的字体。
在这里插入图片描述
4.设置字体的Character Rects的大小来划分字体。
例如划分这个图片,因其要分为12个字体所以Character Rects大小为12:
在这里插入图片描述
在这里插入图片描述
Character Rects中每个单元格的计算方式如图所标记(比较的复杂,了解怎么计算就行,后期通过编辑器可以计算出来。)
在这里插入图片描述
5.把设置好的字体直接赋值给Text中的Font,在Text中输入对应字体便可显示了。
在这里插入图片描述

标题上述制作字体设置参数比较繁琐,可以直接用编辑器一键生成字体和材质。编辑器代码如下。
public class ImageFontMaker
{

    [MenuItem("Assets/CreateImageFont")]
    static void CreateImageFont() {

        if ( Selection.objects == null  ) { return; }

        for (int i = 0; i < Selection.objects.Length; i++)
        {
            if (Selection.objects[i].GetType() == typeof(Texture2D)) {

                CreateImageFont(Selection.objects[i] as Texture2D);
            }
        }

    }

    public static void CreateImageFont( Texture2D texture ) {

        if ( texture == null ) return;
        string texturePath = AssetDatabase.GetAssetPath(texture);
        string textureExtension = Path.GetExtension(texturePath);
        string filePath = texturePath.Remove(texturePath.Length - textureExtension.Length);

        string matPath = filePath + ".mat";
        string fontPath = filePath + ".fontsettings";

        Font myFont = AssetDatabase.LoadAssetAtPath<Font>(fontPath);
        if ( myFont == null ) {
            myFont = new Font();
            // 设置材质 
            Material mat = new Material(Shader.Find("GUI/Text Shader"));
            mat.SetTexture("_MainTex", texture);
            AssetDatabase.CreateAsset(mat, matPath);
            myFont.material = mat;
            AssetDatabase.CreateAsset(myFont, fontPath);
        }
        
        
        // 设置字符信息
        Sprite[] sprites = LoadSpritesByPath(texturePath);
        if (sprites.Length == 0 ) return;
        CharacterInfo[] characterInfos = new CharacterInfo[sprites.Length];
        for (int i = 0; i < characterInfos.Length; i++)
        {
            characterInfos[i] = new CharacterInfo();
            // 设置 ascii 码  
            characterInfos[i].index = sprites[i].name[sprites[i].name.Length - 1];

            // 设置 字符 uv 
            Rect rect = sprites[i].rect;

            characterInfos[i].uvBottomLeft = new Vector2( rect.x / texture.width , rect.y / texture.height);
            characterInfos[i].uvBottomRight = new Vector2((rect.x +rect.width) / texture.width, rect.y / texture.height);
            characterInfos[i].uvTopRight = new Vector2((rect.x + rect.width) / texture.width, (rect.y + rect.height) / texture.height);
            characterInfos[i].uvTopLeft = new Vector2(rect.x / texture.width,(rect.y + rect.height) / texture.height);

            // 字符的偏移 和 宽高 
            characterInfos[i].minX = 0;
            characterInfos[i].maxX = (int)rect.width;
            characterInfos[i].minY = 0 - (int)sprites[i].pivot.y;
            characterInfos[i].maxY = (int)rect.height - (int)sprites[i].pivot.y;

            characterInfos[i].advance = (int)rect.width;

        }

        myFont.characterInfo = characterInfos;

        EditorUtility.SetDirty(myFont);
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();


    }

    public static Sprite[] LoadSpritesByPath(string path) 
    {
        List<Sprite> sprites = new List<Sprite>();

        Object[] objects = AssetDatabase.LoadAllAssetsAtPath(path);
        foreach (var item in objects)
        {
            if ( item.GetType() == typeof(Sprite) ) 
            {
                sprites.Add(item as Sprite);
            }
        }

        return sprites.ToArray();
    }

}

编辑器使用方法:选中要生成字体的Texture 右键选择CreateImageFont即可生成对应字体和材质。

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值