今天的任务是制作一个在NGUI和UGUI中可以使用的新字体,利用该新字体的文本可以正常显示在界面上,并且还支持中文字符的输入与显示。我在这里记录下制作过程,希望可以帮助到其他爱好者。

为什么要用字体集呢?简单说一下原因,如果我们使用电脑字体库里的某种字体,比如说黑体,我们把它当成资源导入到自己的项目中,它本身就占用内存就10M,打包的时候呢,也会把它打包进去,为了尽量减少内存,减少不必要的内存开销,我们可以制作自己的字体集。还有一个原因呢,就是我们在游戏里面可能会用的文字不会很多,有的字呢,用一次就够了,所以导入一个占用内存大的字体包,不如自己制作一个有限制的,只有我们自己需要使用到的字体包。另外,其实当我们在UILable组件上选择NGUI的字体集之后,输入字符之后,我们在屏幕上把它放大,我们会发现它会变模糊,其实它是把字体集中的字符都制作成NGUI的图集,当我们输入文字的时候,它会创建图集上相应的像素块。这样的好处是无论我们在UILable上写多少字体集中有的字符,它都会只占用一个DrawCall。

接下来讲述font字体的制作。

一、首先要创建字体,所以大家去找一下BitMap这个工具,用来生成字体的。然后打开这个软件,点击Options-FontSettings进行字体设置。

注意:

1.我在这里选用新宋体,大家可以自行选择,也可以下载第三方的ttf字体通过Add font file导入。

2.字体编码默认的是unicode,这个要注意。

接下来设置字体的导出选项:

注意:

1.Width和Height的值,4096算是比较大的了。最好不要超过这个值,不然做出来的图集太大,会加大drawcall的数量。

2.如果要做NGUI字体集,Font descripor选择Text,如果是UGUI,选择XML!!因为后边要解析这个字体文件。

二、创建一个txt文本,上网找一下中英文常用字,把他们粘贴进去(到时候制作好的字体,文本中有的字符才能被输入/显示)。编码格式转换成UTF-8。

然后保存,回到bmfont,点击Edit——Select chars from file,这样文本中的所有字符都被选中了,之后就点击Options——Save bitmap font as...得到两个文件。

注意:把fnt文件的后缀重命名为txt。好了,大功告成,把这两个导入到unity中就行了。

三、NGUI字体集的制作

先说NGUI的字体制作(比较简单),点击NGUI——Open——Font Maker就可以制作。如图:

type类型选择imported bitmap,把对应的myfont.txt文件和myfont_0.png托入对应位置。图集这里可选可不选,点击create the Font就可以生成对应资源了(生成了一个字体集prefab和材质.mat文件)。

最后在NGUI下创建一个Label,选择NGUI-Font,把生成的字体集prefab拖进去就可以像系统字体一样自由的使用了!大功告成。

四、UGUI字体集的制作

注意:UGUI字体集的制作要稍微麻烦一些,还是首先把两个文件导入到工程(这里注意,fnt文本文件导出时设置为xml格式,上面的注意中有提到这个)。

1.首先创建一个材质球,shader的模式改为GUI/Text Shader,将字体纹理(.png文件)添加上去。

2.创建font文件,右键Create——Custom Font创建。将材质添加到font上,line Spacing行距根据自己的实际情况去改变一下。

2.后面就是最重要的步骤,配置Character Rects,网上有相关公式,不过对于包含很多字体的fnt文件,手动配置实在是太麻烦,所有从网上搜到了一位网友写的自动解析方法,注意这个方法只适用于xml格式的fnt文件。

using UnityEngine;
using System.Collections;
using System.Xml;
using System;public class CustomFontImportor : MonoBehaviour
{public Font font;public TextAsset textAsset;void Awake(){if(font == null || textAsset == null){Debug.LogError("请设置font和textAsset.");return;}XmlDocument xmlDocument = new XmlDocument();xmlDocument.LoadXml(textAsset.text);int totalWidth = Convert.ToInt32(xmlDocument["font"]["common"].Attributes["scaleW"].InnerText);int totalHeight = Convert.ToInt32(xmlDocument["font"]["common"].Attributes["scaleH"].InnerText);XmlElement xml = xmlDocument["font"]["chars"];ArrayList characterInfoList = new ArrayList();for(int i = 0; i < xml.ChildNodes.Count; ++i){XmlNode node = xml.ChildNodes[i];if(node.Attributes == null){continue;}int index = Convert.ToInt32(node.Attributes["id"].InnerText);int x = Convert.ToInt32(node.Attributes["x"].InnerText);int y = Convert.ToInt32(node.Attributes["y"].InnerText);int width = Convert.ToInt32(node.Attributes["width"].InnerText);int height = Convert.ToInt32(node.Attributes["height"].InnerText);int xOffset = Convert.ToInt32(node.Attributes["xoffset"].InnerText);int yOffset = Convert.ToInt32(node.Attributes["yoffset"].InnerText);int xAdvance = Convert.ToInt32(node.Attributes["xadvance"].InnerText);CharacterInfo info = new CharacterInfo();Rect uv = new Rect();uv.x = (float)x / totalWidth;uv.y = (float)(totalHeight - y - height) / totalHeight;uv.width = (float)width / totalWidth;uv.height = (float)height / totalHeight;info.index = index;info.uvBottomLeft = new Vector2(uv.xMin, uv.yMin);info.uvBottomRight = new Vector2(uv.xMax, uv.yMin);info.uvTopLeft = new Vector2(uv.xMin, uv.yMax);info.uvTopRight = new Vector2(uv.xMax, uv.yMax);info.minX = xOffset;info.maxX = xOffset + width;info.minY = -yOffset - height;info.maxY = -yOffset;info.advance = xAdvance;info.glyphWidth = width;info.glyphHeight = height;characterInfoList.Add(info);}font.characterInfo = characterInfoList.ToArray(typeof(CharacterInfo)) as CharacterInfo[];Debug.Log("生成成功.");}
}

