unity font研究小结

语言: CN / TW / HK

项目用ngui制作的界面。字体使用了unity默认的Arial,公布后在一些android手机上发现中文不显示,就此作了一些调查。

 

 

參考unity的font说明文档:http://docs.unity3d.com/Manual/class-Font.htmlhttp://game.ceeger.com/Components/class-Font.html(中文翻译版)

1.使用动态(Dynamic)字体:

优点,动态字基本包含全部字(中文等),大小可调,显示清晰,可用于动态文本。

 

unity方便的支持ttf。otf格式的字体,字体文件放到Assets文件夹下不论什么位置,untiy会自己主动为其生成材质和贴图。

 

导入的字体能够做一些设置,在文档里对每一个都有解释。当中设置Character 为dynamic。

 

Include Font Data选中表示把该字体打包进安装包。然后安装到用户机器上去。假设用户机器自带有该字体。能够不打包进来,可是须要在Font Names指定系统要用到的字体顺序。(导入字体后Font Names属性会自己主动显示这个字体的名字,注意不是字体的文件名称。字体名是该字体的系统标示名)

对于中文字体,选择Include Font Data的问题是字库太大,比方黑体有9M。雅黑10多M。会导致安装文件增大(9M黑打打包进unity将增大安装文件5M)。假设项目要用到不止一种动态字体就更郁闷了,unity方便的支持ttf等字体对西文字符是个便利的事,对中文来讲还有瘦身等问题要处理。

假设不打包字体则须要保证系统中已经存在该字体。此时Font Names属性生效,在执行时自己主动从系统中寻找列表中的字体。直到找到为止。

假设使用unity默认动态字体Arial。对此的解释是公布到不同的平台后将默认使用当前平台的默认字体。

在測试时发如今小米1的机器上,低版本号miui系统里无法显示汉字,还有一台高版本号miui的小米手机能够显示Arial,simei等字体(不须要打包进安装文件),在一台魅族手机上測试也不能显示Arial。因此unity的Arial字体与平台的映射关系并不保险。

andriod系统有自己的默认字体Droid Sans(仅仅含西文字符)。和默认中文字体Droid Sans Fallback。unity把Arial字体在andriod平台上映射为Droid Sans (Fallback)。

 

 

在低版本号miui系统(小米1)里能够看到仅仅有一个中文字体文件DroidSansFallback.ttf,大小为2M多。拿出这个字体文件放到unity里能看到里面的字体名字是LTHYSZK。可能是由于字体名字被miui系统改成这个导致unity的Arial映射到andriod的失效。

在高版本号miui系统里有多个中文字体文件。当中DroidSansFallback.ttf的大小变为4.4M,在unity里发现字体名字已经是Droid Sans Fallback了,可见unity的Arial映射到andriod确实和字体名字有关。(没有測试过把高版本号ttf拿到低版本号miui系统里去,貌似得刷机才干測?这个结论仅仅是推測)。

在高版本号miui里多了几种中文字体,确实是属于系统定制的字体:

以下參考文章里有把andriod默认字体与微软雅黑做对照,得出两种字体非常相似的结论。相比雅黑10M以上的体积,Droid Sans Fallback想对瘦小。不知道DroidSansFallback.ttf是否包括全部的中文字符,我用2M多的DroidSansFallback.ttf測试了一些偏僻字,也没有发现缺失。(假设想用雅黑。能够用这个来替代)

 

使用Arial的另外一个问题是,作为unity默认字体。unity不会把Arial真正打包进安装文件,无法找到这个字体源文件,无法更改Font Names属性。在找不到默认字体的系统里就会不显示中文了。

所以更好的一个做法是做空壳。

导入一种字体但不打包到安装文件,设置好Font Names属性(包括各个平台的字体名列表),则在不同的平台上调用不同的字体。仅仅要确保公布时指定的Font Names属性里有目标平台的字体即可。

要明确开发时当前显示的是导入的这个字体效果,但执行时会依据系统和平台以及Font Names的设置而效果不同。

打包进嵌入的字体则会表现效果一致,唯一的问题是安装文件会增大非常多。

 

公布时发现的另外一个问题:

低版本号ngui(3.0)选择Dynamic字体,Font列表里能够选择Lucida Grande字体,在公布到andriod和winpc系统时会报错无法公布:

原因是Lucida Grande是macos下的默认字体不能够公布到其它平台(应该在macos下也不让公布Arial字体吧)。在当前操作系统windows下没有这样的字体无法公布(貌似如此,没有从macos把Lucida Grande拿过来试验。參考以下一文)。这是低版本号ngui设计的不好。ngui实际是没有动态字体的,它的动态字体实际就是调用unity的动态字体设置,自己仅仅有位图字体。在升级ngui到3.5.6之后就发现字体选项仅仅有ngui和unity,然后再选择详细用什么font。ngui最终有了自知之明。不再误导了。

并且选择unity后会屏蔽掉非当前系统的字体选项,这点改进非常好。

 

macos下用Lucida Grande字体(与雅黑接近),ios下默认是黑体-简Heiti SC(早期版本号是华文黑体)。


 

參考:

编译时,遇到Couldn't build player because of unsupported data on target platform的解决方式

http://blog.csdn.net/monzart7an/article/details/24156661

Android字体简单介绍

http://www.apkbus.com/android-58182-1-1.html

 在android系统中,DroidSans是默认字体。仅仅包括西方字符,应用程序默认情况下都会调用它。而DroidSansFallback包括了东亚字符,当须要显示的字符在DroidSans字体中不存在(如:汉字)时。即没有相应编码的字符时,系统会到DroidSansFallback中去找相应编码的字符,假设找到,则使用DroidSansFallback字体来显示它,假设仍找不到该编码相应的字符,则无法在屏幕上显示该字符。

 

关于 Android 默认字体以及对照微软雅黑字体

http://www.cnbeta.com/articles/114854.htm

 

2.bmfont

bitmap font位图字体是第二种方案,把字符集做成atlas能够灵活使用各种字体。缺点是位图无法缩放有锯齿,并且中文字符一般仅仅是引入一些经常使用字或者项目中用到的字,否则整个字符集太大。会占用太多内存。或者受unity atlas限制大小无法集成全部字符。

 

打开NGUI的bitmap font maker

NGUI 3.5.6以上版本号能够方便制作bitmapfont。须要导入FreeType.dll,假设找不到这个文件无法制作位图字体。

从NGUI的安装包import到项目中,它的默认位置是Assets/NGUI/Editor/FreeType.dll。我把这个文件挪走了须要又一次找下它,以下有Find FreeType.dllbutton。

 

font maker能够从导入的ttf来制作bimapfont:我从source里选择导入的simhei,字符集里包括东南2个字。output atlas让指定字符集图片放到哪个已有的atlas图集中,不指定就会单独生成一张。不利于drawcall,最好非常多bitmapfont图集公用一个。

 

 

我创建的字体叫heiti.prefab。由于是prefab用起来非常方便,哪里都能用。

 

使用的时候选择NGUI。然后选择这个heiti字体,仅仅有图集中有的字才会显示。

分享到: