Unity中字体的一些知识

Unity中的字体常用的有:内置字体,外部导入的字体,自定义的字体。

1,内置字体。

  内置字体一般是指unity自带的字体,Windows下unity自带字体为Arial,如果游戏中使用Arial字体,在某些机型上可能显示不全。原因是Arial是英文字体,并不包含中文字体。在Unity中如果使用了默认的Arial字体,在程序运行过程中如果遇到字库中没有的字,程序就会从系统的默认字体库中查找对应的文字,如果系统默认的字库中也没有这个字,那么就会造成字体不显示问题。在Android系统中Unity默认会去查找名为DroidSansFallback的字体,这个字体是android的默认字体,但是因为android系统的可定制性,太过自由,很多手机厂商会去修改默认字体。在android系统是根据字体的文件名称来找字体的,但unity识别字体却是通过字体内部的设置来识别字体的,所以说,即使在anroid手机中有DroidSansFallback.ttf字体,也有可能unity找不到这个字体。由于上面的原因,尽量不要使用unity的默认字体Arial,除非你做的游戏是纯英文的。

2.动态字体

  如果你有一个.ttf的字体文件,想要在unity中使用此字体,可以直接把此文件拖到unity内,如:

其中,Font size字体大小,一般设置为16,数值越大,设置文字时字体对应的texture越大,所以这个值不应设置过大.

Font Names默认导入的一个字体,这个参数的主要作用实际上是设置替代字体用的,当程序需要某一个字体时,首先会从当前字体查找字符,如果没有,会依次查找FontNames列表里的其它字体,直到找到或者找完为止。

Incl.FontData选项打上勾,在导出包的时候把字体添加到包中,若不打勾,则不会将该字体打包,程序运行时会从FontNames列表里检索需要的字体,如果没有,字体就不显示。

如果游戏中一直都在使用A字体,突然要改为B字体,可以在A字体的FontNames里填入B字体名字,A字体的Incl.FontData不打勾,B字体的Incl.FontData打勾。

Character选项大多数时候我们都是选择Dynamic,另外Custom set有时也会用到,比如选择了Custom set

并且Custom Chars设置为ABC,那么使用此字体的文本只能显示ABC这三个字符,其它字符不能显示。

  动态字体字体丢失问题的解决办法:

1,我们用的TTF动态字体,Text每次赋值的时候Unity会生成贴图,以及保存UV信息,显示字体时根据UV信息去生成的贴图里取出渲染到屏幕上。出现花屏可能是贴图更新了,但UV信息没有更新,所以就取不到,这时需要重新用新的UV去取。

bool isDirty = false;
    Font dirtyFont = null;
  
    void Awake()
    {
        Font.textureRebuilt += delegate(Font font1)
        {
            isDirty = true;
            dirtyFont = font1;
        };
    }
  
    void LateUpdate()
    {
        if (isDirty)
        {
            isDirty = false;
            foreach (Text text in GameObject.FindObjectsOfType<Text>())
            {
                if (text.font == dirtyFont)
                {
                    text.FontTextureChanged();
                }
            }
            dirtyFont = null;
        }
    }

2.TTF字体的文件下,会生成一个texture文件及material文件。当需要显示文字的时候,会通过RequestCharactersInTexture函数向Font请求更新文字信息,然后使用GetCharacterInfo获取文字信息来渲染。在调用GetCharacterInfo的时候要保证文字都通过RequestCharactersInTexture请求过了。如果请求的时候,Font内部维护的texture不够用了,就会触发textureRebuildCallback的回调,通知外部Font的对象,其内部的texture被更新了,外部应该重新刷新。

  Unity的Font默认的texture大小是256X256,在纯英文的情况下,是完全够用的。但是汉字,日文等字体就完全不够了。如果unity的刷新回调触发,则要重新刷新所有的文本控件。这样就容易出现字体破碎的情况。因为一般情况下我们请求的文字不会很多,使用的texture不会超过256x256,unity不会自动扩展texture大小。但我们请求的文字过多时,texture如果不够了,这时就需要在回调函数中刷新字体,如果我们连续请求文字,每次texture都需要扩展(需要回调刷新),于是就会出现不停刷新,字体也可能会破碎。

解决办法:可以游戏刚开始时请求足够多的文字,那么unity就会内部自动扩展font的texture大小,于是就可以避免不停刷新的情况。

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

public class FontTextureSize : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Font stx = Resources.Load<Font>("STXINWEI");
        Texture tex = stx.material.mainTexture;
        Debug.Log(string.Format("texture:{0} {1}", tex.width, tex.height));
        TextAsset ta = Resources.Load<TextAsset>("word");
        string word = ta.text;
        stx.RequestCharactersInTexture(word);
        tex = stx.material.mainTexture;
        Debug.Log(string.Format("texture:{0} {1}", tex.width, tex.height));
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

3.自定义的字体参考:http://blog.csdn.net/u011643833/article/details/46520073

Tips:参考http://blog.csdn.net/oskytonight/article/details/45250071

    http://www.manew.com/thread-96531-1-1.html

    http://www.cnblogs.com/bicker/p/3669176.html

 

posted @ 2017-05-26 17:11  周小菲  阅读(12626)  评论(0编辑  收藏  举报