Unity游戏开始之使用图片制作自己的艺术字
作者:
烟雨迷离半世殇
来源
: https://blog.csdn.net/qq_15020543/article/details/89482444?spm=1001.2014.3001.5501
本篇博客我将和大家一起从零开始根据图片制作自己的艺术字(不包括汉字)
准备工作
BMFront http://www.angelcode.com/products/bmfont/ 编写艺术字体生成工具
using System.Collections.Generic;
public class BMFontEditor: EditorWindow
public TextAsset fontPosTbl;
public Texture fontTexture;
public Vector2 scrollPos;
[MenuItem("Tools/自定义字体生成工具")]
EditorWindow.GetWindow(typeof (BMFontEditor));
EditorGUILayout.BeginVertical();EditorGUILayout.LabelField("图集导出文件部分(如果字体相关资源已经准备完毕,请忽略这一部分)", EditorStyles.label);if (GUILayout.Button("在Project视图选中要导出文件的图集,然后点击此按钮"))
EditorGUILayout.LabelField("正式生成艺术字部分", EditorStyles.label);
fontTexture = (Texture) EditorGUILayout.ObjectField("选择BMFont生成的png文件", fontTexture, typeof (Texture), false);
EditorGUILayout.LabelField("选择BMFont生成的fnt文件", EditorStyles.label);
fontPosTbl = (TextAsset) EditorGUILayout.ObjectField(" ", fontPosTbl, typeof (TextAsset), false);if (GUILayout.Button("开始生成字体"))
if (fontTexture == null) this.ShowNotification(new GUIContent("No Font Texture selected"));else if (fontPosTbl == null) this.ShowNotification(new GUIContent("No Font Position Table file selected"));
CalcChrRect(fontPosTbl, fontTexture);
EditorGUILayout.EndVertical();
private void ProcessToSprite()
Texture2D image = Selection.activeObject as Texture2D;
string rootPath = System.IO.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++)
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));
if(myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24){Texture2D newTexture = new Texture2D(myimage.width, myimage.height);newTexture.SetPixels(myimage.GetPixels(0),0);
var pngData = myimage.EncodeToPNG();
File.WriteAllBytes(rootPath + "/" + image.name + "/" + metaData.name + ".PNG", pngData);
void CalcChrRect(TextAsset posTbl, Texture tex)
string fileName = AssetDatabase.GetAssetPath(fontPosTbl);string texName = AssetDatabase.GetAssetPath(tex);string fontName = System.IO.Path.GetFileNameWithoutExtension(fileName);string fontPath = fileName.Replace(".fnt", ".fontsettings");string matPath = fileName.Replace(".fnt", ".mat");
string txt = posTbl.text;
List<ChrRect> tblList = new List<ChrRect>();foreach (string line in txt.Split('\n'))
if (line.IndexOf("char id=") == 0)
ChrRect d = GetChrRect(line, imgw, imgh);
new GUIContent("Failed");
ChrRect[] tbls = tblList.ToArray();
SetCharacterInfo(tbls, font);
Material mat = new Material(Shader.Find("UI/Default"));
Debug.Log(System.IO.Path.GetFileNameWithoutExtension(fileName));
AssetDatabase.CreateAsset(mat, matPath);AssetDatabase.CreateAsset(font, fontPath);AssetDatabase.SaveAssets();this.ShowNotification(new GUIContent("Complete"));AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
void SetCharacterInfo(ChrRect[] tbls, Font fontObj)
CharacterInfo[] nci = new CharacterInfo[tbls.Length];for (int i = 0; i < tbls.Length; i++)
nci[i].index = tbls[i].index;nci[i].advance = (int) tbls[i].width;nci[i].uv.x = tbls[i].uvX;nci[i].uv.y = tbls[i].uvY;nci[i].uv.width = tbls[i].uvW;nci[i].uv.height = tbls[i].uvH;nci[i].vert.x = tbls[i].vertX;nci[i].vert.y = tbls[i].vertY;nci[i].vert.width = tbls[i].vertW;nci[i].vert.height = tbls[i].vertH;
fontObj.characterInfo = nci;
ChrRect GetChrRect(string line, float imgw, float imgh)
ChrRect d = new ChrRect();
foreach (string s in line.Split(' '))
if (s.IndexOf("id=") >= 0) d.id = GetParamInt(s, "id=");else if (s.IndexOf("x=") >= 0) d.x = GetParamInt(s, "x=");else if (s.IndexOf("y=") >= 0) d.y = GetParamInt(s, "y=");else if (s.IndexOf("width=") >= 0) d.w = GetParamInt(s, "width=");else if (s.IndexOf("height=") >= 0) d.h = GetParamInt(s, "height=");else if (s.IndexOf("xoffset=") >= 0) d.xofs = GetParamInt(s, "xoffset=");else if (s.IndexOf("yoffset=") >= 0) d.yofs = GetParamInt(s, "yoffset=");else if (s.IndexOf("xadvance=") >= 0) d.width = GetParamInt(s, "xadvance=");
d.uvY = (imgh - (d.y)) / imgh;
int GetParamInt(string s, string wd)
if (int.TryParse(s.Substring(wd.Length), out v)) return v;
正式开始
选择要制作字体的图片,并分割好sprites
![](https://filescdn.proginn.com/45c19196f8a111055c4b608889b7c413/9effa0c362f909d52f9759442c3102aa.webp)
![](https://filescdn.proginn.com/f6d0a93e6399c074f84322bfc73092a3/7490225cd23402764cec6fe126203d41.webp)
打开****自定义字体生成工具,根据说明生成图集文件
![](https://filescdn.proginn.com/0f98cfaeaf82819c4f8593f9cb09d18c/2607a4a6cb3285b307198a6ea7d7b902.webp)
打开BMFront工具
![](https://filescdn.proginn.com/1603f1fcfe5de03fe087a4c7283fc60b/2356a026c2f1df8ce4e298913c55d673.webp)
![](https://filescdn.proginn.com/82cf318843d170456a7255c317238331/eed03fa1e35ae9558a21e39d82914fd6.webp)
![](https://filescdn.proginn.com/d635bc08eabad9909dbbd3162d3caa4c/54b8e45a5df0f4618f43eae4b387d2f8.webp)
![](https://filescdn.proginn.com/23b1b991a9879f24fa874543e7aaa770/1d4ab5afee18210e311baf660f3d66ea.webp)
![](https://filescdn.proginn.com/4360b2cba52fecd2ca5ad62d7ead03b0/545f12e0d61651b8443c8472bedcdc9a.webp)
注意填写图片对应的Ascall码,0-48,1-49.。。。以此类推,不知道的可以百度,按照表对着填
微信搜索公众号 [爱上游戏开发],回复 “资料”,免费领取 200G 学习资料!
![](https://filescdn.proginn.com/0b0589669f978a8d6c1f37c14b151fe6/8c645c76923224de5d21f948430a3209.webp)
![](https://filescdn.proginn.com/cd99f1efb98de6919d9b238fa6439b84/7687cb5c129f4d55d8356cbd5aa98359.webp)
全部填写完毕
![](https://filescdn.proginn.com/2a02d8269638db2cea2a734395ad7a8a/36ffa8bf0bc94538fd5bd768b2a09b3d.webp)
![](https://filescdn.proginn.com/f2f303943d624d71901742fa91210eb3/8a6c0e7aba9bb4e0925f7fc917858175.webp)
打开Unity
![](https://filescdn.proginn.com/d78770c2540525568803b138b278150b/b5e6345eadbfecc5074645e43d32f72d.webp)
这时候我们要修改一下BMFront生成的位图文件
如下(不要问我为什么,因为我也不知道)
![](https://filescdn.proginn.com/67bd201e18a26631fc611154345ae053/c5febddfe5c13d74d60a9cd3b4171996.webp)
因为我们使用了镜像模式,所以y轴的值需要翻转,修改翻转y轴的值(原本是37,这里要改成-37)
![](https://filescdn.proginn.com/79208271b5abf2026866864473602ed2/c7166221af666150ac193874d1ff115a.webp)
再打开自定义字体生成工具,根据说明添加png和fnt文件
![](https://filescdn.proginn.com/2012263fdc265f670895ca7c1ecc5bbc/a5410cfbc085ac871d52ab89863ce5d3.webp)
在场景新建Text
![](https://filescdn.proginn.com/c1ba83e0389ac024cd596ba1dfeda279/ead7690a2005314581888ee530bf9e39.webp)
![](https://filescdn.proginn.com/1f7645b2e4ac0ad734b3e2aee260f756/c7e1c13c74475540b7397ff84945603e.webp)
OK
![](https://filescdn.proginn.com/34de9467299fd4040d2be966691c3628/69fd9c1a381e648014fff7ad7c2e6ee6.webp)
-- END --
增加此功能,让你的游戏添姿加彩
根据国家规定法规,请进行实名制认证!
对方申请添加您为好友!
增加此功能,让你的游戏添姿加彩 根据国家规定法规,请进行实名制认证!
对方申请添加您为好友!
公众号后台回复「资料」获取超多学习福利
>>> 点击进入技术讨论群 <<< ▽想深入了解么?
长按/扫码关注我吧↑↑↑
觉得不错就点个在看吧!
评论