using UnityEngine;
|
|
using System.Collections;
|
|
using UnityEditor;
|
|
|
|
public class MyFont : Editor
|
|
{
|
|
[MenuItem("Tools/MakeFont/导出BMFont " + "%#e")]
|
|
static void CreateBmFont()
|
|
{
|
|
Object[] objs = Selection.objects;
|
|
if (objs.Length != 1)
|
|
{
|
|
Debug.LogError("请选中BMFont导出的fnt数据文件");
|
|
return;
|
|
}
|
|
if (objs[0].GetType() != typeof(TextAsset))
|
|
{
|
|
Debug.LogError("请选中BMFont导出的fnt数据文件");
|
|
return;
|
|
}
|
|
var item = objs[0];
|
|
string AssetFile = AssetDatabase.GetAssetPath(item);
|
|
|
|
string PathNameNotExt = AssetFile.Remove(AssetFile.LastIndexOf('.'));
|
|
string FileNameNotExt = PathNameNotExt.Remove(0, PathNameNotExt.LastIndexOf('/') + 1);
|
|
|
|
string TextPathName = PathNameNotExt + ".txt";
|
|
string MatPathName = PathNameNotExt + ".mat";
|
|
string FontPathName = PathNameNotExt + ".fontsettings";
|
|
string PngName = PathNameNotExt + "_0.png";
|
|
//Texture tex = Resources.Load(PngName) as Texture;
|
|
Texture tex = (Texture)AssetDatabase.LoadAssetAtPath(PngName, typeof(Texture));
|
|
if (!tex)
|
|
{
|
|
Debug.LogError("不存在 "+ PngName+" 文件");
|
|
return;
|
|
}
|
|
|
|
Material mat = (Material)AssetDatabase.LoadAssetAtPath(MatPathName, typeof(Material));
|
|
if (mat == null)
|
|
{
|
|
//创建材质球
|
|
mat = new Material(Shader.Find("Legacy Shaders/Transparent/Diffuse"));
|
|
mat.SetTexture("_MainTex", tex);
|
|
AssetDatabase.CreateAsset(mat, MatPathName);
|
|
}
|
|
else
|
|
{
|
|
mat.shader = Shader.Find("Legacy Shaders/Transparent/Diffuse");
|
|
mat.SetTexture("_MainTex", tex);
|
|
}
|
|
|
|
Font font = (Font)AssetDatabase.LoadAssetAtPath(FontPathName, typeof(Font));
|
|
|
|
if (font == null)
|
|
{
|
|
font = new Font(FileNameNotExt);
|
|
|
|
AssetDatabase.CreateAsset(font, FontPathName);
|
|
}
|
|
|
|
TextAsset m_data = (TextAsset)objs[0];
|
|
BMFont mbFont = new BMFont();
|
|
BMFontReader.Load(mbFont, m_data.name, m_data.bytes); // 借用NGUI封装的读取类
|
|
CharacterInfo[] characterInfo = new CharacterInfo[mbFont.glyphs.Count];
|
|
for (int i = 0; i < mbFont.glyphs.Count; i++)
|
|
{
|
|
BMGlyph bmInfo = mbFont.glyphs[i];
|
|
CharacterInfo info = new CharacterInfo();
|
|
info.index = bmInfo.index;
|
|
info.uv.x = (float)bmInfo.x / (float)mbFont.texWidth;
|
|
info.uv.y = 1 - (float)bmInfo.y / (float)mbFont.texHeight;
|
|
info.uv.width = (float)bmInfo.width / (float)mbFont.texWidth;
|
|
info.uv.height = -(float)bmInfo.height / (float)mbFont.texHeight;
|
|
info.vert.x = (float)bmInfo.offsetX;
|
|
info.vert.y = (float)bmInfo.offsetY;
|
|
info.vert.width = (float)bmInfo.width;
|
|
info.vert.height = (float)bmInfo.height;
|
|
info.width = (float)bmInfo.advance;
|
|
characterInfo[i] = info;
|
|
}
|
|
font.characterInfo = characterInfo;
|
|
font.material = mat;
|
|
|
|
// 通知编辑器有资源被修改了
|
|
EditorUtility.SetDirty(font);
|
|
// 保存所有修改
|
|
AssetDatabase.SaveAssets();
|
|
AssetDatabase.Refresh();
|
|
|
|
Debug.Log("OK");
|
|
|
|
//ShowNotification(new GUIContent("OK"));
|
|
}
|
|
|
|
[MenuItem("Tools/MakeFont/Make(废弃了)")]
|
|
static void Make()
|
|
{
|
|
Object[] objs = Selection.objects;
|
|
if (objs.Length != 2)
|
|
{
|
|
Debug.LogError("请选中Custom Font文件与BMFont导出的fnt数据文件");
|
|
return;
|
|
}
|
|
Font m_myFont;
|
|
TextAsset m_data;
|
|
if (objs[0].GetType() == typeof(TextAsset) && objs[1].GetType() == typeof(Font))
|
|
{
|
|
Debug.Log("text");
|
|
m_data = (TextAsset)objs[0];
|
|
m_myFont = (Font)objs[1];
|
|
Debug.Log("FontName:" + m_myFont.name + "\nData:" + m_data.name);
|
|
}
|
|
else if (objs[1].GetType() == typeof(TextAsset) && objs[0].GetType() == typeof(Font))
|
|
{
|
|
m_data = (TextAsset)objs[1];
|
|
m_myFont = (Font)objs[0];
|
|
Debug.Log("FontName:" + m_myFont.name + "\nData:" + m_data.name);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("请选中Custom Font文件与BMFont导出的fnt数据文件");
|
|
Debug.Log("FontName:null" + "\nData:null");
|
|
return;
|
|
}
|
|
|
|
BMFont mbFont = new BMFont();
|
|
BMFontReader.Load(mbFont, m_data.name, m_data.bytes); // 借用NGUI封装的读取类
|
|
CharacterInfo[] characterInfo = new CharacterInfo[mbFont.glyphs.Count];
|
|
for (int i = 0; i < mbFont.glyphs.Count; i++)
|
|
{
|
|
BMGlyph bmInfo = mbFont.glyphs[i];
|
|
CharacterInfo info = new CharacterInfo();
|
|
info.index = bmInfo.index;
|
|
info.uv.x = (float)bmInfo.x / (float)mbFont.texWidth;
|
|
info.uv.y = 1 - (float)bmInfo.y / (float)mbFont.texHeight;
|
|
info.uv.width = (float)bmInfo.width / (float)mbFont.texWidth;
|
|
info.uv.height = -(float)bmInfo.height / (float)mbFont.texHeight;
|
|
info.vert.x = (float)bmInfo.offsetX;
|
|
info.vert.y = (float)bmInfo.offsetY;
|
|
info.vert.width = (float)bmInfo.width;
|
|
info.vert.height = (float)bmInfo.height;
|
|
info.width = (float)bmInfo.advance;
|
|
characterInfo[i] = info;
|
|
}
|
|
m_myFont.characterInfo = characterInfo;
|
|
|
|
Debug.Log("OK");
|
|
}
|
|
}
|