Unity Editor 一键修改预制体字体

Unity摊

早~
当项目到达一定的阶段,难免会遇到一些新需求,而如果有相应的工具,将会减少我们的工作量,今天给大家介绍 “游戏中一键更换Prefabs字体”,以此类推,可以实现很多类似的工具..... 自行脑补!

原理:

其实原理非常简单: 找到我们要替换的目标字体,然后遍历Resources下的所有Prefab,然后在获取单个Prefab中
所有的子组件(Label),修改其字体即可。

其中Unity为我们提供了一个AssetDatabase类,可以用来找到Asset下的同一类型游戏对象的id数组,然后根据 
AssetDatabase.GUIDToAssetPath(id)这个方法可以获取到该对象的路径,最后LoadAssetAtPath即可。。。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;

class FontChangeEditor : EditorWindow
{

    [MenuItem("Tools/一键切换字体XXX To YYY")]

    static void OneKeyChangeFont()
    {

        Font mfont = NGUIEditorTools.LoadAsset<Font>("Assets/Resources/Fonts/YYY.TTF");

        string[] guids = AssetDatabase.FindAssets("t:Prefab", new string[] { "Assets/Resources/UI/Prefab"});
        if (guids!= null && guids.Length > 0)
        {
            EditorUtility.DisplayProgressBar("Replacing...", "Start replace", 0);
            int progress = 0;
            foreach (string  guid in guids)
            {
                progress++;
                string path = AssetDatabase.GUIDToAssetPath(guid);
                EditorUtility.DisplayProgressBar("Replacing....", path, ((float)progress / guids.Length));
                GameObject obj = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
                
                bool isChanged = false;
                UILabel[] lblist = obj.GetComponentsInChildren<UILabel>(true);
                foreach (UILabel item in lblist)
                {

                 
                    if (item.TrueTypeFont.name == "XXX")
                    {
                        Debug.Log(item.TrueTypeFont.name + "===============" + obj.name);
                        item.TrueTypeFont = mfont;
                    }
                }
               if (isChanged)
               {
                   EditorUtility.SetDirty(obj);
               }
                EditorUtility.ClearProgressBar();
                AssetDatabase.SaveAssets();

            }
        }
    }
 }


注意:

预设体被修改后,一定要记得SetDirty(obj),这个函数是为了告诉Unity该对象所属于的Prefab已经发生了改变,
最后 AssetDatabase.SaveAssets()保存prefab。

代码非常简单,希望对大家有所帮助。
如有疑问,可以留言~ 一起学习。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,296评论 3 119
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,806评论 25 708
  • ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。1、基本用法 如果解构不成功,变量的...
    立的flag一直在倒阅读 851评论 0 0
  • 一. 九月二十四日,夜,窗外望见的星河亮的耀眼。 二. 他喜欢她。 就是人们口中那种无可救药的喜欢。喜欢她一年四季...
    小儒撒阿阅读 306评论 0 0
  • 当你的才华还撑不起你的野心的时候,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来,历练;梦想...
    森深见鹿阅读 570评论 0 0

友情链接更多精彩内容