Auto Create Editable Copy Font(Unity3D开发之二十二)
猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/48318879
Unity中咱们经常对字体做Create Editable Copy,虽然已经非常方便了,但是实际使用场景中,有时候会有不方便的地方。
- 我们经常对同一个字体做不同字体大小的Copy,这个时候,每次都去修改font的属性,非常之蛋疼。
- 本地化翻译文件导出的文字需要手工加到字体属性中,如果同一个字体还有不同大小,更蛋疼了。
- 以上你都可以忍了,但是你再次Create Editable Copy之后,你发现场景中已经使用了改字体的Text组件全显示Miss Font
已经不能忍了……
咱们脚本搞定这事,具体实现后效果
1. 用配置文件指明需要使用的font name,font size,导出的字符集内容
2. 根据配置文件Create Editable Copy,同时保证场景中已存在的组件不丢失字体
一、添加Editor脚本:
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System;
using System.IO;
public class CreateEditableCopyFont
{
[MenuItem ("Assets/Create Editable Copy Font")]
static void CreateFont ()
{
TextAsset sourceTextAsset = null;
try {
sourceTextAsset = (TextAsset)Selection.activeObject;
} catch (InvalidCastException e) {
Debug.Log ("Selected Object is not a txt file: " + Environment.NewLine + e.Message);
}
if (sourceTextAsset == null) {
EditorUtility.DisplayDialog ("No Config selected", "Please select a TxtFile Config...\nSuch as Exsample.txt:\nname=Assets/GameAssets/Fonts/impact.ttf,size=40\n123456789abcdefghijk", "Cancel");
return;
}
int targetFontSize;
string sourceFontPath, targetFontPath, targetFontCharacters = "";
try {
string sourceConfigPath = AssetDatabase.GetAssetPath (Selection.activeObject);
string[] sourceConfigInfos = sourceTextAsset.text.Split ('\n');
string headInfo = sourceConfigInfos [0];
string[] headInfos = headInfo.Split (',');
sourceFontPath = headInfos [0].Split ('=') [1];
targetFontPath = sourceConfigPath.Replace (".txt", "_copy");
targetFontSize = int.Parse (headInfos [1].Split ('=') [1]);
for (int i = 1; i < sourceConfigInfos.Length; i++) {
targetFontCharacters += sourceConfigInfos [i];
}
} catch (Exception ex) {
EditorUtility.DisplayDialog ("Config Error", "The config header data error...", "Cancel");
return;
}
// 重新生成字体文件会导致场景中已存在的丢失,
// 所以需要生成后再次赋值
string[] targetFontPathInfos = targetFontPath.Split ('/');
string textCheckName = targetFontPathInfos [targetFontPathInfos.Length - 1];
List<Text> listTexts = new List<Text> ();
foreach (Text text in UnityEngine.Object.FindObjectsOfType(typeof(Text))) {
if (text.font.name == textCheckName) {
listTexts.Add (text);
}
}
UnityEngine.Object f = AssetDatabase.LoadMainAssetAtPath (sourceFontPath);
string path = AssetDatabase.GetAssetPath (f);
TrueTypeFontImporter fontImporter = AssetImporter.GetAtPath (path) as TrueTypeFontImporter;
fontImporter.fontTextureCase = FontTextureCase.CustomSet;
fontImporter.customCharacters = targetFontCharacters;
fontImporter.fontSize = targetFontSize;
fontImporter.SaveAndReimport ();
AssetDatabase.Refresh ();
Font font = fontImporter.GenerateEditableFont (targetFontPath);
foreach (Text item in listTexts) {
item.font = font;
}
// 还原ttf设置
fontImporter.fontTextureCase = FontTextureCase.Dynamic;
fontImporter.SaveAndReimport ();
AssetDatabase.Refresh ();
System.GC.Collect ();
}
}
二、添加配置文件
impact_40.txt
name=Assets/HEGameLib/Examples/Fonts/impact.ttf,size=40
123456789abcdefg,All Characters you want export.
注意,配置文件我弄的很简单,第一行是使用的原字体和大小,第二行开始是你的需要导出的字符集。
将该文件放到你需要生成字体的目录,比如:Assets/GameAssets/Fonts/ 下。
三、生成字体
右键第二步中放入的配置文件,在弹出菜单中点击 Create Editable Copy Font
该目录下会生成所需字体。
再次生成该字体,场景中已存在的字体不会丢失。
修改:
修复导出字体后为还原原始ttf文件设置(20150911)
Auto Create Editable Copy Font(Unity3D开发之二十二)的更多相关文章
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- 网站开发进阶(四十二)巧用clear:both
网站开发进阶(四十二)巧用clear:both 前言 我们在制作网页中用div+css或者称xhtml+css都会遇到一些很诡异的情况,明明布局正确,但是整个画面却混乱起来了,有时候在IE6下看的很正 ...
- iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)
iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...
- iOS 11开发教程(十二)iOS11应用视图始祖——UIView
iOS 11开发教程(十二)iOS11应用视图始祖——UIView 在Swift中,NSObject是所有类的根类.同样在UIKit框架(UIKit框架为iOS应用程序提供界面对象和控制器)中,也存在 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- 为什么DIY报价----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十二)[转]
前段时间,写了一个开发.实施.服务费用计算三部曲. 水清则无鱼--走出软件作坊:三五个人十来条枪 如何成为开发正规军(八) 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九 ...
随机推荐
- PHP学习(2)——运行环境搭建
学习PHP首先要搞定PHP的运行环境.PHP的运行环境包括:PHP语言解析器本身以及Apache服务器.MySQL数据库等.因为只是学习嘛,尽快的搭建起来运行环境就好,到后期慢慢懂得多了再去想规范化搭 ...
- Linux 高性能服务器编程——socket选项
socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...
- [Pelican]Pelican入门(二)
之前是搭建了一个简单的博客,但是没有图片,没有具体的栏目分类 这次来研究下 一 导航栏 之前是直接把.md扔到的content文件夹下,结果导航栏,显示的是Category信息. 现在这么改成 D:. ...
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- SSH网上商城---邮件发送
注册网站账号的时候,都需要发送激活邮件,然后让注册的用户点击激活链接方可完成注册,不过话说回来,为什么注册的时候需要发送邮件呢?为什么不注册的时候直接激活呢?一定要收一封激活帐号的邮件?网站这样做的好 ...
- 携程React Native实践
React Native(下文简称 RN)开源已经一年多时间,国内各大互联网公司都在使用,携程也在今年 5 月份投入资源开始引入,并推广给多个业务团队使用,本文将会分享我们遇到的一些问题以及我们的优化 ...
- android自定义View-继承
介绍anroid通过继承系统的控件自定义view 方法是通过对OnDraw()方法进行复写来实现的 举例继承TextView 在textView的背景加上矩形的效果 代码实现 testView的代码 ...
- Socket实现聊天客户端
今天在极客学院上看到了一个关于Socket的视频讲解,感觉还不错,就写了份代码,拿来分享一下. Socket使用方法 关于Socket的使用,我们首先要弄清楚的是,在服务器端还是在客户端使用.因为这的 ...
- Android官方命令深入分析之绘制9-patch
9-patch是一个所见即所得的编辑器,允许你创建可以自动更改大小适应屏幕的bitmap图像.被选中的部分可以水平或垂直的进行缩放. 下面是使用9-patch工具创建一个9-patch图像的实例,首先 ...
- win7 VMware CentOS桥接(bridge)模式网络配置
主要内容参考自: centos下vmware 桥接设置静态ip例子 关于虚拟机网络配置的文章: Win7+VMware Workstation环境下的CentOS-Linux网络连接设置(推荐阅读) ...