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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM