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" )]
publicstatic void ChangeSceneFont ()
{
List<UILabel> labelList = NGUIEditorTools.FindAll<UILabel> ();
ChangeLabelFont ( labelList );
}publicstatic void ChangeLabelFont ( List<UILabel> labelList )
{Font mFont = NGUIEditorTools.LoadAsset<Font> ("Assets/font/DroidSansFallback.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" )]
publicstatic void ChangeSelectObjFont ()
{
GetTypeList ();
//ChangeLabelFont ( );
}publicstatic 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 ( ( tmpas 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;
}publicstatic List<UILabel> GetTypeIncludeChildren ( Object obj )
{
GameObject tmp = objas 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 的默认字体Arial,显示出错;附带字体替换脚本

    [原贴地址已失效  转载过来备用] Unity工程中的动态字体使用很方便,在一开始的工程中,为了减小游戏包的大小,我们使用的是Unity内置的默认Arial字体,但是在游戏上线测试后,很多玩家反馈个别 ...

  2. word字体放大后只显示一半_word字体放大后显示不完整的两种解决办法

    在我们对字体的操作(放大缩小)的过程中,会遇到放大字体后,字体显示不完整,只显示一部分,另外一部分缺失的现象.那么,我们怎么解决这一问题呢??下面我就分享两个方法解决这个问题.希望对大家有所帮助. 1 ...

  3. IE6中PNG图片背景无法透明显示的最佳解决方案

    我想,对于像我这样的年轻的程序员来说,做网页开发时用chrome.firefox或者ie10什么的大约是被宠坏了.所以当最近做的项目不得不在恐龙化石般的ie6上运行时,ie6种种诡异的行径简直让我发指 ...

  4. swiper轮播在vue中动态绑定返回的数据图片显示不完整

    因为swiper是异步请求的,可能在没有返回数据的时候就已经请求了,这时候我们可以让swiper在有数据的时候在显示 转载于:https://www.cnblogs.com/yangjiansong/ ...

  5. Unity3D中的动态字体和静态字体

    Unity3D中支持动态字体和静态字体两种格式字体,动态字体即使用TTF格式字体库,静态字体则需要自己打包字体图集.动态字体和静态字体区别在于,动态字体如果出现字体库中不存在的字体,会使用系统字体,而 ...

  6. dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退...

    本文来告诉大家 WPF 已知问题,在用户的设备上,如果不存在 Arial 字体,同时安装了一些诡异的字体,那么也许就会让应用在使用到诡异的字体的时候,软件闪退 在 WPF 的 FontFamily.c ...

  7. android 如何从服务器端的数据库中拿数据,在客户端显示类?

    ============问题描述============ android 如何从服务器端的数据库中拿数据,在客户端显示类? ============解决方案1============ 写一个网络访问的 ...

  8. 在NGUI的UILabel中使用动态字体与表情

    前言 众所周知,UILabel的静态字体是支持表情的,不过需要将表情与文字打包到一个图集中,并且因为受限于静态字体,几乎不适用于中文日文等文字的图文混排. 这几天因为项目需要研究了一下动态字体中使用表 ...

  9. Unity NGUI中动态添加和删除sprite(附上转载者注释)

    --------------------- 此部分为转载的感受. 原文对于NGUI如何动态添加删除sprite,以及调用NGUI中的图集Atlas都有很明确的代码. 转载括号内容附上转载作者(Bula ...

  10. (二)unity优化方案:利用BMFont工具制作font字体(在UGUI和NGUI中使用)

    今天的任务是制作一个在NGUI和UGUI中可以使用的新字体,利用该新字体的文本可以正常显示在界面上,并且还支持中文字符的输入与显示.我在这里记录下制作过程,希望可以帮助到其他爱好者. 为什么要用字体集 ...

最新文章

  1. ROS_机器人urdf建模仿真实践
  2. ubuntu 16.04 中配置Eclipse c++开发环境
  3. Maxon Cinema 4D Studio S22.114中文版
  4. bgp 建立邻居发送的报文_大型网络BGP之IBGP和EBGP邻居关系基础配置
  5. php5.0相等,关于php:3个相等
  6. MySQL中序列的作用_MySql中序列的应用和总结
  7. php中sisson用法,详细介绍php中session的用法
  8. openssl学习笔记--CA及https网站证书配置
  9. mysql mgr监控_6. MySQL组复制(MGR)全解析 Part 6 监控MySQL组复制
  10. (十二)洞悉linux下的Netfilteriptables:iptables命令行工具源码解析【下】
  11. AutoCAD-源泉设计-利器
  12. ignite安装及简单使用命令
  13. AI:人工智能领域之AI发展史(人工智能发展历史)之详细攻略
  14. vue限制只能输数字
  15. linux startx无效_startx命令_Linux startx 命令用法详解:用来启动X Window
  16. 小博老师解析经典Java面试题-redirect和forward的区别
  17. UI设计网盘资源收集
  18. 计算机的创新知识,创新高中计算机知识学习的策略分析
  19. 为什么说期货交易者依靠程序化交易系统接口才能获得成功
  20. 【Mapreduce】Mapreduce实例——WordCount

热门文章

  1. C++初学必练基础题【第四期】
  2. 未来教育计算机一级ms百度云,未来教育全国计算机二级VFP
  3. 忘记PDF密码怎么办?
  4. PWA 应用列表及常用工具
  5. 怎么检查计算机和打印机是否连接网络,检查电脑是否正确连接网络打印机
  6. 声道测试音频_嵌入式平台上的自动音频接口测试
  7. 爬取豆瓣top250电影练习
  8. 红帽rhce考试自带补考吗_红帽RHCE认证考试注意事项
  9. 人工智能面试问题整理
  10. android webview 字体被放大,解决因为手机设置字体大小导致h5页面在webview中变形的BUG...