【Unity3D ugui】使用藝術字

Kaitiren發表於2015-08-04

藝術字製作流程

1、下載BMFont官網 
2、首先你還得有美術製作的藝術字,或者自己做幾個藝術字。好吧,全部奉上 
3、使用BMFont製作藝術字圖集 
4、將生成的.fnt檔案和圖集.png檔案匯入到專案中 
5、你還得有NGUI的有關BMFont的程式碼,不知道在哪?已經全部奉上啦 
6、製作CustomFont,按照教程來做挺累的,編輯器上場

using UnityEngine;
using UnityEditor;

public class BMFontEditor : EditorWindow
{
    [MenuItem("Tools/BMFont Maker")]
    static public void OpenBMFontMaker()
    {
        EditorWindow.GetWindow<BMFontEditor>(false, "BMFont Maker", true).Show();
    }

    [SerializeField]
    private Font targetFont;
    [SerializeField]
    private TextAsset fntData;
    [SerializeField]
    private Material fontMaterial;
    [SerializeField]
    private Texture2D fontTexture;

    private BMFont bmFont = new BMFont();

    public BMFontEditor()
    {
    }

    void OnGUI()
    {
        targetFont = EditorGUILayout.ObjectField("Target Font", targetFont, typeof(Font), false) as Font;
        fntData = EditorGUILayout.ObjectField("Fnt Data", fntData, typeof(TextAsset), false) as TextAsset;
        fontMaterial = EditorGUILayout.ObjectField("Font Material", fontMaterial, typeof(Material), false) as Material;
        fontTexture = EditorGUILayout.ObjectField("Font Texture", fontTexture, typeof(Texture2D), false) as Texture2D;

        if (GUILayout.Button("Create BMFont"))
        {
            BMFontReader.Load(bmFont, fntData.name, fntData.bytes); // 借用NGUI封裝的讀取類
            CharacterInfo[] characterInfo = new CharacterInfo[bmFont.glyphs.Count];
            for (int i = 0; i < bmFont.glyphs.Count; i++)
            {
                BMGlyph bmInfo = bmFont.glyphs[i];
                CharacterInfo info = new CharacterInfo();
                info.index = bmInfo.index;
                info.uv.x = (float)bmInfo.x / (float)bmFont.texWidth;
                info.uv.y = 1 - (float)bmInfo.y / (float)bmFont.texHeight;
                info.uv.width = (float)bmInfo.width / (float)bmFont.texWidth;
                info.uv.height = -1f * (float)bmInfo.height / (float)bmFont.texHeight;
                info.vert.x = 0;
                info.vert.y = -(float)bmInfo.height;
                info.vert.width = (float)bmInfo.width;
                info.vert.height = (float)bmInfo.height;
                info.width = (float)bmInfo.advance;
                characterInfo[i] = info;
            }
            targetFont.characterInfo = characterInfo;
            if (fontMaterial)
            {
                fontMaterial.mainTexture = fontTexture;
            }
            targetFont.material = fontMaterial;
            fontMaterial.shader = Shader.Find("UI/Default");//這一行很關鍵,如果用standard的shader,放到Android手機上,第一次載入會很慢

            Debug.Log("create font <" + targetFont.name + "> success");
            Close();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

建立CustomFont步驟 
7、給Text指定字型和材質吧,材質用Sprites-Default,顏色就白色 
指定字型和材質

最終效果

效果圖

需要注意的問題

1、CustomFont用Standard材質,最終放到手機上,第一次載入會很慢,親測,小米3要3秒,紅米2要9秒。既然如此,那就用UI/Default吧,其他的可能也行,我就懶得一個一個測了。至於為什麼Standard會造成載入慢,容我思考思考 
著色器的選擇 
2、上面的Editor程式碼執行後,在Unity上能立刻看到效果,但是CustomFont的設定沒有立刻儲存,需要自己手動儲存。博主不才,不知道程式碼怎麼寫才能自動儲存設定。 
3、如果單獨某個字顯示的位置不對,可以調整下字元Vertex的位置,比如上面效果圖中的“+”有點偏上了,可以把“Y”值調小一點。有興趣也可以研究下其他引數的含義。 
頂點座標調整

版權宣告:本文為博主原創文章,未經博主允許不得轉載。

相關文章