2014-11-06 23:34:18 qinglongyanyuezhu 阅读数 7432
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

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中完美使用。

2019-10-15 11:20:49 weixin_43492764 阅读数 39
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

UGUI中随意改变某个文字位置和形状之:正常字体造斜体

  首先普及一下3D建模的知识,,在建模中,任何物体都是由三角面组成的。而在Unity中也是这样。如文字,是由一个矩形面,即两个三角面组成,一个三角面有三个顶点。通过改变这些顶点的位置,可以实现很多效果。如本文的把一个没有斜体格式的字体的显示效果变为斜体的显示效果。
  如下图:游戏中要求使用的这个字体是没有斜体的,要求使用斜体,那怎么办呢?可以通过改变顶点位置得到斜体。
在这里插入图片描述
  效果图如下,添加了一个继承自BaseMeshEffect的脚本TextPointMove得到斜体的显示效果。
在这里插入图片描述
  代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using System.Collections.Generic;

public class TextPointMove : BaseMeshEffect
{
    public float _textSpacing = 1f;

    public float spacing = 0;
    public override void ModifyMesh(VertexHelper vh)
    {
        List<UIVertex> vertexs = new List<UIVertex>();
        vh.GetUIVertexStream(vertexs);
        int vertexIndexCount = vertexs.Count;
        for (int i = 0; i < vertexIndexCount; i++)
        {
            UIVertex v = vertexs[i];

            if (i % 6 <= 1) //设置第一个和第二个点
            {
                v.position += new Vector3(spacing * 1, 0, 0);
            }
            if (i % 6 == 5) //设置第五个点
            {
                v.position += new Vector3(spacing * 1, 0, 0);
            }

            vertexs[i] = v;
            if (i % 6 <= 2) 
            {
                vh.SetUIVertex(v, (i / 6) * 4 + i % 6);
            }
            if (i % 6 == 4)
            {
                vh.SetUIVertex(v, (i / 6) * 4 + i % 6 - 1);
            }
        }
    }
}

  非常感谢一粒细雨博主的分享。
UGUI中随意调整Text中的字体间距

没有更多推荐了,返回首页