不多说,先来效果图:

从头开始讲开发流程:

在Unity3d开发过程中,经常需要将美术提供的美术字组合成一个字体库,方便unity中的调用,BMFont则为此提供了不错的功能支持,它的下载地址在这里。它的使用方法网上有很多教程,这里不做解释,如果要使用此工具,要注意的是,这里记得使用xml格式,导出的图片为一张。

导出来的资源有:对应的图片,还有一个以fnt结尾的文件,如果打开此文件可以看到它就是一个xml文件:

在BMFont软件中我们这样操作:Options->Save configuration as...,把这个文件保存下来,它是以bmfc结尾的,保存了在bmfont里面相关的配置属性,其中对应的文字图片还有对应的值在imported icon images中保存,用记事本打开,就可以可到这样的界面:

以我的直觉,BMFont就是根据这样的一个配置文件生成对应的图片和xml文件。现在回到Unity,将BMFont生成的xml和图片分别拖动到1,2位置,点击Generate Font在对应的xml目录下便会生成字体文件和材质球,并且分别已经赋值,将字体拖动到ugui中的字体位置可见:

这样一个工具算是完成了,它的代码在这里,自己也可以进行修改。但是作为懒癌的我,觉得这样极不方便,制作字体时候,每次都要打开bmfont,然后导入unity,再接着将文件拖动到相关位置,还要点击生成字体,简直不能忍受,那么下一篇我们制作一个更加方便的工具。

using System.Collections.Generic;
using System.IO;
using System.Xml;
using UnityEditor;
using UnityEngine;public class BMFont : EditorWindow
{private TextAsset _fontTextAsset;private Texture _fontTexture;private string _fontsDir;[MenuItem("CTools/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();}
}

参考:

  • https://blog.csdn.net/akak2010110/article/details/50755270

转载于:https://www.cnblogs.com/Yellow0-0River/p/9020016.html

UGUI使用BMFont制作美术字体一相关推荐

  1. Unity学习小结5 - 利用BMFont制作美术字及要点注意

    虽然网上已经有不少这个的使用方法,但是基本都有个大前提,你能够制作的十分顺利,即便一开始就能够顺利的制作出一套美术字,也很难保证在以后的制作中不出现问题.我也是在被小小的坑了几个回合之后决定将这些容易 ...

  2. UGUI使用BMFont制作美术字体二

    还不多说,先来效果图: 是不是感觉比第一篇文章的工具更加高大上些,好了,现在开始讲开发流程,首先我们用到的工具依旧是BMFont,它的命令行在这里:bmfont.exe -c %1 -o %2 命令说 ...

  3. BMFont制作字体

    使用BMFont制作字体 1. 取消选中字体 2. Edit -> Open Image Manager弹出 3. 在Image Manager中菜单栏里Image->Import Ima ...

  4. Unity3d Ugui图片上制作点光 、棱形光效果shader,并具有裁切

    Unity3d Ugui图片上制作点光 .棱形光效果 实现的效果可以参考如下图所示 通过shader来实现上述的效果,为了大家的适应性,推荐在unity官方的默认ui shader上更改,我用的是20 ...

  5. UGUI和IMGUI制作血条

    UGUI和IMGUI制作血条 前言 这是中大计算机学院3D游戏编程课的一次作业,在这里分享一下设计思路. 主要代码上传到了gitee上,请按照后文的操作运行. 项目地址:https://gitee.c ...

  6. Unity3d之-使用BMFont制作美术字体

    一.需求 游戏开发中经常遇到需要以美术字(而非字库)做数字显示的情况,通常美术会提供一组包含单个数字(也会有其它字符)的图片,可能是一张整图,也可能是每个数字分开的散图. 在此我以一张整图这种情况为例 ...

  7. UGUI动画快速制作

    在UGUI中有一些交互的元件需要进行动画制作.在这里讲一个非常方便快速的制作方法. 我记得之前好像写过类似的文章,但是没在UGUI分类里.现在再使用新版的unity来制作一个. 当前版本使用 unit ...

  8. Unity UGUI 用BMFont工具自制艺术数字字体超超超详细教程(附工具下载链接)

    效果如下 速度开始制作流程: 1. 导入BMFont代码到unity. 在unity资源文件夹根目录创建文件夹命名为Editor,Editor文件夹下面创建文件夹BMFont,将下载的BMFont压缩 ...

  9. BMfont制作图片中的自定义字体,无需字体文件

    目录 1.Bmfont简介 2.认识Bmfont 3.字体制作 4.Id如何确定   我们在手游开发中,经常会用到一些特殊字体!比如玩家的得分,金币数量,VIP特别显示等,这些特殊字符像.font格式 ...

最新文章

  1. 5 OC 中的三种对象
  2. linux svn使用方法
  3. 初学图论-Bellman-Ford单源最短路径算法
  4. (LeetCode 153)Find Minimum in Rotated Sorted Array
  5. 清华《摸鱼学导论》开课啦!1000多学子在线摸鱼,开课老师为大一新生
  6. 从零单排学Redis【黄金】
  7. webBrowser1_DocumentCompleted不停被调用
  8. 使用 Chrome 开发者工具的 lighthouse 功能分析 web 应用的性能问题
  9. 3测试图片显示置信度_云上的移动性能测试平台
  10. 服务器内容推送技术(转)
  11. ios10发邮件服务器拒绝,IOS10用户拒绝网络权限后,如何引导开启?
  12. 使用Enide Studio 2014 IDE来表达JS WebApplication
  13. 〖Linux〗zigbee实验之cc2430的cc debugger固件升级实录
  14. 闭环系统辨识matlab,系统辨识-12-闭环辨识
  15. 移动端车牌识别要做到那一步?
  16. php 怎么打出来的,word书名号怎么打出来
  17. Mip-NeRF 360
  18. PikPak离线下载,磁力网盘
  19. 铁氧体磁芯电感的特性大揭秘
  20. 大趋势:科技赋能产业

热门文章

  1. 看深圳富人和穷人的记帐单
  2. BT08-B(蓝牙模块)与MG90S(舵机)开发灯控系统(基于51单片机)
  3. 简单实现一个打字机效果
  4. 宿州学院计算机等级考试,我校第54次全国计算机等级考试圆满结束
  5. 高通 camera CTS Verify FOV calibration debug
  6. 5G To B是电信“大力丸“?
  7. 通用计算机一体机,电脑一体机不会选?这两个牌子做的最好
  8. C++实现九进制转化十进制
  9. VB.NET版机房收费系统---报表
  10. SEO技术风口来了|SEO能否抓住全球约93%的网络用户?