【转】Unity中,使用Ngui 的默认字体Arial,显示出错;附带字体替换脚本
来源:互联网 发布:最新网络流行的英文词 编辑:程序博客网 时间:2024/04/28 19:57
【原贴地址已失效 转载过来备用】
Unity工程中的动态字体使用很方便,在一开始的工程中,为了减小游戏包的大小,我们使用的是Unity内置的默认Arial字体,但是在游戏上线测试后,很多玩家反馈个别机型字体显示不完全,主要集中在 小米1代,OPPO,金立,中兴等个别机型中。刚开始以为是NGUI的问题,经过几天的问题排查,发现原来是Arial字体惹的祸。
Arial字体是西文字体,并不包含中文字库,在Unity中如果使用默认的Arial字体,在程序运行过程中如果遇到字库中没有的字,程序就会从系统默认字库中查找对应的文字,如果字库中也没有这些字,那么就会造成字体不显示的现象,在Android系统中Unity默认会去查找名为DroidSansFallback的字体,这个字体是android默认的字体,但是因为android系统的可定制性,太过自由,很多手机厂商或者第三方rom爱好者为了追求个性化,会去修改默认字体,替换成其他的字体,android系统是根据字体的文件名称DroidSansFallback.ttf来找这个字体的,所以修改者只用将想要使用的字体文件名称改为DroidSansFallback.ttf就可以在android系统中使用了。但是Unity识别字体却不是通过字体的文件名称来识别的,而是通过字体内部的设置来识别,如下图:
这个字体是win8系统默认的字体,双击预览能够看到字体名称是Aharoni,Unity就是通过这个名称来找默认字体的,这就导致了那些被修改了默认字体的android系统无法显示字体,(此现象也出现在个别window xp系统中)。
问题出现的原因找到了,那么就容易解决了,我们只要找到一个不是太大的符合自己要求的字体,放入到unity中,所有使用Arial字体的地方,都换成自己添加的动态字体即可。
1 Font Names 默认倒入的一个字体,这个地方会显示这个字体的真实名字,这个参数的主要作用实际上是设置替代字体用的,当程序需要某一个字体时,首先会从当前字体查找字符,如果没有找到,会依次查找FontNames列表里的其他字体中的字符,直到找到,或者找完为止。例图中中添的几个替代字体MYingHeiGB18030C-Bold, Droid Sans, Droid Sans Fallback, LTHYSZK,第一个MYingHeiGB18030C-Bold是当前字体的名称(可以不用填),第二个,第三个是android系统里的字体,第四个是小米1代所使用的字体。
Incl.FontData 选项打上勾,在倒出包的时候会把该字体添加到包中,若不打勾,则不会将该字体打包,程序运行时就会从FontNames列表里检索需要的字体,如果没有,字体就不会显示。
如果你的游戏中一直都在使用字体A,突然有天Boss说,这个字体不好看!给我换成B字体!苦逼的你该怎么办?一个一个改么?其实通过上边所说的两个参数,把A字体的Incl.Font Data不勾选,然后将B字体的FontName 填入A的FontNames里,而B字体的Incl.Font Data打勾,我们可以很巧妙的将字体A全部替换成B字体,同时打包的时候又保证了只有B字体。
因为Unity的默认字体Arial是如此的不爽,所以在此建议大家不要在工程中使用Arial字体(纯英文游戏除外)。下边贴一个写的批量替换NGUI中的Arial字体为指定字体的脚本,将其放入Asset /Editor文件夹下,即可在导航栏生成工具菜单:
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; public class FontReplese { //批量替换场景中的字体 [MenuItem ("Custom/Label/ChangeSceneLabel" )] public static void ChangeSceneFont () { List<UILabel> labelList = NGUIEditorTools.FindAll<UILabel> (); ChangeLabelFont ( labelList ); } public static void ChangeLabelFont ( List<UILabel> labelList ) { Font mFont = NGUIEditorTools.LoadAsset<Font>("Assets/Font/FZCYJW.TTF");//注意这个地方是要替换成的字体的路径 if ( mFont ==null ) { Debug.LogError (" Font not found ! " ); return; } foreach (var label in labelList ) { if ( label !=null && label.trueTypeFont != null && label.trueTypeFont.name == "Arial" )//这个地方的name可以改为原来的字体的名称 { label.trueTypeFont = mFont; } } Debug.LogError ( labelList.Count ); } //改变选中的预设上边的字体 [MenuItem ("Custom/Label/ChangeSelectionLabelFont" )] public static void ChangeSelectObjFont () { GetTypeList (); //ChangeLabelFont ( ); } public static List<UILabel> GetTypeList () { Object[] objList =Selection.GetFiltered ( typeof ( Object ), SelectionMode.DeepAssets ); //Debug.LogError (Selection.activeObject.name); Debug.LogError ( objList.Length ); List<UILabel> tmpList = new List<UILabel> (); foreach (var tmp in objList ) { if ( ( tmp as GameObject ) !=null ) { string assetstr =AssetDatabase.GetAssetPath ( tmp ); GameObject obj =PrefabUtility.InstantiatePrefab ( tmp ) as GameObject; List<UILabel> tmpLabel = GetTypeIncludeChildren ( obj ); if ( tmpLabel.Count >0 ) { ChangeLabelFont ( tmpLabel );try { PrefabUtility.ReplacePrefab ( obj, tmp ); } catch ( System.Exception ex ) { Debug.LogError ( ex.ToString () + tmp.name ); } //Debug.LogError ( AssetDatabase.RenameAsset ( assetstr, name ) ); } GameObject.DestroyImmediate ( obj ); } } AssetDatabase.SaveAssets (); AssetDatabase.Refresh (); return tmpList; } public static List<UILabel> GetTypeIncludeChildren ( Object obj ) { GameObject tmp = obj as GameObject; if ( tmp ==null ) { //return new List<UILabel> (); } List<UILabel> tmpList = new List<UILabel> (); UILabel tmpLabel = tmp.GetComponent<UILabel> (); if ( tmpLabel !=null ) { tmpList.Add ( tmpLabel ); } foreach (Transform child in tmp.transform ) { tmpList.AddRange ( GetTypeIncludeChildren ( child.gameObject ) ); } return tmpList; } }本脚本仅支持替换NGUI的UILabel所使用的字体,经测试替换预设上的UILabel字体的方法在Unity4.3版本中会导致预设无法使用,但在Unity4.5.x中完美使用。
- 【转】Unity中,使用Ngui 的默认字体Arial,显示出错;附带字体替换脚本
- Unity在NGUI中默认动态字体Arial字体显示不完整解决方案
- Unity在NGUI中默认动态字体Arial字体显示不完整解决方案
- 解决Unity中,使用Ngui 的默认字体Arial,在部分Android设备显示中文不清楚,或者显示不出来问题
- unity NGUI中使用bmfont制作的字体图集
- 如何把vfp9的默认字体“Arial”改为“宋体”
- Unity一键修改NGUI字体的编辑器脚本
- unity 3d中使用BMFont制作NGUI清晰字体
- unity 3d中使用BMFont制作NGUI清晰字体
- Unity中利用NGUI制作简易字体
- unity的ngui的字体变形问题
- shell 脚本中字体颜色的显示
- 字体的故事之:Arial 无处不在
- android 替换默认字体
- 百度UEditor编辑器修改arial默认字体为宋体
- 在NGUI的UILabel中使用动态字体与表情
- unity 中更换 脚本编辑器 / 更改字体
- 使用BmFont制作NGUI的图片字体
- Fibonacci(自底向上)
- 大学四年,读哪些书让你显得有思想
- oracle数据泵备份恢复
- 仿酷狗歌词的滚动效果
- 最近写了一个从数据库中读取文件并写在txt文件中(当数据过多的时候写在多个txt文件中)
- 【转】Unity中,使用Ngui 的默认字体Arial,显示出错;附带字体替换脚本
- 转载,常用SQL注入语句整理
- eventbus的使用(一)简洁易懂
- 课件本地化之 Adobe Presenter 问题描述与解决方案
- android云后端之FireBase配置
- CortexM0开发 —— UART时序分析
- 计算机视觉、机器学习、图形学等学习资料网站
- 2.1、Android Studio通过Lint提升你的代码
- 怎么在Navicat中设置HTTP属性