使用方法也比较简单,拖到一个对象上面把自己创建的font和fnt字体文件拖拽到组件中,然后运行一下项目,即可生成,也可以改成Editor。最好可以看到完美的解析了出来

3.最后,在UGUI下创建一个Text,将创建的custom font文件拖拽到Font属性中,就可以自由使用了!大功告成。

注意:

在制作custom font的时候遇到点小问题,目前查阅了很多资料还没有很好解决,我不知道是不是这个功能还没有完善,还是自己在制作字体集的过程中出了一些差错,首先列出来这几个问题,后边慢慢填坑:

1.无法通过Size改变字体大小。 这可能是因为Custom Font本身无法改变字符大小,不过依然可以通过Scale来变相调节。

2.对于无法换行的问题,其实是可以通过修改Custom Font中的 Line Spacing 一项来解决该问题。

这些是我遇到的一些问题,也希望其他开发者有比较好的解决方案可以告诉我,万分感谢!

(二)unity优化方案:利用BMFont工具制作font字体(在UGUI和NGUI中使用)相关推荐

  1. CorelDRAW利用表格工具制作表格(二)

    在CorelDRAW制作表格的方法是多种的,除了使用图纸工具,我们还可以使用表格工具结合虚拟段删除工具快速制作可以合并单元格的表格效果,本文介绍使用表格工具制作表格. 利用表格工具制作表格 1.使用& ...

  2. CorelDRAW利用图纸工具制作表格(一)

    在CorelDRAW制作表格的方法是多种的,除了使用网格工具,很多朋友认为图纸工具更为便捷,使用图纸工具绘制网格要预先设置行数和列数.它所绘制出来的网格是由一组矩形组合而成的,这些矩形可以拆分或者合并 ...

  3. Unity 制作font字体

    有很多网友介绍Unity 创建并使用font的方法,这里总结一下备忘,同时网友的部分文章有一些小坑被我踩到,在这里记录一下,希望能帮助其他同学 一.首先创建字体(ttf文件),网上有用BitMap工具 ...

  4. 使用BMFont工具来精简字体库

    ** 转载请注明出处 https://blog.csdn.net/xiantanmeng/article/details/86478626 ** 在开发H5小游戏或者微信小游戏的时候,我们有时会用到一 ...

  5. 【Unity3D】美术字制作字体用于UGUI、NGUI

    一.首先是共有的步骤 使用工具 : BMFont 下载地址:http://www.angelcode.com/products/bmfont/ 因为测试版的不稳定性,这里下载1.13版即可 打开BMF ...

  6. 如何利用可视化工具制作折线图?步骤是什么?

    我们在写论文或者做一些PPT的时候,经常会需要画可视化折线图,虽然网上有很多可以制作折线图的可视化工具,但是大多都加了水印或者不够方便使用,直接用别人带水印的图显然是不行的.自己画的话又不会怎么办? ...

  7. python制作安装包_利用setupTool工具制作python安装包

    编写完成的python库源代码,需要进行制作python安装包,方便更新版本.方法记录如下: 1.新建一个目录结构如下的目录: --src ----TestLibrary ----TestLibrar ...

  8. HTMLCSS学习笔记(二十四)——利用border属性制作太极图与哆啦A梦

    旋转太极图 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF- ...

  9. 利用报表工具制作一张简单报表的主要流程

最新文章

  1. Unity 摄像机搭配陀螺仪的使用
  2. 2016年十大存储预测
  3. mysql having in_正确理解MySQL中的where和having的区别
  4. pku 1185 炮兵阵地
  5. ubuntu20.0.4更新至中文环境 | 具体步骤 + 图文详解
  6. Python之try except异常处理工作机制和案例解析
  7. PHP的instanceof作用
  8. ASP.NET MVC3 系列教程 - 部署你的WEB应用到IIS 6.0
  9. rf框架的缺点_2017热门开源自动化测试框架优缺点对比
  10. 超3000岗位!腾讯产业互联网新年大扩招!
  11. [读论文]三维激光扫描点云数据处理研究进展、挑战与趋势(2017)
  12. 人生感悟:与其临渊羡鱼,不如退而结网
  13. python搜索word关键字_Python根据关键字抓取word相关内容
  14. 倍福嵌入式控制器PLC各型号介绍
  15. bootstrap重置按钮
  16. host头攻击漏洞修复
  17. 【#9733;】选择好游戏认准这30个特质!
  18. 软件测试-面试题(基础+性能)
  19. airpods有一只耳机冒红光_AirPods单只耳机连接不上、充不上电、闪灯等问题解决方式...
  20. 灯的开关状态 :有 N 个灯放在一排,从 1 到 N 依次顺序编号。有 N 个人也从 1 到 N 依次编号。1 号将灯 全部关闭,2 将凡是 2 的倍数的灯 打开;3 号将凡是 3 的倍数的灯作相

热门文章

  1. js 控制网页全屏及退出全屏
  2. 直线模组常见故障的解决方法
  3. html 在td中加入input,如何将输入标签插入到td标签中?
  4. 关于html单页面使用vue组件
  5. php 时间加30分钟
  6. android nfc安全性,基于Android的NFC移动支付安全问题研究
  7. uni-app项目本地打包可在同机安装的不同apk
  8. 使用anaconda编程c语言,使用anaconda和conemu打造Python编程环境
  9. Mysql第三章:存储引擎(MyISAM和Innodb)
  10. 日志管理,定时和延迟任务