精华内容
下载资源
问答
  • BMFont
    2021-05-18 15:51:25

    配合BMFont工具使用可以快速把图片转换为美术字,在项目中使用美术字体,需要准备一个材质球 一个空白字体,然后自己改一下路径,这三个脚本是分开的 ,先点art。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEditor;


    public class ArtFontTool
    {
        static Dictionary<Image, string> imageDic = null;
        [MenuItem("Font/Make ArtFont")]
        static public void GenAllFont()
        {
            imageDic = new Dictionary<Image, string>();
            string prefabs = Application.dataPath + "/BundleResources/UI/Prefabs/";
            foreach (var dir in Directory.GetFiles(prefabs,"*.prefab"))
            {
                ProcPrefab(dir.Substring(prefabs.Length));
            }
            AssetDatabase.SaveAssets();
        }

        static void ProcPrefab(string prefab)
        {
            Debug.Log("------------------------------------");
            Debug.Log(prefab);

            var prefabName = "Assets/BundleResources/UI/Prefabs/" + prefab;
            GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(prefabName);
            if(go == null)
            {
                return;
            }

            imageDic.Clear();
            Image[] imgs = go.GetComponentsInChildren<Image>(true);
            for(int i = 0; i < imgs.Length; ++i)
            {
                Image img = imgs[i];
                //var hash = img.mainTexture.imageContentsHash;
                //var sobj = new SerializedObject(img.sprite);
                Sprite s = img.sprite;

                string path = AssetDatabase.GetAssetPath(s.GetInstanceID());
                string relativeUrl = path.Replace("Assets/BundleResources/", "");
                if(relativeUrl.StartsWith("UI/ArtFont/Atlas"))
                {
                    Debug.Log(path + "------------->" + img.name);
                    imageDic.Add(img,relativeUrl);
                    img.sprite = null;
                }

            }

            if(imageDic.Count > 0)
            {
                ArtFontParser parser = go.GetComponent<ArtFontParser>();
                if(parser == null)
                {
                    parser = go.AddComponent<ArtFontParser>();
                }

                var it = imageDic.GetEnumerator();
                while(it.MoveNext())
                {
                    if(!parser.ImageDic.ContainsKey(it.Current.Key))
                    {
                        parser.ImageDic.Add(it.Current.Key, it.Current.Value);
                    }
                }
            }

            AssetDatabase.Refresh();      
        }
    }

     

     

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;


    public class ArtFontParser : MonoBehaviour , ISerializationCallbackReceiver
    {

        public List<string> UrlList = new List<string>();
        public List<Image> ImageList = new List<Image>();

        //Unity doesn't know how to serialize a Dictionary
        public Dictionary<Image, string> ImageDic = new Dictionary<Image, string>();

        private List<KEngine.SpriteLoader> loaders = new List<KEngine.SpriteLoader>();

        public void OnBeforeSerialize()
        {
            UrlList.Clear();
            ImageList.Clear();

            foreach (var kvp in ImageDic)
            {
                UrlList.Add(kvp.Value);
                ImageList.Add(kvp.Key);
            }                                

        }

        public void OnAfterDeserialize()
        {
            ImageDic = new Dictionary<Image, string>();

            for (int i = 0; i != Math.Min(UrlList.Count, ImageList.Count); i++)
            {
                ImageDic.Add(ImageList[i], UrlList[i]);
            }
                
        }

        void Awake()
        {
            string lan = KEngine.KTool.GetLanguageSimplify();
            lan = string.Format("/{0}/", lan);
            var it = ImageDic.GetEnumerator();
            while (it.MoveNext())
            {
                var key = it.Current.Value;
                key = key.Replace("/CH/", lan);
                var loader = KEngine.SpriteLoader.Load(key, (bool isOk, Sprite tex) =>
                 {
                     if (isOk)
                     {
                         it.Current.Key.sprite = tex;
                         it.Current.Key.SetNativeSize();
                     }
                 });

                loaders.Add(loader);
            }
        }

        void OnDestroy()
        {
            for (int i = 0; i < loaders.Count; ++i)
            {
                var loader = loaders[i];
                if (loader != null)
                {
                    loader.Release();
                }
            }

            loaders = null;
        }
    }

     

     

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Xml;
    using UnityEditor;
    using UnityEngine;

    public class FontTool
    {
        [MenuItem("Font/Make BmFont")]
        static void GenAllFont()
        {
            string fontPath = Application.dataPath + "/BundleResources/BMFont/";
            foreach (var dir in Directory.GetDirectories(fontPath))
            {
                GetFont(dir.Substring(fontPath.Length));
            }
        }

        static void GetFont(string fontName)
        {
            var root = string.Format("Assets/BundleResources/BMFont/{0}/", fontName);

            Material mtr = AssetDatabase.LoadAssetAtPath<Material>(string.Format("{0}{1}.mat",root,fontName));
            Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(string.Format("{0}{1}_0.png",root,fontName));

            mtr.mainTexture = texture;

            Font font = AssetDatabase.LoadAssetAtPath<Font>(string.Format("{0}{1}.fontsettings",root,fontName));

            XmlDocument xml = new XmlDocument();
            xml.Load(string.Format("{0}/BundleResources/BMFont/{1}/{2}.fnt", Application.dataPath,fontName,fontName));

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

            XmlNode node = xml.SelectSingleNode("font/chars");
            foreach(XmlNode nd in node.ChildNodes)
            {
                XmlElement xe = (XmlElement)nd;
                int x = int.Parse(xe.GetAttribute("x"));
                int y = int.Parse(xe.GetAttribute("y"));
                int width = int.Parse(xe.GetAttribute("width"));
                int height = int.Parse(xe.GetAttribute("height"));
                int advance = int.Parse(xe.GetAttribute("xadvance"));
                CharacterInfo chtInfo = new CharacterInfo();
                float texWidth = texture.width;
                float texHeight = texture.height;//width

                chtInfo.glyphHeight = texture.height;
                chtInfo.glyphWidth = texture.width;
                chtInfo.index = int.Parse(xe.GetAttribute("id"));

                chtInfo.uvTopLeft = new Vector2((float)x /texture.width, 1 - (float)y/ texture.height);
                chtInfo.uvTopRight = new Vector2((float)(x + width) / texture.width, 1 - (float)y / texture.height);
                chtInfo.uvBottomLeft = new Vector2((float)x / texture.width, 1 - (float)(y + height) / texture.height);
                chtInfo.uvBottomRight = new Vector2((float)(x + width) / texture.width, 1 - (float)(y + height) / texture.height);

                chtInfo.minX = 0;
                chtInfo.minY = -(height / 2);
                chtInfo.maxX = width;
                chtInfo.maxY = height / 2;

                chtInfo.advance = width;

                chtInfoList.Add(chtInfo);
            }

            font.characterInfo = chtInfoList.ToArray();
            EditorUtility.SetDirty(font);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
            Debug.Log("BMFont gen Done ->" + root);
        }
    }

    更多相关内容
  • 下面是一个使用来通过XHR快速解析BMFont文件的示例: var createGeometry = require ( 'three-bmfont-text' )var loadFont = require ( 'load-bmfont' )loadFont ( 'fonts/Arial.fnt' , function ( err , font ) { ...
  • png2bm字体 将 png 字形转换为兼容的纹理/fnt 文件。 该软件使用和和 。
  • 看了看BMFont的源码, 修改了几个bug,解决了最新win10崩溃问题。运行杀毒软件可能会报木马,可以允许。
  • 看了下BMFont的源码,不太规范,修改了几个bug,解决了最新win10崩溃问题。由于自己编译的版本没有签名,可能杀软会报木马,可以允许。
  • 转换-bmfont 将从一种格式转换为另一种格式的命令行工具。 默认输出以与其他模块组合。 安装: npm install convert-bmfont -g 用法: # convert text to binary convert-bmfont Arial.xml --format bin > ...
  • 解析-bmfont-ascii 解析 ASCII(文本) 。 接受一个字符串或缓冲区: var fs = require ( 'fs' )var parse = require ( 'parse-bmfont-xml' )fs . readFileSync ( __dirname + '/Arial.fnt' , function ( err , data...
  • BMFont字体制作和导出

    2016-07-07 11:37:19
    资源复用,意在积累!
  • bmfont64.exe.zip

    2020-12-12 09:06:59
    本资源是解决了win10 崩溃的版本, cocos creator studio 字体位图生成器 下载直接可运行。
  • 布局-bmfont-文本 提供从左到右的拉丁文字的布局和自动换行,主要用于在Canvas / WebGL中渲染位图字体。 输入字体应为BMFont json格式,请参见。 您可以使用进行测试,或使用进行节点/浏览器加载。 var createLayout...
  • bmfont64.zip

    2021-03-23 19:04:31
    bmfont64.zip
  • bmfont64.exe

    2020-04-17 15:03:55
    cocos creator字体位图生成器 下载直接可运行 不会崩溃 非常好用 就是不是中文版的,不过也是不错的
  • fontbm --font-file FreeSans.ttf --output myfont 它将生成myfont.fnt()和myfont.png()。 可用选项(需要粗体选项): 选项 默认 评论 --font文件 ttf文件的路径,必需(可以为备用字体设置多次) -输出 ...
  • BMFont.rar

    2019-06-14 13:53:34
    该工具可以将文字或者图片图标打成图集,生成的文件可以导入Unity或者Cocos中使用
  • BMFont字体制作工具

    千次下载 热门讨论 2013-12-26 14:33:25
    这款是肢体制作软件,我相信大家都知道这个是用来干嘛的了。
  • 位图字体工具BMFont

    2019-04-09 14:11:42
    美工提供的位图字体,经常使用起来比较麻烦,这样就可以用字体工具BMFont,把位图字体做个一个FNT字体来使用啦
  • BMfont字体编辑插件

    2020-12-23 18:23:07
    CocosCrearor引擎插件,用于编辑BMfont字体,实测可用
  • 包 bmfonts 将多个 BMFont 文件打包到一个二进制缓冲区中。 pack-bmfonts fonts/ * .{xml,fnt} > fonts/packed.bin 加载 ASCII(文本)、XML、二进制和 JSON。 接受多个 globs 作为条目。 有关二进制详细信息,请...
  • bmfont1.14版

    2018-05-27 23:55:15
    a free bitmap font generator
  • BMFont 字体制作工具

    2015-08-28 11:50:37
    BMFont是一个写字库,专门改变NGUI字体! 这个程序将允许您生成TrueType字体位图字体。应用程序生成两个图像文件,并且可以通过一个游戏被读取,便于呈现的字体字符的描述。 如果你没有一个图像浏览器能够读取TGA ,...
  • 写-bmfont-二进制 根据将 JSON BMFont 编码为二进制缓冲区。 可以在 Node 或浏览器中使用(例如使用 browserify)。 var font = require ( 'bmfont-lato' )var write = require ( 'write-bmfont-binary' )//write ...
  • 此文件中常用汉字,字母,数字,符号都有可直接导入使用 http://download.csdn.net/detail/w521661/6716623 下载编辑器
  • three-bmfont-text:使用word包装将BMFont文件呈现在ThreeJS 中
  • BMFont字体制作工具。

    2017-11-29 14:21:21
    需要安装Java jdk运行环境。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • BMFont 工具

    2016-04-16 13:38:37
    BMFont 工具
  • BMFont位图制作工具

    2016-04-08 11:23:57
    BMFont是游戏中常用的字体制作工具,此BMFont下载后可以直接双击使用,省去安装。而且不会崩溃哦~,之前用安装好坑,老崩溃!
  • 解析-bmfont-二进制 根据将二进制缓冲区中的 BMFont 编码为 JSON。 可以在 Node 或浏览器中使用(例如使用 browserify)。 var parse = require ( 'parse-bmfont-binary' ) fs . readFile ( 'fonts/Lato.bin'...
  • 修改Bitmap Font Generator bmfont exe 是因为公司使用的cocos2d x升级 使用的Cocos Studio也升级到对应的1 5 0 1版本 然后发现原版的bmfont生成的fnt以及png 在Cocostudio中无法显示 例如: 以前的bmfont exe生成...
  • Unity BMFont自定义字体

    2020-04-20 16:59:33
    Unity中,使用位图字体工具BMFont从图片生成自定义字体流程 一、首先下载BMFont工具并安装:http://www.angelcode.com/products/bmfont/ 二、使用BMFont工具制作字体库 1、先做一些设定:"Options"->“Export ...

    Unity中,使用位图字体工具BMFont从图片生成自定义字体流程

    一、首先下载BMFont工具并安装:http://www.angelcode.com/products/bmfont/

    二、使用BMFont工具制作字体库

    1、先做一些设定:"Options"->“Export options”

    宽度设置为所有素材宽度总和,高度为素材的高度(长和宽可以设置得稍微大一点,注意不要大太多),位深设置为32,输出描述为XML格式,输出图片为PNG。

    2、点击"Edit"->"Open Image Manager",打开图片导入界面:

    3、点击"Image"->"Import image...":

    导入图片,填写图片的ID,如这里导入的是0,把鼠标放到0的位置就会显示0的AscII是48。按上述方法,依次加入其它字符的图片,然后关闭Image Manager弹窗。

    4、导出图片,导出之前可以先点击"Options"->"Visualize"预览一下:

    导出之前,点击"Edit"->"(Un)Select all chars",取消选择所有字符,避免将不需要的字符也导出来。最后点击"Options"->"Save bitmap font as..."导出字体。将生成的.fnt及.png复制到项目中,接下来开始制作字体。

    三、制作字体

    工程中添加制作字体的脚本:

    public class BMFont : EditorWindow
    {
        private TextAsset _fontTextAsset;
        private Texture _fontTexture;
        private string _fontsDir;
    
        [MenuItem("FontTools/BMFont", false, 12)]
        private static void BMFontTools()
        {
            BMFont bmFont = new BMFont();
            bmFont.Show();
        }
    
        private string _getAssetPath(string path)
        {
            string pathTemp = path.Replace("\\", "/");
            pathTemp = pathTemp.Replace(Application.dataPath, "Assets");
            return pathTemp;
        }
    
        void OnGUI()
        {
            EditorGUILayout.BeginVertical();
            TextAsset taTemp = EditorGUILayout.ObjectField("选择Font文件:", _fontTextAsset, typeof(TextAsset), true) as TextAsset;
            if (taTemp != _fontTextAsset && taTemp != null)
            {
                string assetDir = Directory.GetParent(AssetDatabase.GetAssetPath(taTemp)).FullName;
                assetDir = _getAssetPath(assetDir);
                string imgPath = string.Format("{0}/{1}_0.png", assetDir, taTemp.name);
                _fontTexture = AssetDatabase.LoadAssetAtPath<Texture>(imgPath);
                _fontsDir = string.Format("{0}.fontsettings", Path.Combine(assetDir, taTemp.name));
                if (_fontTexture == null)
                {
                    _fontsDir = string.Empty;
                    Debug.LogError(string.Format("未发现{0}文件", imgPath));
                }
            }
            _fontTextAsset = taTemp;
    
            _fontTexture = EditorGUILayout.ObjectField("选择Font图片文件:", _fontTexture, typeof(Texture), true) as Texture;
    
            GUI.enabled = false;
            _fontsDir = EditorGUILayout.TextField("字体生成路径:", _fontsDir);
            GUI.enabled = true;
            if (GUILayout.Button("Generate Font"))
            {
                if (!string.IsNullOrEmpty(_fontsDir))
                {
                    Material mat = AssetDatabase.LoadAssetAtPath<Material>(_fontsDir.Replace(".fontsettings", ".mat"));
                    if (mat == null)
                    {
                        mat = new Material(Shader.Find("UI/Default Font"));
                        AssetDatabase.CreateAsset(mat, _fontsDir.Replace(".fontsettings", ".mat"));
                    }
                    if (_fontTexture != null)
                    {
                        mat = AssetDatabase.LoadAssetAtPath<Material>(_fontsDir.Replace(".fontsettings", ".mat"));
                        mat.SetTexture("_MainTex", _fontTexture);
                    }
                    else
                    {
                        Debug.LogError("贴图未做配置,请检查配置");
                        return;
                    }
    
                    Font font = AssetDatabase.LoadAssetAtPath<Font>(_fontsDir);
                    if (font == null)
                    {
                        font = new Font();
                        AssetDatabase.CreateAsset(font, _fontsDir);
                    }
    
                    _setFontInfo(AssetDatabase.LoadAssetAtPath<Font>(_fontsDir),
                        AssetDatabase.GetAssetPath(_fontTextAsset),
                        _fontTexture);
                    font = AssetDatabase.LoadAssetAtPath<Font>(_fontsDir);
                    font.material = mat;
                }
                else
                {
                    Debug.LogError("创建失败,请检查配置");
                }
            }
            EditorGUILayout.EndVertical();
        }
    
        private void _setFontInfo(Font font, string fontConfig, Texture texture)
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(fontConfig);
            List<CharacterInfo> chtInfoList = new List<CharacterInfo>();
            XmlNode node = xml.SelectSingleNode("font/chars");
            foreach (XmlNode nd in node.ChildNodes)
            {
                XmlElement xe = (XmlElement)nd;
                int x = int.Parse(xe.GetAttribute("x"));
                int y = int.Parse(xe.GetAttribute("y"));
                int width = int.Parse(xe.GetAttribute("width"));
                int height = int.Parse(xe.GetAttribute("height"));
                int advance = int.Parse(xe.GetAttribute("xadvance"));
                CharacterInfo info = new CharacterInfo();
                info.glyphHeight = texture.height;
                info.glyphWidth = texture.width;
                info.index = int.Parse(xe.GetAttribute("id"));
                //这里注意下UV坐标系和从BMFont里得到的信息的坐标系是不一样的哦,前者左下角为(0,0),
                //右上角为(1,1)。而后者则是左上角上角为(0,0),右下角为(图宽,图高)
                info.uvTopLeft = new Vector2((float)x / texture.width, 1 - (float)y / texture.height);
                info.uvTopRight = new Vector2((float)(x + width) / texture.width, 1 - (float)y / texture.height);
                info.uvBottomLeft = new Vector2((float)x / texture.width, 1 - (float)(y + height) / texture.height);
                info.uvBottomRight = new Vector2((float)(x + width) / texture.width, 1 - (float)(y + height) / texture.height);
    
                info.minX = 0;
                info.minY = -height;
                info.maxX = width;
                info.maxY = 0;
    
                info.advance = advance;
    
                chtInfoList.Add(info);
            }
            font.characterInfo = chtInfoList.ToArray();
            AssetDatabase.Refresh();
        }
    }

    在FontTools目录下打开BMFont弹窗,选择上面制作好的Font文件,点击"Generate Font"按钮,即可生成:

    如果没有异常的话会生成如下两个文件:

    点击Font文件,可看到如下信息,"Line Spacing"一般设置为1,第一个项目是标点,因为图片的高度只有100,而其它图片高度有244,所以这里设置Y偏移-144,这样才能显示正确,如果图片高度都是一样的话就不用设置了。

    四、使用字体

    新建Text文本,把文本的字体设置成上面制作的字体就可以了。

     

    另外附上了段切割图片的代码(如果数字切在一张图片里,可以使用这个把数字切成单张素材再制作字体)

    public static class ImageSlicer
    {
        [MenuItem("Assets/切割图片/Process to Sprites")]
        static void ProcessToSprite()
        {
            Texture2D image = Selection.activeObject as Texture2D;//获取旋转的对象
            string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称
            string path = rootPath + "/" + image.name + ".PNG";//图片路径名称
    
    
            TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureImporter;//获取图片入口
    
    
            AssetDatabase.CreateFolder(rootPath, image.name);//创建文件夹
    
    
            foreach (SpriteMetaData metaData in texImp.spritesheet)//遍历小图集
            {
                Texture2D myimage = new Texture2D((int)metaData.rect.width, (int)metaData.rect.height);
    
                for (int y = (int)metaData.rect.y; y < metaData.rect.y + metaData.rect.height; y++)//Y轴像素
                {
                    for (int x = (int)metaData.rect.x; x < metaData.rect.x + metaData.rect.width; x++)
                        myimage.SetPixel(x - (int)metaData.rect.x, y - (int)metaData.rect.y, image.GetPixel(x, y));
                }
    
    
                //转换纹理到EncodeToPNG兼容格式
                if (myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24)
                {
                    Texture2D newTexture = new Texture2D(myimage.width, myimage.height);
                    newTexture.SetPixels(myimage.GetPixels(0), 0);
                    myimage = newTexture;
                }
                var pngData = myimage.EncodeToPNG();
    
    
                File.WriteAllBytes(rootPath + "/" + image.name + "/" + metaData.name + ".PNG", pngData);
                // 刷新资源窗口界面
                AssetDatabase.Refresh();
            }
        }
    }

     

    展开全文
  • BMFont字体合成工具

    2018-04-18 17:14:02
    这是一个将分散的美术字图片按字码表合成fnt字体文件的工具。里面有一个ASCII码表以及操作说明,一看就会,目前只有window版本。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,156
精华内容 2,462
关键字:

BMFont