天天看點

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