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