使用unity的时候经常会用到较多的字体,本篇文章讲一下unity如何自定义字体以及在使用字体时的优化

如何使用Unity自定义字体

​ unity其实一直就有一个custom font功能,网上也能找到很多博客

然后设置相关参数

具体可以看看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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
}

然后我们把字体的”你”的Index设置成20320即可

这里我做了一个工具:https://github.com/ZeroUltra/Custom-Font

Unity中的字体优化

字体都包含一个材质一个贴图 我们使用的大多都是动态字体( 动态字体,如果所输入的文字在字体中找不到相应的编码,就会自动从系统默认字体中找到该字体),有个很大的问题就是,动态字体会自己调节贴图大小来更换图集,在程序运行过程中,动态赋值text文本字体,贴图没有文字默认是64*64大小,但是当文字越来越多的时候就会把贴图撑大。

我在text中输入了很多文字之后

另外,如果文字的Font Style 不同 在材质贴图中也会多加一份

也会根据字体大小 多追加一份

所以综上:我们可以拟定两个方案:

  1. 如果已经知道图集包含的特定字,通过裁剪文字将文字内容固定,裁剪文字将会降低内存大小 裁剪文字有很多种方法,比如 BMFont自己制作 FontSubsetGUI裁剪文字 另外Unity 也有自带的字体裁剪,这里说明一下

导入字体库选择Custom Set,然后

我只让改字体库包含 “你好”两个字,那么在Text 文本上 将不会显示其他的文字

也会降低内存

如果想要的文字一个个输入有些麻烦 这里有个帮助类.可以快速添加需要的文字

http://1vr.cn/?p=607&cpage=1#comment-89612

脚本

字体的一些tips

  • 推荐使用TextMeshPro!!!
  • 使用UGUI Text RichText会让面数倍增
  • 尽量不要使用UI Shadow和Outline