Unity编辑器扩展之Text组件中字体替换工具

想要批量化替换项目预制体资源中Text组件引用的Font字体文件,可以采用以下步骤。

1、在项目的Editor文件中,新建一个名为FontToolEditor的C#脚本文件,然后把以下代码复制粘贴到新建的FontToolEditor的C#脚本文件中。

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.Globalization;

public class FontToolEditor : EditorWindow
{
    private const string MENU_MAIN_WINDOW = "Tools/Font替换";

    private List<Font> fontList = new List<Font>() { null };
    public Font toChange;
    static Font toChangeFont;
    public string path = "Assets/";
    static string path1;
    public int num = 0;
    [MenuItem(MENU_MAIN_WINDOW)]
    public static void Open()
    {
        EditorWindow.GetWindow(typeof(FontToolEditor), true);
    }

    void OnGUI()
    {
        GUILayout.Space(5);
        GUILayout.Label("选择老字体", GUILayout.Width(100f));
        num = EditorGUILayout.IntField("字体个数", num);
        AddMonsScriptList();

        GUILayout.Space(20);

        toChange = (Font)EditorGUILayout.ObjectField("选择更换新字体", toChange, typeof(Font), true, GUILayout.MinWidth(100));
        toChangeFont = toChange;

        GUILayout.Space(20);

        GUILayout.Label("路径", GUILayout.Width(50f));

        GUILayout.BeginHorizontal();
        {
            if (GUILayout.Button("浏览"))
            {
                path = EditorUtility.OpenFolderPanel("窗口标题", Application.streamingAssetsPath, "");
                int index = path.IndexOf("Assets");
                path = path.Substring(index, path.Length - index) + "/";
            }
        }

        GUILayout.EndHorizontal();

        path1 = path;
        GUILayout.TextField(path);
        if (GUILayout.Button("确认更换"))
        {
            Init();
        }
    }
    private void AddMonsScriptList()
    {
        int scriptListCount = fontList.Count - 1;
        for (int i = 0; i < num; i++)
        {
            if (scriptListCount < i)
            {
                //给脚本添加一个空值,为了界面好看,也为了下面缓存脚本
                fontList.Add(null);
            }
            fontList[i] = (Font)EditorGUILayout.ObjectField(fontList[i], typeof(Font), true);
        }
    }

    private void Init()
    {
        List<GameObject> prefabs = new List<GameObject>();
        var resourcesPath = path1;
        var absolutePaths = System.IO.Directory.GetFiles(resourcesPath, "*.prefab", System.IO.SearchOption.AllDirectories);

        for (int i = 0; i < absolutePaths.Length; i++)
        {
            EditorUtility.DisplayProgressBar("字体转换中...", "字体转换中...", (float)i / absolutePaths.Length);
            string path = absolutePaths[i].Replace("\\", "/");
            GameObject prefab = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;

            //替换font
            Text[] labels = prefab.GetComponentsInChildren<Text>(true);
            for (int q = 0; q < labels.Length; q++)
            {
                if (labels[q].font)
                {
                    for (int w = 0; w < fontList.Count; w++)
                    {
                        if (fontList[w].name == labels[q].font.name)
                        {
                            int fontSize = labels[q].fontSize;
                            var fonStyle = labels[q].fontStyle;
                            labels[q].font = toChangeFont;
                            labels[q].fontSize = fontSize;
                            labels[q].fontStyle = fonStyle;
                            EditorUtility.SetDirty(labels[q]);
                        }
                    }

                }
            }
        }
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
        EditorUtility.ClearProgressBar();
    }
}

2、保存FontToolEditor脚本文件中代码,回到Unity中,点击Unity主界面左上角中Tools然后再点击Font替换选项。

3、选择好老字体,也就是需要被替换掉的字体,再然后需要选择好需要更换的新字体,再然后选择替换路径(也就是这个选择路径下的预支体才会进行字体替换),最后点击确认更换就可以。

相关推荐
南半球与北海道#1 小时前
前端打印(三联纸票据打印)
前端·vue.js·打印
董世昌411 小时前
深入浅出 JavaScript 常用事件:从原理到实战的全维度解析
前端
山峰哥1 小时前
数据库工程核心:SQL调优让查询效率飙升的实战密码
网络·汇编·数据库·sql·编辑器
满栀5851 小时前
分页插件制作
开发语言·前端·javascript·jquery
qq_406176142 小时前
深入剖析JavaScript原型与原型链:从底层机制到实战应用
开发语言·前端·javascript·原型模式
开开心心_Every2 小时前
免费窗口置顶小工具:支持多窗口置顶操作
服务器·前端·学习·macos·edge·powerpoint·phpstorm
闲蛋小超人笑嘻嘻3 小时前
Vue 插槽:从基础到进阶
前端·javascript·vue.js
梦6503 小时前
Vue2 与 Vue3 对比 + 核心差异
前端·vue.js
tiandyoin3 小时前
给 MHTML 添加滚动条.mhtml
前端·chrome·html·mhtml
好好学习啊天天向上3 小时前
VSCODE, mermaid subgraph 示例
ide·vscode·编辑器