想要批量化替换项目预制体资源中Text组件引用的Font字体文件,可以采用以下步骤。
1、在项目的Editor文件中,新建一个名为FontToolEditor的C#脚本文件,然后把以下代码复制粘贴到新建的FontToolEditor的C#脚本文件中。
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;//替换fontText[] 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();}
}