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); }
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); }
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; } }