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
