Example #1
0
        private void ExportFont(BitmapFontConfig config)
        {
            if (!config.IsValid())
            {
                Debug.LogError("FontConfig is unvalid");
                return;
            }

            int charIndex             = charIDStart;
            List <Texture2D> textures = new List <Texture2D>();

            for (int i = 0; i < config.fontChars.Count; ++i)
            {
                BitmapFontChar fontChar = config.fontChars[i];
                fontChar.charIndexes = new int[fontChar.chars.Count];
                for (int j = 0; j < fontChar.chars.Count; ++j)
                {
                    fontChar.charIndexes[j] = (charIndex++);

                    textures.Add(fontChar.textures[j]);

                    SetCharTextureSetting(fontChar.textures[j]);
                }
            }

            Texture2D atlas = PackCharTexture(config.GetFontTexturePath(), textures.ToArray(), config.padding, config.maxSize, out Rect[] rects);

            if (atlas == null)
            {
                Debug.LogError("PackCharTexture failed");
                return;
            }
            int rectIndex = 0;

            for (int i = 0; i < config.fontChars.Count; ++i)
            {
                BitmapFontChar fontChar = config.fontChars[i];
                fontChar.charRects = new Rect[fontChar.chars.Count];
                for (int j = 0; j < fontChar.chars.Count; ++j)
                {
                    fontChar.charRects[j] = rects[rectIndex];
                    ++rectIndex;
                }
            }

            Font font = CreateFont(config, atlas, out BitmapFontCharMap[] charMaps);

            string     fontDataPath = config.GetFontDataPath();
            BitmapFont fontData     = AssetDatabase.LoadAssetAtPath <BitmapFont>(fontDataPath);

            if (fontData == null)
            {
                fontData = ScriptableObject.CreateInstance <BitmapFont>();
                AssetDatabase.CreateAsset(fontData, fontDataPath);
                AssetDatabase.ImportAsset(fontDataPath);
            }

            fontData.bmFont   = font;
            fontData.charMaps = charMaps;

            EditorUtility.SetDirty(fontData);
        }
Example #2
0
        private Font CreateFont(BitmapFontConfig config, Texture2D atlas, out BitmapFontCharMap[] charMap)
        {
            string fontAssetPath = config.GetFontPath();

            charMap = new BitmapFontCharMap[config.fontChars.Count];

            Font font = AssetDatabase.LoadMainAssetAtPath(fontAssetPath) as Font;

            if (font == null)
            {
                font = new Font();
                AssetDatabase.CreateAsset(font, fontAssetPath);
                AssetDatabase.ImportAsset(fontAssetPath);
            }
            Shader matShader = Shader.Find(MATERIAL_SHADER);

            Material fontMat = AssetDatabase.LoadAssetAtPath <Material>(fontAssetPath);

            if (fontMat == null)
            {
                fontMat      = new Material(matShader);
                fontMat.name = "Font Material";
                AssetDatabase.AddObjectToAsset(fontMat, fontAssetPath);

                font.material = fontMat;
            }

            fontMat.mainTexture = atlas;

            List <CharacterInfo> charInfos = new List <CharacterInfo>();

            for (int i = 0; i < config.fontChars.Count; ++i)
            {
                BitmapFontChar fontChar = config.fontChars[i];
                charMap[i] = new BitmapFontCharMap()
                {
                    name     = fontChar.fontName,
                    orgChars = fontChar.chars.ToArray(),
                    mapChars = (from index in fontChar.charIndexes select(char) index).ToArray(),
                };

                for (int j = 0; j < fontChar.chars.Count; ++j)
                {
                    CharacterInfo cInfo = new CharacterInfo();
                    cInfo.index = fontChar.charIndexes[j];
                    Rect rect = fontChar.charRects[j];

                    cInfo.uvBottomLeft  = new Vector2(rect.x, rect.y);
                    cInfo.uvTopRight    = new Vector2(rect.x + rect.width, rect.y + rect.height);
                    cInfo.uvBottomRight = new Vector2(rect.x + rect.width, rect.y);
                    cInfo.uvTopLeft     = new Vector2(rect.x, rect.y + rect.height);

                    Rect vert = new Rect(0, -rect.height * atlas.height, rect.width * atlas.width, rect.height * atlas.height);
                    cInfo.minX = (int)vert.xMin;
                    cInfo.maxX = (int)vert.xMax;
                    cInfo.minY = (int)vert.yMin;
                    cInfo.maxY = -(int)vert.yMax;

                    cInfo.glyphWidth  = Mathf.RoundToInt(atlas.width * rect.width);
                    cInfo.glyphHeight = Mathf.RoundToInt(atlas.height * rect.height);

                    cInfo.advance = cInfo.glyphWidth + fontChar.charSpace;
                    cInfo.bearing = 0;

                    cInfo.style = FontStyle.Normal;

                    charInfos.Add(cInfo);
                }
            }

            font.characterInfo = charInfos.ToArray();

            EditorUtility.SetDirty(font);
            return(font);
        }
Example #3
0
        protected override void OnDrawProperty(string label)
        {
            BitmapFontChar value = Property.GetValue <BitmapFontChar>();

            label = $"Font {(label ?? "")} ({value.fontName})";
            EditorGUI.BeginChangeCheck();
            {
                value.fontName  = EditorGUILayout.TextField("Font Name", value.fontName);
                value.charSpace = EditorGUILayout.IntField("Char Space", value.charSpace);
                EditorGUILayout.BeginVertical(EGUIStyles.BoxStyle);
                {
                    EditorGUILayout.LabelField(GUIContent.none, EditorStyles.toolbar, GUILayout.ExpandWidth(true));

                    Rect lastRect = GUILayoutUtility.GetLastRect();
                    EditorGUI.LabelField(lastRect, label, EGUIStyles.BoldLabelStyle);

                    Rect clearBtnRect = new Rect(lastRect.x + lastRect.width - 40, lastRect.y, 40, lastRect.height);
                    if (GUI.Button(clearBtnRect, "C", EditorStyles.toolbarButton))
                    {
                        //DrawerProperty.ClearArrayElement();
                        value.chars.Clear();
                        value.textures.Clear();
                    }

                    for (int i = 0; i < value.chars.Count; ++i)
                    {
                        EditorGUILayout.BeginHorizontal();
                        {
                            EditorGUILayout.BeginVertical();
                            {
                                char   c        = value.chars[i];
                                string charText = EditorGUILayout.TextField("Char", "" + c);
                                if (!string.IsNullOrEmpty(charText) && charText[0] != c)
                                {
                                    value.chars[i] = charText[0];
                                }
                                value.textures[i] = (Texture2D)EditorGUILayout.ObjectField("Texture", value.textures[i], typeof(Texture2D), false);
                            }
                            EditorGUILayout.EndVertical();

                            if (GUILayout.Button("-", GUILayout.Width(20)))
                            {
                                value.chars.RemoveAt(i);
                                value.textures.RemoveAt(i);
                            }
                        }
                        EditorGUILayout.EndHorizontal();

                        EGUILayout.DrawHorizontalLine();
                    }
                    Rect addBtnRect = GUILayoutUtility.GetRect(lastRect.width, 20);
                    addBtnRect.x    += addBtnRect.width - 40;
                    addBtnRect.width = 40;
                    if (GUI.Button(addBtnRect, "+"))
                    {
                        value.chars.Add('-');
                        value.textures.Add(null);
                    }
                }
                EditorGUILayout.EndVertical();
            }
            if (EditorGUI.EndChangeCheck())
            {
                Property.Value = value;
            }
        }