猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!

原文地址: http://blog.csdn.net/cocos2der/article/details/48318879

Unity中咱们经常对字体做Create Editable Copy,虽然已经非常方便了,但是实际使用场景中,有时候会有不方便的地方。

  1. 我们经常对同一个字体做不同字体大小的Copy,这个时候,每次都去修改font的属性,非常之蛋疼。
  2. 本地化翻译文件导出的文字需要手工加到字体属性中,如果同一个字体还有不同大小,更蛋疼了。
  3. 以上你都可以忍了,但是你再次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开发之二十二)的更多相关文章

  1. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  2. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

    紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...

  4. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  5. 网站开发进阶(四十二)巧用clear:both

    网站开发进阶(四十二)巧用clear:both 前言 我们在制作网页中用div+css或者称xhtml+css都会遇到一些很诡异的情况,明明布局正确,但是整个画面却混乱起来了,有时候在IE6下看的很正 ...

  6. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

  7. iOS 11开发教程(十二)iOS11应用视图始祖——UIView

    iOS 11开发教程(十二)iOS11应用视图始祖——UIView 在Swift中,NSObject是所有类的根类.同样在UIKit框架(UIKit框架为iOS应用程序提供界面对象和控制器)中,也存在 ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试

    最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...

  9. 为什么DIY报价----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十二)[转]

    前段时间,写了一个开发.实施.服务费用计算三部曲. 水清则无鱼--走出软件作坊:三五个人十来条枪 如何成为开发正规军(八) 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九 ...

随机推荐

  1. [Django]bulk_create 探究

    使用django orm大批量插入的时候我们可以不使用for循环对一个一个的save而是使用 bulk_create来批量插入,可是使用了这个方法还需要在自己添加一个事务吗? 还是django本身对这 ...

  2. maven的UnsupportedClassVersionError

    问题描述 我安装了maven3.3.3,配置好了M2_HOME和path环境变量之后,执行mvn -v报错:java.lang.UnsupportedClassVersionError: -. : U ...

  3. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  4. 携程React Native实践

    React Native(下文简称 RN)开源已经一年多时间,国内各大互联网公司都在使用,携程也在今年 5 月份投入资源开始引入,并推广给多个业务团队使用,本文将会分享我们遇到的一些问题以及我们的优化 ...

  5. 财务模块多组织,GL, SLA, SOB, COA, BSV, CCID, LE 概念的简单介绍

     GL=  General Ledger 指的是Oracle 的总帐系统. application_id = 101. 在uk似乎居然还有不同的解释(In the UK, it was refer ...

  6. Linux内存映射--mmap函数

    Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...

  7. ExtJS学习(二)Ext组件模型

    Ext中所有的组件都继承自Ext.component,这种单根继承的模型保证所有组件都拥有相同的通用方法与生命周期,这样在后续对这些组件进行维护管理时将更加便捷,同时也保证了在进行布局时的便利. 组件 ...

  8. Objc中处理数组越界的一种办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Objc的数组如果在访问时索引非法,则会抛出NSRangeEx ...

  9. Python爬虫! 单爬,批量爬,这都不是事!

    昨天做了一个煎蛋网妹子图的爬虫,个人感觉效果不错.但是每次都得重复的敲辣么多的代码(相比于Java或者其他语言的爬虫实现,Python的代码量可谓是相当的少了),就封装了一下!可以实现对批量网址以及单 ...

  10. Android开发学习之路--UI之自定义布局和控件

    新的一年已经开始了,今天已经是初二了,两天没有学习了,还是要来继续学习下.一般手机的title都是actionbar,就像iphone一样可以后退,可以编辑.这里自定义布局就来实现下这个功能,首先准备 ...