前言:在遇到Unity支持的字体库之外的字体时,可以将每个字的图片集中生成一个字体库,用来Unity文本使用。

一、功能

1、字体图片设置

字体图片等比等分在一张图片上,方便Unity系统自处理

2、Unity精灵图片设置

设置如下图,点击SpriteEditor进行Unity系统编辑

3、图片修剪

1、系统默认的名字可以进行手动修改
2、如排版规范,间距等比,可直接点击Trim 然后Apply
3、如排版不规范,则点击对应字的图片,之后点击Slice可以进行自定义编辑剪切间距大小
完成之后效果如下:

4、将修剪好的图片放到Resources下,注意,一定要放到Resources的根目录下,方便代码实现。

2、代码

using UnityEngine;
using UnityEditor;
using System.IO;
public class SpriteToFont : MonoBehaviour
{//本方法是通过裁切的sprite导出字体文件,裁切使用的是unity自带的sprite editor,方便操作。//另外,裁切之后,每个sprite的名字的最后一个字符对应了ascii码的编码,比如://0: 我们只要将sprite的名字命名成xxx0,就可以了!//由于使用到的了sprite加载,所以字体图片请放在Resources目录下面,等制作完毕,再把他们放到fonts文件夹或者其他文件夹中即可。[MenuItem("Assets/CreateMyFontSprite")]static void CreateMyFontSprite(){if (Selection.objects == null)return;if (Selection.objects.Length == 0){Debug.LogWarning("没有选中Sprite文件,需要将Sprite Mode设置成Multiple,切分好,并且以以名字的最后一个字符当做ascii码");return;}string resoursePath = "Resources";UnityEngine.Object o = Selection.objects[0];if (o.GetType() != typeof(Texture2D)){Debug.LogWarning("选中的并不是图片文件");return;}string selectionPath = AssetDatabase.GetAssetPath(o);if (selectionPath.Contains(resoursePath)){string selectionExt = Path.GetExtension(selectionPath);if (selectionExt.Length == 0){return;}string loadPath = selectionPath.Remove(selectionPath.Length - selectionExt.Length);string fontPathName = loadPath + ".fontsettings";string matPathName = loadPath + ".mat";float lineSpace = 0.1f;//字体行间距,下面会根据最高的字体得到行间距,如果是固定高度,可以在这里自行调整  loadPath = Path.GetFileNameWithoutExtension(selectionPath);Sprite[] sprites = Resources.LoadAll<Sprite>(loadPath);if (sprites.Length > 0){//以textrue方式获得该资源,可以设置到创建的材质中去  Texture2D tex = o as Texture2D;//创建字体材质,并且将图片设置好  Material mat = new Material(Shader.Find("GUI/Text Shader"));AssetDatabase.CreateAsset(mat, matPathName);mat.SetTexture("_MainTex", tex);//创建字体文件,设置字体文件的材质  Font m_myFont = new Font();m_myFont.material = mat;AssetDatabase.CreateAsset(m_myFont, fontPathName);//创建字体中的字符集数组  CharacterInfo[] characterInfo = new CharacterInfo[sprites.Length];//得到最高的高度,设置行高和进行偏移计算  for (int i = 0; i < sprites.Length; i++){if (sprites[i].rect.height > lineSpace){lineSpace = sprites[i].rect.height;}}for (int i = 0; i < sprites.Length; i++){Sprite spr = sprites[i];CharacterInfo info = new CharacterInfo();//设置ascii码,使用切分sprite的最后一个字母  info.index = (int)spr.name[spr.name.Length - 1];Rect rect = spr.rect;//根据pivot设置字符的偏移,具体需要做成什么样的,可以根据自己需要修改公式  float pivot = spr.pivot.y / rect.height - 0.5f;if (pivot > 0){pivot = -lineSpace / 2 - spr.pivot.y;}else if (pivot < 0){pivot = -lineSpace / 2 + rect.height - spr.pivot.y;}else{pivot = -lineSpace / 2;}Debug.Log(pivot);int offsetY = (int)(pivot + (lineSpace - rect.height) / 2);//设置字符映射到材质上的坐标  info.uvBottomLeft = new Vector2((float)rect.x / tex.width, (float)(rect.y) / tex.height);info.uvBottomRight = new Vector2((float)(rect.x + rect.width) / tex.width, (float)(rect.y) / tex.height);info.uvTopLeft = new Vector2((float)rect.x / tex.width, (float)(rect.y + rect.height) / tex.height);info.uvTopRight = new Vector2((float)(rect.x + rect.width) / tex.width, (float)(rect.y + rect.height) / tex.height);//设置字符顶点的偏移位置和宽高  info.minX = 0;info.minY = -(int)rect.height - offsetY;info.maxX = (int)rect.width;info.maxY = -offsetY;//设置字符的宽度  info.advance = (int)rect.width;characterInfo[i] = info;}// lineSpace += 2;  m_myFont.characterInfo = characterInfo;EditorUtility.SetDirty(m_myFont);//设置变更过的资源  AssetDatabase.SaveAssets();//保存变更的资源  AssetDatabase.Refresh();//刷新资源,在Mac上不起作用,由于上面fresh之后在编辑器中依然没有刷新  //先把生成的字体导出成一个包,然后再重新导入进来,这样就可以直接刷新了  //这是在Mac上遇到的,不知道Windows下面会不会出现,如果不出现可以把下面这一步注释掉  AssetDatabase.ExportPackage(fontPathName, "temp.unitypackage");AssetDatabase.DeleteAsset(fontPathName);AssetDatabase.ImportPackage("temp.unitypackage", true);AssetDatabase.Refresh();//最佳高度:上下各留一个像素的间距,如果不需要可以注释掉,根据需求更改  //打印是为了使使用者方便填写行高,因为font不支持设置行高。  Debug.Log("创建字体成功, 最大高度:" + lineSpace + ", 最佳高度:" + (lineSpace + 2));}else{Debug.LogWarning("没有选中Sprite文件,需要将Sprite放到Resources文件夹下面");}}}
}

