【原贴地址已失效  转载过来备用】

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,显示出错;附带字体替换脚本相关推荐

  1. 关于Unity中的NGUI字体

    NGUI字体类型 1: UIFont字体,UIFont类实现的 2: TTF动态字体的使用 3: BBCode的特殊字体的使用 4: NGUI字体制作 5: BMFont字体制作和艺术字体的制作 6: ...

  2. 关于Unity中的NGUI优化,你可能遇到这些问题

    一.界面制作 Q1:我用的是NGUI,本来已经打包图集了,输出时候是不是就不用理会那些原始2D Sprite图 ?粒子贴图需要Packing Tag吗? 在NGUI中使用Atlas后,原纹理是不需要进 ...

  3. 基于 Unity 中的 NGUI 插件,通用的 UI 如何设计

    以我的项目经历来说,要保证通用性必须分清需求是框架需要还是项目需要.举一个例子,所有的项目都需要一个弹窗提示的接口,但是不同项目弹窗都不一样,当时做的时候我没有想好怎么分离,那就放到项目类库里,保证框 ...

  4. ui动效 unity_基于Unity中的NGUI插件,通用的UI如何设计?

    整理自知乎,文/王致远 以我的项目经历来说,要保证通用性必须分清需求是框架需要还是项目需要.举一个例子,所有的项目都需要一个弹窗提示的接口,但是不同项目弹窗都不一样,当时做的时候我没有想好怎么分离,那 ...

  5. 关于用notepad++确认代码中\r\n\t空格等不显示的字符及替换

    如图,CRLF就是不可见的,点击箭头指向能显示所有字符 Replace "\n" with new line characters, using Notepad++ In case ...

  6. unity 发布webGL坑点二: 不显示中文字体

    原因: WebGL无权限读取本地操作系统的字体文件 方案: 多语言,字体文件打bundle, 把字体文件打进包再发布 中文字体不能用Unity原生字体,需要自己导入字体 免费商用字体: www.hel ...

  7. Unity中制作自定义字体的两种方式

    Unity支持自定义图片字体(CustomFont),网上有很多教程,细节不尽相同,当概括起来基本就是两种方式.一是使用BMFont,导出图集和.fnt文件,再使用图集在Unity中设置得到字体.二是 ...

  8. Fedora 24 Linux 环境下实现 Infinality 字体渲染增强及 Java 字体渲染改善的方法(修订)...

    Fedora 24 Linux 桌面环境默认字体渲染引擎 freetype 及字体配置工具 fontconfig 采用的是未经优化的编译及设置,字体渲染效果比较差.而某些 Linux 发行版的桌面字体 ...

  9. 控制app字体大小不随手机字体大小影响

    /**在你的BaseActivity中*/ /**从android4.0起系统设置的"显示"提供设置字体大小的选项.这个设置直接会影响到所有sp为单位的字体适配,所以很多app在设 ...

最新文章

  1. Git基础(常用命令)介绍
  2. CTF---Web入门第十三题 拐弯抹角
  3. Linux配置示例:配置java环境变量
  4. Eclipse修改console输出最大行数及(IOConsole Updater)
  5. python zen_Python的宗旨(Zen of Python)
  6. k8s pod里访问不到外部ip_K8S中的Service的存在理由
  7. 如何在SAP里创建configurable material物料主数据
  8. I.MX6开发板移植Linux4.1.15内核之TSC2007触摸屏设备树信息的添加
  9. WIN7 系统破解LoadRunner 11
  10. ann matlab,MatlabANN工具箱实用指南.doc
  11. 什么是多态 重载 覆盖 继承 最好解释
  12. Python 多进程
  13. 吴恩达《机器学习》第二章:线性回归
  14. python之django中models学习总结
  15. Java反编译工具使用对比,最好用的Java反编译工具 --- JD-GUI、XJad
  16. 八数码难题(启发式搜索)
  17. linux下调用pyd文件,linux pyd
  18. cad.net 图层隐藏 IsHidden 用法 eDuplicateRecordName 报错
  19. 如何打开被关闭的任务管理器
  20. Usdt到底靠谱吗?——记美国与大B网的恩怨情仇

热门文章

  1. 基于 ADXL335 加速度计的手势控制机器人
  2. Vue - 超详细 “纯前端“ 将阿里云 OSS 文件删除流程,支持单个 / 批量删除文件(附带完整示例运行源码,保证新手小白 100% 轻松实现删除功能)
  3. (文献阅读笔记)基于雾计算提出的一种交通路况监测的一种隐私保护协议
  4. 【opencv2】图片大小转换和图片的保存
  5. python实现图片格式转换_python实现批量图片格式转换
  6. 圆满收官!华秋电子亮相2022慕尼黑华南电子展,数字化平台赋能智能制造
  7. 詹姆斯:全明星主帅是对斯波的肯定 赢球多亏防守
  8. 学习记录03(网页挂马)
  9. 数据挖掘-数据聚类 python实现
  10. 对象关系映射(ORM)