1. 程式人生 > >unity font研究小結

unity font研究小結

位圖 docs uil 設置 raw 分享 csdn llb android手機

項目用ngui制作的界面。字體使用了unity默認的Arial,公布後在一些android手機上發現中文不顯示,就此作了一些調查。


參考unity的font說明文檔:http://docs.unity3d.com/Manual/class-Font.html,http://game.ceeger.com/Components/class-Font.html(中文翻譯版)

1.使用動態(Dynamic)字體:

優點,動態字基本包含全部字(中文等),大小可調,顯示清晰,可用於動態文本。

unity方便的支持ttf。otf格式的字體,字體文件放到Assets文件夾下不論什麽位置,untiy會自己主動為其生成材質和貼圖。

技術分享

導入的字體能夠做一些設置,在文檔裏對每一個都有解釋。當中設置Character 為dynamic。

Include Font Data選中表示把該字體打包進安裝包。然後安裝到用戶機器上去。假設用戶機器自帶有該字體。能夠不打包進來,可是須要在Font Names指定系統要用到的字體順序。(導入字體後Font Names屬性會自己主動顯示這個字體的名字,註意不是字體的文件名稱。字體名是該字體的系統標示名)

對於中文字體,選擇Include Font Data的問題是字庫太大,比方黑體有9M。雅黑10多M。會導致安裝文件增大(9M黑打打包進unity將增大安裝文件5M)。假設項目要用到不止一種動態字體就更郁悶了,unity方便的支持ttf等字體對西文字符是個便利的事,對中文來講還有瘦身等問題要處理。

假設不打包字體則須要保證系統中已經存在該字體。此時Font Names屬性生效,在執行時自己主動從系統中尋找列表中的字體。直到找到為止。

技術分享

假設使用unity默認動態字體Arial。對此的解釋是公布到不同的平臺後將默認使用當前平臺的默認字體。

在測試時發如今小米1的機器上,低版本號miui系統裏無法顯示漢字,還有一臺高版本號miui的小米手機能夠顯示Arial,simei等字體(不須要打包進安裝文件),在一臺魅族手機上測試也不能顯示Arial。因此unity的Arial字體與平臺的映射關系並不保險。

andriod系統有自己的默認字體Droid Sans(僅僅含西文字符)。和默認中文字體Droid Sans Fallback。unity把Arial字體在andriod平臺上映射為Droid Sans (Fallback)。


在低版本號miui系統(小米1)裏能夠看到僅僅有一個中文字體文件DroidSansFallback.ttf,大小為2M多。拿出這個字體文件放到unity裏能看到裏面的字體名字是LTHYSZK。可能是由於字體名字被miui系統改成這個導致unity的Arial映射到andriod的失效。

在高版本號miui系統裏有多個中文字體文件。當中DroidSansFallback.ttf的大小變為4.4M,在unity裏發現字體名字已經是Droid Sans Fallback了,可見unity的Arial映射到andriod確實和字體名字有關。(沒有測試過把高版本號ttf拿到低版本號miui系統裏去,貌似得刷機才幹測?這個結論僅僅是推測)。

在高版本號miui裏多了幾種中文字體,確實是屬於系統定制的字體:

技術分享

以下參考文章裏有把andriod默認字體與微軟雅黑做對照,得出兩種字體非常相似的結論。相比雅黑10M以上的體積,Droid Sans Fallback想對瘦小。不知道DroidSansFallback.ttf是否包括全部的中文字符,我用2M多的DroidSansFallback.ttf測試了一些偏僻字,也沒有發現缺失。(假設想用雅黑。能夠用這個來替代)


使用Arial的另外一個問題是,作為unity默認字體。unity不會把Arial真正打包進安裝文件,無法找到這個字體源文件,無法更改Font Names屬性。在找不到默認字體的系統裏就會不顯示中文了。

所以更好的一個做法是做空殼。

導入一種字體但不打包到安裝文件,設置好Font Names屬性(包括各個平臺的字體名列表),則在不同的平臺上調用不同的字體。僅僅要確保公布時指定的Font Names屬性裏有目標平臺的字體即可。

要明確開發時當前顯示的是導入的這個字體效果,但執行時會依據系統和平臺以及Font Names的設置而效果不同。

打包進嵌入的字體則會表現效果一致,唯一的問題是安裝文件會增大非常多。


公布時發現的另外一個問題:

低版本號ngui(3.0)選擇Dynamic字體,Font列表裏能夠選擇Lucida Grande字體,在公布到andriod和winpc系統時會報錯無法公布:

技術分享

技術分享

原因是Lucida Grande是macos下的默認字體不能夠公布到其它平臺(應該在macos下也不讓公布Arial字體吧)。在當前操作系統windows下沒有這樣的字體無法公布(貌似如此,沒有從macos把Lucida Grande拿過來試驗。參考以下一文)。這是低版本號ngui設計的不好。ngui實際是沒有動態字體的,它的動態字體實際就是調用unity的動態字體設置,自己僅僅有位圖字體。在升級ngui到3.5.6之後就發現字體選項僅僅有ngui和unity,然後再選擇詳細用什麽font。ngui最終有了自知之明。不再誤導了。

並且選擇unity後會屏蔽掉非當前系統的字體選項,這點改進非常好。

macos下用Lucida Grande字體(與雅黑接近),ios下默認是黑體-簡Heiti SC(早期版本號是華文黑體)。



參考:

編譯時,遇到Couldn‘t build player because of unsupported data on target platform的解決方式

http://blog.csdn.net/monzart7an/article/details/24156661

Android字體簡單介紹

http://www.apkbus.com/android-58182-1-1.html

在android系統中,DroidSans是默認字體。僅僅包括西方字符,應用程序默認情況下都會調用它。而DroidSansFallback包括了東亞字符,當須要顯示的字符在DroidSans字體中不存在(如:漢字)時。即沒有相應編碼的字符時,系統會到DroidSansFallback中去找相應編碼的字符,假設找到,則使用DroidSansFallback字體來顯示它,假設仍找不到該編碼相應的字符,則無法在屏幕上顯示該字符。


關於 Android 默認字體以及對照微軟雅黑字體

http://www.cnbeta.com/articles/114854.htm


2.bmfont

bitmap font位圖字體是第二種方案,把字符集做成atlas能夠靈活使用各種字體。缺點是位圖無法縮放有鋸齒,並且中文字符一般僅僅是引入一些經常使用字或者項目中用到的字,否則整個字符集太大。會占用太多內存。或者受unity atlas限制大小無法集成全部字符。


打開NGUI的bitmap font maker

NGUI 3.5.6以上版本號能夠方便制作bitmapfont。須要導入FreeType.dll,假設找不到這個文件無法制作位圖字體。

從NGUI的安裝包import到項目中,它的默認位置是Assets/NGUI/Editor/FreeType.dll。我把這個文件挪走了須要又一次找下它,以下有Find FreeType.dllbutton。

技術分享

font maker能夠從導入的ttf來制作bimapfont:我從source裏選擇導入的simhei,字符集裏包括東南2個字。output atlas讓指定字符集圖片放到哪個已有的atlas圖集中,不指定就會單獨生成一張。不利於drawcall,最好非常多bitmapfont圖集公用一個。

技術分享


我創建的字體叫heiti.prefab。由於是prefab用起來非常方便,哪裏都能用。

技術分享

使用的時候選擇NGUI。然後選擇這個heiti字體,僅僅有圖集中有的字才會顯示。





unity font研究小結