项目中需要用到很多的美术字,在网上查了可以用BmFont制作,但是要把图片单独切割出来 还要一个一个导入 设置id 大小等等 真的是炒鸡繁琐 后来别人分享了另一个插件 外国大佬制作的,很牛逼 也挺好用 ,链接 但是还是逃脱不了要一个一个字敲 还是觉得很麻烦呢 。所以我制作了一个工具
效果图
1.原理
unity其实一直就有一个custom font功能,网上也能找到很多博客.
然后我们只要设置相关信息
有多少个文字,就设置相应size大小
Index:就是字符十进制索引
UV:文字在图片中的UV信息
Vert:垂直大小取决于字符的像素大小,例如 您的字符均为128x128,在Vert Width和Height中分别输入128和–128将得到适当比例的字母。 垂直Y必须为负。
Advance:从此字符的原点到下一个字符的原点的所需水平距离,差不多也就是宽了
主要 就是每个字的Index
具体可以看看unity的官方文档和另一个文章
https://docs.unity3d.com/Manual/class-Font.html
http://www.manew.com/thread-110484-1-1.html
例如我们在制作数字(0-9)字体的时候就需要 一张数字图片,然后设置Character Rects
,文档中说的很清楚,Index
就是指的当前字的 ASCII码的索引(十进制),例如0=48 1=49…..
如果我们想设置更多的文字,也是可以的,因为Unity支持Unicode,但是我们需要一些步骤,将文字->16进制->十进制
这里有个在线的转换工具:http://www.ab126.com/goju/1711.html
关于编码可以查看这篇文章:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
代码
string content = "你好";
for (int i = 0; i < content.Length; i++)
{
var bytes = Encoding.Unicode.GetBytes(content[i].ToString());
var stringBuilder = new StringBuilder();
for (var j = 0; j < bytes.Length; j += 2)
{
//x2是十六进制 两位如果没有用 0补充
stringBuilder.AppendFormat("{0:x2}{1:x2}", bytes[j + 1], bytes[j]);
}
Debug.Log(stringBuilder.ToString());
//你->4f60
//好->597d
int index = Convert.ToInt32(stringBuilder.ToString(), 16);
Debug.Log(index);
//你->20320
//好->22909
}
或者
string str = "你好";
for (int i = 0; i < str.Length; i++)
{
Debug.Log(System.Convert.ToInt32(str[i]));
//log: 20320
//log: 22909
}
然后我们把字体的”你”的Index设置成20320即可.
2.需要准备些什么
- 要一个text文本确保是utf-8格式,里面文字内容
- 要一个艺术字图片,图片大小随便定义,但是要规整的图片 而且自己要知道每个图片字的长宽
- 图片的话尽量要规整哦
3.如何使用
最后点击生成就行了 在包中我做了两个示例(图片不好看轻喷 )
4.注意
- 文本和图片字顺序要一一对应
- 有个很致命的问题 我当时开发的使用的是5.6.2是没有啥问题 但是低于5.6.2会发生字体生成的字体 不会显示 这个时候只要复制(Ctrl+D)一份生成的字体就可以了,这个估计是官方bug
还有什么问题直接github上面提问
附上地址:https://github.com/ZeroUltra/Custom-Font