[專欄精選]TextMeshPro插件
本文節選自洪流學堂公眾號專欄《鄭洪智的Unity2018課》,未經允許不可轉載。
洪流學堂公眾號回復專欄
,查看更多專欄文章。
小新:「UI裡面還有一類組件是用TextMeshPro開頭的,這類組件有啥用啊?」
大智:「TextMeshPro是Unity收購的一個第三方插件,可以解決文字渲染的很多問題,可以替換UI Text。比如UI Text就沒辦法對文字加入特效。」小新:「哇,可以直接對文字加入動態特效啊?那就不用美術同學辛苦去做了?」大智:「是的哦」
小新:「那我們今天就來學習一下這個吧!」TextMesh Pro
TextMesh Pro是Unity中文字渲染的終極解決方案,原本是一個第三方插件,後被Unity收購後併入Unity,現在可以免費使用。
安裝
對於Unity2018及以後的版本,可以從菜單欄Window > Package Manager中安裝TextMesh Pro。
Unity2018.2及之後的版本TextMesh Pro包會被默認安裝到工程中,無需手動安裝。
對於Unity2017及之前的版本,可以通過AssetStore(https://assetstore.unity.com/packages/essentials/beta-projects/textmesh-pro-84126)下載導入此插件。
創建
TextMeshPro最基礎的用法就是使用它的Text組件來顯示文本。有兩種使用方法,一種是通過網格MeshRenderer渲染,一種是通過UI系統渲染。
Mesh方式創建方法:Hierarchy的Create菜單(右鍵菜單)> 3D > TextMesh Pro - Text
UI方式創建方法:Hierarchy的Create菜單(右鍵菜單)> UI > TextMesh Pro - Text
第一次創建時,會彈出一個提示窗口:
這似乎是您第一次訪問TextMesh Pro,因此我們需要為您的項目添加對使用TextMesh Pro至關重要的資源。這些新資源將放置在項目的根目錄中的「TextMesh Pro」文件夾。
點擊下方的按鈕Import TMP Essentials即可。
導入必要資源後,下方的TMP Examples & Extras會變為可點擊狀態。這些資源是可選導入的,可以點擊Import TMP Examples & Extras來導入實例和額外資源。
Examples&Extras包中包含額外的資源和示例,可以更輕鬆地發現和學習TextMesh Pro的強大功能。這些額外資源將與TMP基本資源放在同一文件夾中。
TextMesh Pro - Text 和 UGUI - Text 的區別
TextMesh和UIText的渲染對比UGUI的Text使用了一張字體貼圖,Unity把所有需要顯示的字元放到了一張圖集中,字元的形狀是通過像素定義的。當我們放大時,像素不夠用就會出現文字變模糊的情況。
TextMesh Pro的Text使用了不同的技術來渲染文字,叫做Signed Distance Field(後面簡稱SDF,對該技術感興趣的同學可以自行搜索一下)。和UGUI類似,這個技術同樣需要將字元放到一個圖集中,但是不使用像素來代表字元的形狀,而使用SDF技術來生成字元的形狀。使用這種技術字元在渲染時不會因為縮放而造成字元模糊的情況,總是能夠準確的渲染字元的邊緣。
創建字體
TextMesh Pro無法像UGUI Text那樣使用動態字體,因為TextMesh Pro需要對字體進行預處理來計算SDF,這部分計算非常耗時。這對於英文字體來說影響不大,一個字體文件或一張貼圖包含的信息都很少,但是對於字元非常多的語言如中文就影響很大。
所以對於中文環境建議如下:
- 對於遊戲中顯示的文字可以使用TextMesh Pro的SDF字體,提高顯示效果和特效處理。
- 對於遊戲中的輸入框建議使用UGUI自帶輸入框,使用動態字體。
創建SDF字體文件的過程如下:
1、菜單欄打開Window > TextMeshPro > Font Asset Creator2、在Font Source中選擇你想要創建的字體
3、在Character Set中選擇要生成的字符集
4、其他選項根據需要進行設置(下面會詳細說明每個屬性的作用)
5、點擊下方的Generate Font Atlas按鈕生成字體
6、生成結束後記得點擊Save保存**
Font Creator窗口屬性
Font Source 選擇要創建SDF字體的源字體
Font Size 創建字體的字型大小的大小。
- Auto Sizing 建議使用該選項。根據給定Atlas Resolution(圖集解析度)來計算並使用最大字型大小。
- Custom 自定義字型大小。
Font Padding 圖集中每個字元之間的間隔,以便在渲染時能卻分他們的邊緣。此外padding也用於文字的特效,所以不宜過小;但是也不宜過大,過大會造成更大的atlas解析度或者atlas上能承載的字元更少。對於512*512的圖集,padding為5通常比較合適。
Packing Method 打包方式
- Fast 可能計算出不是最大的字型大小,但是計算速度會快一些
- Optimum 可以計算出圖集上能承載的最大的字型大小通常在測試設置時使用Fast,在最終打包時使用Optimum
Atlas Resolution 使用SFD字體時,更高的解析度會產生更精細的漸變,從而產生更高質量的字體。對於大多數字體,僅包含所有ASCII字元時,512x512紋理解析度足夠用。
當需要支持數千個字元時,不得不使用大紋理。但即使在最高解析度下,也可能無法滿足所有要求。在這種情況下,可以通過創建多個字體資源來拆分字元。將最常用的字元放在主字體資源中,將其他字元放在後備(fallback)字體資源中。
Character Set 字體文件中的字元不會自動包含在字體資源中。你必須指定你需要的那些。你可以選擇一些預定義的字符集,也可以自己提供字元列表。
- ASCII 大小寫字母+數字+常見符號
- Extended ASCII 包含所有的ASCII字元
- ASCII lowercase 小寫字母+數字+常見符號
- ASCII uppercase 大寫字母+數字+常見符號
- Numbers + Symbols 數字+常見符號
- Custom Range 使用十進位來制定字元的編碼範圍,可以使用減號和英文逗號來指定範圍,如
32-126,161-255
使用自定義字元範圍時,可以直接引用一個SDF字體,使用這個字體中的字符集
- Unicode Range(Hex) 使用16進位來制定字元的編碼範圍,可以使用減號和英文逗號來指定範圍,如
20-7E,A1-FF
- Custom Characters 自定義字元,直接輸入對應的字元
- Characters from file 從外部文件中導入字元
注意要包含空格字元,除非確定你不需要它
Font Style 你可以選擇幾種不同的字體樣式。這些設置僅適用於點陣圖字體。
你可以通過shader配置SDF字體的樣式,可以選擇粗體、斜體、粗體加斜體和描邊,也可以控制粗體和輪廓的強度。Font Render Mode 距離場模式創建SDF紋理需要與SDF shader一起使用。字元是在高解析度下採樣來創建良好的漸變。16x是默認值並且足以用於大多數情況。32x生成較慢但可以讓複雜或小字元產生更好的質量。
其他模式直接將字元渲染為點陣圖,以便與點陣圖字體一起使用。Raster模式不使用抗鋸齒,Smooth模式使用抗鋸齒。兩者都有一個Hinted模式,它將字元像素與紋理像素對齊以獲得更清晰的結果。Get Kerning Pairs? 你可以選擇從字體中提取字距數據。此數據用於調整特定字元對之間的間距,以產生更好的視覺效果。但是請注意很多字體沒有字距數據。
總結
大智:「SDF字體創建完以後就能用於TMP的text了。」
小新:「這個插件確實很強大,文字顯示看起來真舒服。」今日思考題
大智:「把你的界面里的文字替換成TMP的text看看效果如何吧!」
小新:「好嘞」大智:「收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。」洪流學堂公眾號回復專欄
,查看更多專欄文章。
推薦閱讀:
TAG:Unity(遊戲引擎) |