【转】Unity中,使用Ngui 的默认字体Arial,显示出错;附带字体替换脚本

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

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中完美使用。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity,当需要显示文UI时,有时会遇到文字符显示为方框或不显示的问题。这是因为默认字体不支持文字符,或者字体不包含文字符编码库。为了解决这个问题,有几种方法可以尝试。 一种解决方法是使用TextMeshPro插件,具体步骤如下: 1. 在网上下载一个字体包,或者从C:\Windows\Fonts目录选取一个字体文件。 2. 将字体文件拖入Unity的素材文件夹。 3. 使用Font Asset Creator工具,可以在Inspector找到它。 4. 将新生成的Unity字体文件替换原来的字体文件。 5. 然后就可以在Unity使用字体了。 需要注意的是,这种方法只会自动支持已经输入到Text文本框的文字。如果需要在代码更新文本框的内容,并且该内容包含未曾输入过的字体,那么这些字体仍然无法显示出来。此外,当文字过多时可能会出现显示问题。 另一种方法是使用其他的字体包,可以尝试在网上下载其他的字体包并导入到Unity。这种方法也有可能解决文无法显示的问题,但可能会有一定的失败率。 还有一种方法是使用Font Asset Creator工具来查看Inspector,并检查是否正确设置了字体和字符编码。这个工具可以帮助你确认字体设置是否正确,以解决文无法显示的问题。 综上所述,根据不同的情况和需求,可以尝试以上提到的方法来解决Unity字体无法显示的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Unity 文不显示问题](https://blog.csdn.net/weixin_46146935/article/details/125609143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Unity文变成方框/不显示](https://blog.csdn.net/oliviaher/article/details/129292643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值