ugui Custom Font使用

原文地址 https://blog.csdn.net/pz789as/article/details/54313122

Unity5.5

一:准备工作

1、把字体图片放到Assets->Resources里面

2、设置改图片

  • Sprite Mode为multiple
  • Sprite Editor,先Slice 然后在Apply

这里写图片描述

这里写图片描述

3、Sprite Editor命名自己规范一下!我现在命名是使用的名字的最后一个字符去定义的,类似我下面的截图:

这里写图片描述

二、实现图片到字体的转换

1、在Assets下创建一个Editor的文件夹

在里面创建一个CustomFont的类 
类的内容如下:


using UnityEngine;
using UnityEditor;
using System.IO;

public class CustomFont : MonoBehaviour
{
    //本方法是通过裁切的sprite导出字体文件,裁切使用的是unity自带的sprite editor,方便操作。
    //另外,裁切之后,每个sprite的名字的最后一个字符对应了ascii码的编码,比如:
    //0: 我们只要将sprite的名字命名成xxx0,就可以了!
    //由于使用到的了sprite加载,所以字体图片请放在Resources目录下面,等制作完毕,再把他们放到fonts文件夹或者其他文件夹中即可。
    [MenuItem ("Assets/CreateMyFontSprite")]  
    static void CreateMyFontSprite ()
    {  

        Debug.LogWarning ("abc");  

        if (Selection.objects == null)
            return;  
        if (Selection.objects.Length == 0) {  
            Debug.LogWarning ("没有选中Sprite文件,需要将Sprite Mode设置成Multiple,切分好,并且以以名字的最后一个字符当做ascii码");  
            return;  
        }  
        string resoursePath = "Resources";  
        UnityEngine.Object o = Selection.objects [0];  
        if (o.GetType () != typeof(Texture2D)) {  
            Debug.LogWarning ("选中的并不是图片文件");  
            return;  
        }  
        string selectionPath = AssetDatabase.GetAssetPath (o);  
        if (selectionPath.Contains (resoursePath)) {  
            string selectionExt = Path.GetExtension (selectionPath);  
            if (selectionExt.Length == 0) {  
                return;  
            }  
            string loadPath = selectionPath.Remove (selectionPath.Length - selectionExt.Length);  
            string fontPathName = loadPath + ".fontsettings";  
            string matPathName = loadPath + ".mat";  
            float lineSpace = 0.1f;//字体行间距,下面会根据最高的字体得到行间距,如果是固定高度,可以在这里自行调整  
            loadPath = Path.GetFileNameWithoutExtension (selectionPath);  
            Sprite[] sprites = Resources.LoadAll<Sprite> (loadPath);  
            if (sprites.Length > 0) {  
                //以textrue方式获得该资源,可以设置到创建的材质中去  
                Texture2D tex = o as Texture2D;  
                //创建字体材质,并且将图片设置好  
                Material mat = new Material (Shader.Find ("GUI/Text Shader"));  
                AssetDatabase.CreateAsset (mat, matPathName);  
                mat.SetTexture ("_MainTex", tex);  
                //创建字体文件,设置字体文件的材质  
                Font m_myFont = new Font ();  
                m_myFont.material = mat;  
                AssetDatabase.CreateAsset (m_myFont, fontPathName);  
                //创建字体中的字符集数组  
                CharacterInfo[] characterInfo = new CharacterInfo[sprites.Length];   
                //得到最高的高度,设置行高和进行偏移计算  
                for (int i = 0; i < sprites.Length; i++) {  
                    if (sprites [i].rect.height > lineSpace) {  
                        lineSpace = sprites [i].rect.height;  
                    }  
                }  
                for (int i = 0; i < sprites.Length; i++) {  
                    Sprite spr = sprites [i];  
                    CharacterInfo info = new CharacterInfo ();  
                    //设置ascii码,使用切分sprite的最后一个字母  
                    info.index = (int)spr.name [spr.name.Length - 1];  
                    Rect rect = spr.rect;  
                    //根据pivot设置字符的偏移,具体需要做成什么样的,可以根据自己需要修改公式  
                    float pivot = spr.pivot.y / rect.height - 0.5f;  
                    if (pivot > 0) {  
                        pivot = -lineSpace / 2 - spr.pivot.y;  
                    } else if (pivot < 0) {  
                        pivot = -lineSpace / 2 + rect.height - spr.pivot.y;  
                    } else {  
                        pivot = -lineSpace / 2;  
                    }  
                    Debug.Log (pivot);  
                    int offsetY = (int)(pivot + (lineSpace - rect.height) / 2);  
                    //设置字符映射到材质上的坐标  
                    info.uvBottomLeft = new Vector2 ((float)rect.x / tex.width, (float)(rect.y) / tex.height);  
                    info.uvBottomRight = new Vector2 ((float)(rect.x + rect.width) / tex.width, (float)(rect.y) / tex.height);  
                    info.uvTopLeft = new Vector2 ((float)rect.x / tex.width, (float)(rect.y + rect.height) / tex.height);  
                    info.uvTopRight = new Vector2 ((float)(rect.x + rect.width) / tex.width, (float)(rect.y + rect.height) / tex.height);  
                    //设置字符顶点的偏移位置和宽高  
                    info.minX = 0;  
                    info.minY = -(int)rect.height - offsetY;  
                    info.maxX = (int)rect.width;  
                    info.maxY = -offsetY;  
                    //设置字符的宽度  
                    info.advance = (int)rect.width;  
                    characterInfo [i] = info;  
                }  
                // lineSpace += 2;  
                m_myFont.characterInfo = characterInfo;  
                EditorUtility.SetDirty (m_myFont);//设置变更过的资源  
                AssetDatabase.SaveAssets ();//保存变更的资源  
                AssetDatabase.Refresh ();//刷新资源,貌似在Mac上不起作用  

                //由于上面fresh之后在编辑器中依然没有刷新,所以暂时想到这个方法,  
                //先把生成的字体导出成一个包,然后再重新导入进来,这样就可以直接刷新了  
                //这是在Mac上遇到的,不知道Windows下面会不会出现,如果不出现可以把下面这一步注释掉  
                AssetDatabase.ExportPackage (fontPathName, "temp.unitypackage");  
                AssetDatabase.DeleteAsset (fontPathName);  
                AssetDatabase.ImportPackage ("temp.unitypackage", true);  
                AssetDatabase.Refresh ();  

                //最佳高度:上下各留一个像素的间距,如果不需要可以注释掉,根据需求更改  
                //打印是为了使使用者方便填写行高,因为font不支持设置行高。  
                Debug.Log ("创建字体成功, 最大高度:" + lineSpace + ", 最佳高度:" + (lineSpace + 2));  
            } else {  
                Debug.LogWarning ("没有选中Sprite文件,需要将Sprite放到Resources文件夹下面,可以参考函数上方的说明操作");  
            }  
        }  
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115

2、生成字体

我们运行的程序然后在Assets下发现了CreateMyFontSprite菜单

[MenuItem ("Assets/CreateMyFontSprite")]  
  • 1

选中Resources中图片->点击Assets下的CreateMyFontSprite,就可以生成并导入字体了

这里写图片描述

点击CreateMyFontSprite会提示一个导入字体的提示窗

这里写图片描述

选择导入有如图 
这里写图片描述

然后就可以使用这个字体了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值