
Unity自动替换字体脚本

FontHelper的监视面板如下图。
选择好字体后,点击预制体一键修改就可以修改所有的Prefab了。点击修改所有scene就是将挂到BuildSetting的scene中的字体全部修改。
发布日期:2021-05-07 00:14:30
浏览次数:39
分类:精选文章
本文共 3898 字,大约阅读时间需要 12 分钟。
前言
项目需要替换字体是件非常麻烦的事,需要一个个找Text组件。闲来无事写了个自动替换字体的脚本。也算用作抛砖引玉,利用此脚本的逻辑制作类似的功能,大大节约人力。
用法
将脚本放到Editor目录下,在Project项目面板下右键,选择Create->FontHelper即可创建出FontHelper。



代码
注意,引用的unity.linq是在assetstore下载的叫做LINQ to GameObject的免费插件。
using UnityEngine;using UnityEditor;using System.Linq;using UnityEngine.UI;using Unity.Linq;using UnityEditor.SceneManagement;[CreateAssetMenu(fileName = "FontHelper", menuName = "FontHelper")]public class MyFontHelper : ScriptableObject{ [Space(10)] public Font font; [Space(10)] public bool isDebug; [Space(10)] bool isNeedSave; [CustomEditor(typeof(MyFontHelper))] public class MyHelper : Editor { public override void OnInspectorGUI() { var myHelper = target as MyFontHelper; base.OnInspectorGUI(); EditorGUILayout.Space(); if (GUILayout.Button("查看所有预制体使用到的字体")) { string[] guids = AssetDatabase.FindAssets(string.Format("t:{0}", "GameObject")); for (int i = 0; i < guids.Length; i++) { //转化路径 string assetPath = AssetDatabase.GUIDToAssetPath(guids[i]); //加载对象 GameObject root = AssetDatabase.LoadAssetAtPath(assetPath); foreach (var go in root.DescendantsAndSelf() .Where(n => n.GetComponent ())) { if (myHelper.isDebug) { Debug.Log(" Font:" + go.GetComponent ().font.name + " Path:" + assetPath + " Name:" + root + "/" + go.name); } else { Debug.Log(go.GetComponent ().font.name); } } } } EditorGUILayout.Space(); if (GUILayout.Button("预制体一键修改")) { int temp = 0; //修改总数量 //找到所有Project下GameObject,Prefab就是GameObject string[] guids = AssetDatabase.FindAssets(string.Format("t:{0}", "GameObject")); //对每个路径下的GameObject进行操作 for (int i = 0; i < guids.Length; i++) { //转化路径 string assetPath = AssetDatabase.GUIDToAssetPath(guids[i]); //加载对象 GameObject root = AssetDatabase.LoadAssetAtPath (assetPath); foreach (var go in root.DescendantsAndSelf() .Where(n => n.GetComponent ())) { ++temp; if (myHelper.isDebug) Debug.Log(root.name + "下的" + go.name + "物体上的组件已被修改。"); go.GetComponent ().font = myHelper.font; myHelper.isNeedSave = true; EditorUtility.SetDirty(go); } Debug.Log(string.Format("预制体修改完成!共修改{0}个Text组件。", temp.ToString())); if (myHelper.isNeedSave) { PrefabUtility.SavePrefabAsset(root); SaveAndRefresh(); myHelper.isNeedSave = false; } } } EditorGUILayout.Space(); if (GUILayout.Button("修改BuildSetting中的所有scene")) { // 遍历build setting中的场景 foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes) { //在built setting中被勾选 if (S.enabled) { //得到场景的名称 string name = S.path; //打开这个场景 UnityEditor.SceneManagement.EditorSceneManager.OpenScene(name); // 遍历场景中的GameObject // 注意FindObjectsOfTypeAll虽然会找到所有对象,但是也会找到场景中没有的东西,而且会出现重复查找的情况,最好是进行筛选一下 foreach (Text obj in Resources.FindObjectsOfTypeAll(typeof(Text))) { if (myHelper.isDebug) Debug.Log("scene name:" + name + " object name:" + obj.name); obj.font = myHelper.font; EditorUtility.SetDirty(obj); } EditorSceneManager.SaveOpenScenes(); SaveAndRefresh(); } }; } EditorGUILayout.Space(); if (GUILayout.Button("修改选中目标及其子物体")) { var os = Selection.objects; foreach (var item in os) { GameObject go = item as GameObject; foreach (var g in go.DescendantsAndSelf().Where(_ => _.GetComponent ())) { if (myHelper.isDebug) Debug.Log(g.name + "物体上的组件已被修改。"); g.GetComponent ().font = myHelper.font; EditorUtility.SetDirty(g); } } SaveAndRefresh(); EditorSceneManager.SaveOpenScenes(); } void SaveAndRefresh() { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } }}
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月25日 01时45分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
创建自己的Docker基础镜像
2021-05-09
Python 简明教程 --- 20,Python 类中的属性与方法
2021-05-09
KNN 算法-理论篇-如何给电影进行分类
2021-05-09
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
2021-05-09
CODING 敏捷实战系列课第三讲:可视化业务分析
2021-05-09
工作动态尽在掌握 - 使用 CODING 度量团队效能
2021-05-09
CODING DevOps 深度解析系列第二课报名倒计时!
2021-05-09
数据结构第八节(图(下))
2021-05-09
基于Mustache实现sql拼接
2021-05-09
POJ 2260 Error Correction 模拟 贪心 简单题
2021-05-09
gRPC在 ASP.NET Core 中应用学习(一)
2021-05-09
@SuppressWarnings 用法
2021-05-09
看完你就明白的锁系列之锁的状态
2021-05-09
看完这篇操作系统,和面试官扯皮就没问题了
2021-05-09
我的价值观
2021-05-09
一文详解 Java 并发模型
2021-05-09
值类型与引用类型(中)
2021-05-09
MSSQL 2005 数据库变成可疑状态
2021-05-09
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
2021-05-09
秋色园引发CPU百分百命案的事件分析与总结
2021-05-09