Unity自定义美术字体(图片字体fontsettings)
目录
- 本文内容
- 效果
- 工具代码
- 制作美术字体
- 1 资源
- 1.1 资源方式
- 1.2 资源命名
- 1.3 资源命名配置
- 2 打包字体
- 2.1 创建字体
- 2.2 更新字体
- 3 字体使用
本文内容
开发过程有个很常见的需求:使用美术提供的图片来表现美术字体。
Unity官方为此提供了一个自定义字体,用于在UI上显示图片字体,具体各参数意义可以参考https://docs.unity3d.com/2022.2/Documentation/Manual/class-Font.html。
效果
如下,我们可以很自由的展示图片字体。
工具代码
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class CrisFontWindow: EditorWindow
{private string fontPath = "Assets/crisFont.fontsettings";private Font font;private Rect[] rects;private TextAsset characterCfg;void OnGUI(){GUILayout.BeginVertical();GUILayout.BeginHorizontal();GUILayout.Label("字体:", GUILayout.Width(100.0f));font = (Font)EditorGUILayout.ObjectField(font, typeof(Font), true);GUILayout.EndHorizontal();if (font == null){EditorGUILayout.BeginHorizontal();GUILayout.Label("字体路径", GUILayout.Width(100));fontPath = GUILayout.TextField(fontPath);EditorGUILayout.EndHorizontal();if (GUILayout.Button("新建字体")){Font newFont = new Font();try{AssetDatabase.CreateAsset(newFont, fontPath);font = AssetDatabase.LoadAssetAtPath<Font>(fontPath);}catch{}if (font == null) Debug.LogError("路径错误:" + fontPath);}}else{GUILayout.BeginHorizontal();GUILayout.Label("字体配置:", GUILayout.Width(100.0f));characterCfg = (TextAsset)EditorGUILayout.ObjectField(characterCfg, typeof(TextAsset), true);GUILayout.EndHorizontal();GUILayout.Label("请选中需要打入的字体文件");GUILayout.BeginHorizontal();if (GUILayout.Button("更新文本")) UpdateFont();GUILayout.EndHorizontal();}GUILayout.EndVertical();}void UpdateFont(){string fontPath = AssetDatabase.GetAssetPath(font);string fontDir = Path.GetDirectoryName(fontPath);var texSavePath = Path.Combine(fontDir, Path.GetFileNameWithoutExtension(fontPath) + ".png");CombineTexture(texSavePath);var tex = AssetDatabase.LoadAssetAtPath<Texture2D>(texSavePath);if (tex == null) Debug.LogError("未发现生成的图集");var matPath = Path.Combine(fontDir, Path.GetFileNameWithoutExtension(fontPath) + ".mat");var mat = AssetDatabase.LoadAssetAtPath<Material>(matPath);if (mat == null){var newMat = new Material(Shader.Find("GUI/Text Shader"));AssetDatabase.CreateAsset(newMat, matPath);mat = newMat;}mat.SetTexture("_MainTex", tex);EditorUtility.SetDirty(mat);var list = new List<CharacterInfo>();float maxHeight = 0;for (int i = 0; i < rects.Length; i++){if (rects[i].height > maxHeight) maxHeight = rects[i].height;}for (int i = 0; i < rects.Length; i++){Rect rect = ConvertToPixels(rects[i], tex.width, tex.height);int asciiIndex = ac[i];var charInfo = new CharacterInfo();charInfo.index = asciiIndex;Rect uv = ConvertToTexCoords(rect, tex.width, tex.height);charInfo.uvBottomLeft = new Vector2(uv.x, uv.y);charInfo.uvTopLeft = new Vector2(uv.x, uv.y + uv.height);charInfo.uvBottomRight = new Vector2(uv.x + uv.width, uv.y);charInfo.uvTopRight = new Vector2(uv.x + uv.width, uv.y + uv.height);charInfo.minX = 0;charInfo.maxX = (int)rect.width;charInfo.minY = (int)(tex.height / 2 - (maxHeight - rect.height) / 2 - rect.height);charInfo.maxY = (int)(tex.height / 2 - (maxHeight - rect.height) / 2);charInfo.advance = (int)rect.width;list.Add(charInfo);}font.material = mat;font.characterInfo = list.ToArray();EditorUtility.SetDirty(font);AssetDatabase.SaveAssets();AssetDatabase.Refresh();Debug.Log("更新成功");}Rect ConvertToPixels(Rect rect, int width, int height){Rect r = rect;r.xMin = Mathf.RoundToInt(rect.xMin * width);r.xMax = Mathf.RoundToInt(rect.xMax * width);r.yMin = Mathf.RoundToInt((1 - rect.yMax) * height);r.yMax = Mathf.RoundToInt((1 - rect.yMin) * height);return r;}Rect ConvertToTexCoords(Rect rect, int width, int height){Rect r = rect;if (width != 0 && height != 0){r.xMin = rect.xMin / width;r.xMax = rect.xMax / width;r.yMin = 1 - rect.yMax / height;r.yMax = 1 - rect.yMin / height;}return r;}List<int> ac = new List<int>();void CombineTexture(string texSavePath){ac.Clear();int num = Selection.objects.Length;if (num <= 0){Debug.LogError("请选中需要合并的数字图片");return;}Dictionary<string, object> cfgDic = null;if (characterCfg != null){cfgDic = MiniJSON.Json.Deserialize(characterCfg.text) as Dictionary<string, object>;}for (int i = 0; i < num; ++i){Texture2D tex = Selection.objects[i] as Texture2D;string name = Path.GetFileNameWithoutExtension(tex.name);if (cfgDic != null && cfgDic.ContainsKey(name))ac.Add((int)(cfgDic[name].ToString()[0]));elseac.Add((int)(name[0]));}Texture2D r = new Texture2D(2, 2, TextureFormat.RGBA32, false);Texture2D[] textures = new Texture2D[num];for (int i = 0; i < num; i++){Texture2D tex = Selection.objects[i] as Texture2D;textures[i] = tex;}rects = r.PackTextures(textures, 1);r.Apply();SaveTexture(r, texSavePath);}void SaveTexture(Texture2D texture, string path){if (texture == null) return;File.WriteAllBytes(path, texture.EncodeToPNG());AssetDatabase.ImportAsset(path);AssetDatabase.Refresh();}[MenuItem("CrisTools/UI/美术字体", false, 1102)]public static void OpenWin(){EditorWindow.GetWindow<CrisFontWindow>("美术字体");}
}
制作美术字体
1 资源
1.1 资源方式
美术提供所有字的单个图片,大小一致
重点注意:单个图片必须打开读写和关闭压缩,否则会出现打包失败或打包卡死的情况。
1.2 资源命名
图片名字使用图片对应的字,比如:表示“1”的图片命名就为1,表示“+”的图片命名就为+
1.3 资源命名配置
如果出现图片表示的字不能当做文件名时,则可以使用json配置。
比如表示“%”的图片文件名可以叫做“baifenhao”,“@”的图片叫做“at”,在json配置中
{
“baifenhao”:“%”,
“at”:“@”
}
2 打包字体
2.1 创建字体
如果需创建一个新字体,输入创建字体的路径即可。
如下,我们在测试路径下生成了一个font字体文件。
2.2 更新字体
当创建了一个新字体,或者将一个已有的字体拖到字体框中后,选中碎片资源,就可以对字体进行打包更新了。
注:如有特殊字符,使用了1.3中json配置,则将对应json拖至字体配置选框中。
更新过后,就能得到字体所需的图集和材质了。
3 字体使用
在支持富文本组件的font处选择刚生成的字体文件即可正常使用。
注:笔者的富文本组件包含内容过于繁多,在此就不贴出了。如果有需要且不知道富本文组件怎么制作的,可以使用hub上大佬们写的富文本组件。(https://github.com/wuxiongbin/uHyperText)
Unity自定义美术字体(图片字体fontsettings)相关推荐
- Unity制作美术字体、图片转字体库C#
前言:在遇到Unity支持的字体库之外的字体时,可以将每个字的图片集中生成一个字体库,用来Unity文本使用. 一.功能 1.字体图片设置 字体图片等比等分在一张图片上,方便Unity系统自处理 2. ...
- unity中美术字体的制作
unity中美术字体的制作 本次总结:客户端制作美术字体.我已知的两种方式:1.FontSetter插件.2.BMFont工具.这里比较推荐第一种插件,方便.快捷.简单. FontSetter插件 F ...
- unity 字体width_unity制作图片字体
有时候美术会给出一系列的艺术字,例如数字0,1,2,3,4,5,6,7,8,9,这些字以图片的形式给开发人员,这时候图片的用法怎么用呢? 第一种想到的方法是把图片按字命名,然后以字为key存成字典,获 ...
- unity动态美术字体制作
使用工具bmfont 把需要的文字写到一个文本文件,选择Edit->Select Chars from file. 可以看到文本里的字已经被选中了,然后Edit->Open Image M ...
- Unity 自定义字体 新功能 一
Unity 自定义字体 新功能 一 首先找一个字体库,我用的 Windws 系统,直接找微软的字拿来用, 在 目录下 C:\Windows\Fonts 随便找一个字体 在此我就拿 华为琥珀 字体(字体 ...
- 【游戏开发实战】可爱的动物数字,教你在Unity中自制UGUI艺术字体(位图字体)(Bitmap Font Generator)
文章目录 一.前言 二.最终效果 三.Bitmap Font Generator制作字体 1.准备字体图片 2.下载Bitmap Font Generator 3.bmfont64.exe导入图片 4 ...
- 【unity 笔记】ugui艺术字体
一.准备工具 美术字体图片 和bmfont(注意下64位还是32位) 注意:和美术沟通图片大小 ,尽量贴着字切不要留太大缝隙,因为间隔打包出来固定,无法调小间隔,如下图对比 这是有缝隙的情况: 这是缝 ...
- Android 为应用或Textview设置自定义字体,主流字体包
文章目录 前言 一.assets是什么? 二.APP全局字体 2.1.引入库 2.2.在Application中初始化calligraphy 2.3.让指定的Activity配置自定义字体 2.3.1 ...
- cocos-creator使用记录20_创建数字字体和图片字体
1.官方创建艺术数字字体 http://docs.cocos.com/creator/manual/zh/asset-workflow/label-atlas.html 需要准备一张按从0到9的顺序排 ...
最新文章
- 维护学习的一点体会与看法
- 全球只有4个人通关的游戏!不过如此
- linux之LAMP架构优化
- Windows又发现安全漏洞 能够控制网络用户
- 【逆向工具】IDA使用5-( string、图形化与视图的切换、图形化显示反汇编地址、自动注释、标签使用)...
- 2018前端常见问题整理
- C#实现字符串左旋转操作
- linux 第一个内核模块Hello World
- MaxCompute在电商场景中如何进行漏斗模型分析
- 广东省计算机学校哪所最好,广东省哪个技校比较好哪里好
- BZOJ 1191 [HNOI2006]超级英雄Hero
- yaesu7800 维修手册_《YAESU 八重洲 FT-7800系列 维修手册》.pdf
- 美图秀秀美化图片之【增强】模块界面与功能设计
- java 应用 中文字体_Linux 添加中文字体库,解决Java 生成中文水印不显示问题
- java7 xp版下载64位,xp32位系统可用最高版本jdk64位系统win10 64位系统
- html导航栏的渐变效果,html+css+js实现导航栏滚动渐变效果
- 难受难受,真它吗的难受... ...
- 前端取值的方式(ModelMap)
- 五年级下册计算机知识点,五年级下册信息技术知识点(教材解析泰山版)
- 秋招在即,你准备好了吗?BAT算法工程师面试经验分享。
热门文章
- mac苹果电脑 HbuilderX 格式化代码
- JavaScript验证字符串中是否含有中文汉字
- Moonbeam基金会与Arrington Capital共同启动1亿美金的生态增长基金以促进Moonbeam生态成长
- QuartusII 13.0自带的Modelsim Altera 10.1d破解
- 【已解决】Mac不能登录iCloud,账号密码输入正确会转圈,之后再次回到初始登陆iCloud页面
- 科技改变世界,爱普生以技术创新迎接消费升级
- mysql的increment详情
- 三星i718的优缺点
- c语言用怎么四舍五入小数,请问c语言如何实现四舍五入?
- 杭电计算机曾虹,《杭州电子科技大学学报(自然科学版)》核心期刊