项目用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会自己主动为其生成材质和贴图。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3AxMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3AxMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

假设使用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系统时会报错无法公布:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3AxMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

原因是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图集公用一个。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3AxMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3AxMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

unity font研究小结的更多相关文章

  1. Android与Unity交互研究

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/46733221 Android与Unity交互研究 unity与android交互的由来 ...

  2. Unity插件研究-EasyTouch V5

    抽空研究了下Easy Touch 5插件,发现确实很好用,下面是相应的用法: 1. Easy Touch Controls:实现虚拟摇杆的组件 在项目的"Hierarchy"窗口下 ...

  3. IE内存泄露与无法回收研究小结

    一.内存泄露    之前确实看了很多资料,但这位大哥的话可谓画龙点睛,不是奉承他,一下子就打通了我的任督二脉,请看: trarck 写道    IE下的内存泄露原因就是循环引用,IE的垃圾回收器不能很 ...

  4. Testlink研究小结

    1.Redmine与Testlink的关联 (1)redmine中的项目对应testlink的测试项目 (2)testllink执行用例时发现的问题可以记录到redmine中 2.Testlink优点 ...

  5. unity开发android游戏

    环境搭建: Unity+JDK+Android Studio+Android SDK(+NDK) 教程:unity开发android游戏(一)搭建Unity安卓开发环境 注意“Build System ...

  6. 【HAPPY FOREST】用Unreal Engine4绘制实时CG影像

    用Unreal Engine绘制实时CG影像 近年来,对实时CG的关心热度越来越高,但要想弥补与预渲染方式的差异并不是那么容易.这里就有影像业界的先锋进行挑战的MARZA ANIMATION PLAN ...

  7. ICE中间件说明文档

    ICE中间件说明文档 1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         ...

  8. unity--IOC框架资料整理

    今天在网上找了一些unity资料研究,出了好多问题,编译无法通过,经人指点总算成功编译运行,做个笔记,整理如下: 一.下载unity: 二.在项目中添加Microsoft.Practices.Unit ...

  9. 上传文件格式控制的困惑(application/octet-stream 限制不了BAT等格式上传)问题解决

    允许上传类型部分代码 $uptypes=array(  //上传文件类型列表 'image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image ...

随机推荐

  1. 86. Ext文本输入框:Ext.form.TextField属性汇总

    转自:https://blog.csdn.net/ryuudenne/article/details/8834650 Ext.form.TextField主要配置表: allowBlank       ...

  2. BKDRHash 算法 php 版本( 可用于 字符串 hash 为int 转)

    <?php function BKDRHash($str) { $seed = 131; // 31 131 1313 13131 131313 etc.. $hash = 0; $cnt = ...

  3. 【poj1995】快速幂

    题目大意 求a^b %p 1≤a,b,p≤10^9 思路 时间O(10^9)一定会爆T,采用数学方法+位运算,得到O(log b)的快速幂算法 代码 #include<cstdio> #i ...

  4. Blender插件初始化范例

    目标 [x] 总结Blender插件初始化范例 总结 插件模板 Blender内部插件实现方式模板功能总结如下: 定义了子模块重加载方式 定义了批量加载子模块的方式 插件注册函数 插件注销函数 模块总 ...

  5. python 线程池和锁

    一.死锁现象与递归锁 锁:Lock线程安全,多线程操作时,内部会让所有线程排队处理.如:list/dict/Queue        线程不安全 + 人 => 排队处理. import thre ...

  6. Java常见错误整理(一)

    1.配置完Java环境变量之后,仍然不能使用java命令. 解决方法: 如果是Windows10系统出现此问题,是因为个别Windows10系统不识别“JAVA_HOME”环境变量,将path中所有的 ...

  7. Linux系统下通过命令行对mysql数据进行备份和还原

    一.备份 1.进入mysql目录 cd /var/lib/mysql (进入mysql目录,根据安装情况会有差别) 2.备份 mysqldump -u root -p密码 数据库名 数据表名 > ...

  8. 【Linux】创建逻辑卷管理(LVM)

    LVM是对磁盘进行分区管理的机制.LVM有很多优点:在线扩容,跨磁盘分区......,缺点:管理相对麻烦.创建LVM的过程如下: LVM是基于普通分区或者整块硬盘来进行的.我们首先把这些存储转换为PV ...

  9. selenium选错弹出层的下拉框

    要先选中这个弹出层的form元素,再找下拉框 public void downSelectBox(){ driver.get("https://www.imooc.com/user/setp ...

  10. windows 实时性

    在硬件编程时,大部分非智能硬件并没有主动通知反馈功能,需要PC主动轮询状态寄存器去查询硬件状态.对于运动类控制器,查询的时机(间隔)在一定程度上影响着准确率与系统负载.即使不考虑系统负载,在1000H ...