3、实现

1、将脚本放到Editor编辑器下,刷新Unity
2、去Resources下面找到修改好的图片,选中
3、然后点击Asset下的这个选项

4、成功之后如下
5、点击Import即可

此处字体就可以正常使用了,名字就是上一步自定义编辑的后缀名,没有编辑的字母是不显示的。

完结~~~~谢谢
欢迎留言改进 ~~ (ˉ▽ ̄~)

Unity制作美术字体、图片转字体库C#相关推荐

  1. Unity/UI —— 使用字符图片自定义字体(Custom Font)

    前言 在Unity的UI设计中,我们经常会遇到需要自定义字体的情况.毕竟Unity自带的字体只有Arial一种,根本无法满足人民群众对于美的向往.当然,全能的Unity支持我们导入或创建字体,并可以在 ...

  2. 【游戏开发实战】可爱的动物数字,教你在Unity中自制UGUI艺术字体(位图字体)(Bitmap Font Generator)

    文章目录 一.前言 二.最终效果 三.Bitmap Font Generator制作字体 1.准备字体图片 2.下载Bitmap Font Generator 3.bmfont64.exe导入图片 4 ...

  3. unity中美术字体的制作

    unity中美术字体的制作 本次总结:客户端制作美术字体.我已知的两种方式:1.FontSetter插件.2.BMFont工具.这里比较推荐第一种插件,方便.快捷.简单. FontSetter插件 F ...

  4. Unity自定义美术字体(图片字体fontsettings)

    目录 本文内容 效果 工具代码 制作美术字体 1 资源 1.1 资源方式 1.2 资源命名 1.3 资源命名配置 2 打包字体 2.1 创建字体 2.2 更新字体 3 字体使用 本文内容 开发过程有个 ...

  5. unity动态美术字体制作

    使用工具bmfont 把需要的文字写到一个文本文件,选择Edit->Select Chars from file. 可以看到文本里的字已经被选中了,然后Edit->Open Image M ...

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

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

  7. Unity3D-将美术提供的图片当做字体使用(普通图片自动生成Custom font)

    参考:http://blog.csdn.net/pz789as/article/details/54313122 我在上一篇文章中写了一个最新版本的导出fnt字体的方式,主要就是uv和vert的变化. ...

  8. Egret 使用Texture Merger制作美术字体

    在游戏中,有时候美术为了显示更好的字体效果,美术会自己制作字体,让程序显示出来,如何实现显示美术给的美术字体效果呢.程序可以使用美术导出图片,自己使用代码组合起来使用(效率低下,程序繁琐).或者是使用 ...

  9. Unity制作自定义字体的两种方法

    Unity支持自定义图片字体(CustomFont),网上有很多教程,细节不尽相同,当概括起来基本就是两种方式.一是使用BMFont,导出图集和.fnt文件,再使用图集在Unity中设置得到字体.二是 ...

最新文章

  1. c++Insertion Sort插入排序的实现算法(附完整源码)
  2. tomcat闪退没有报错_Appium在Android平台几种常见报错的解决方案
  3. Swif语法基础 要点归纳(一)
  4. 8idmp导入oracle 11g,11g导入8i的dmp文件问题
  5. eclipse折叠if语句块_Python学习日志01判断 if 语句
  6. ReentrantLock可重入锁
  7. ubuntu14.04 remmina远程连接rdp服务器失败解决办法
  8. oracle服务名连接慢,数据库 – Oracle SID和服务名称;连接问题
  9. 拓端tecdat|约会数据动态可视化分析:R语言使用ggplot和ganimate制作的动画图
  10. Java程序员必看的 14 本 Java 书籍!
  11. Vue:刷新页面 且只刷新一次
  12. 斯坦福大学公开课:iOS 7应用开发 (二)
  13. 天空里的云偶遇 彩虹做成衣裳也要用心呵护——潮港城的茶点,好芒果的冰饮...
  14. apscheduler使用中的时区问题
  15. 微信屏蔽网址解决办法,如何实现被微信屏蔽的网址在微信内正常访问
  16. 中煤哈密智能汽车电子衡系统过磅流程
  17. Typescript助力项目开发:JS切换TS、TS类型定制与思考
  18. slmgr.vbs -dlv 和slmgr.vbs -xpr查询win10激活的错误问题
  19. 【教3妹学算法-每日3题(3)】 判断矩阵经轮转后是否一致
  20. 智慧园区数据可视化解决方案

热门文章

  1. Ubuntu上安装NVIDIA VideoProcessingFramework (VPF)
  2. 推荐表的特长聘请html,毕业推荐表中的有何特长怎么写?
  3. 【IT技术】阿里RDS首席产品架构师何云飞:阿里云数据库的架构演进之路
  4. 紧致卷积网络设计——Shift卷积算子
  5. 如何手动启动消防广播_奥瑞那消防主机手册 如何手动启动消防广播
  6. dw的php选择滑动图片效果,页面图片浮动左右滑动效果的简单实现案例
  7. 记录使用svn合并代码(主干合并分支/分支合并主干)
  8. 达内java作业_【达内JAVA教程】达内Java基础题
  9. 电脑眼镜和蓝光眼镜区别是什么
  10. Edge Detector ----------Marr Hildreth 算法