Unity脚本一键修改所有预制体

embedded/2024/11/14 22:28:12/

需求

预制体中的Text组件默认是使用Unity的内置字体Arial。

但是在Unity2022之后,Text组件就被弃用了,内置字体Arial也移除了。

如果项目从2022之前的版本升到2022,那么Text组件的字体文件会自动改为LegacyRuntime.ttf文件。

其中LegacyRuntime.ttf文件是没有中文的。

所以我们需要将所有预制体的Text组件一键替换为我们存放在Assets目录下的字体

代码

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;public class FontUpdater : EditorWindow
{private Font font;[MenuItem("工具/Update Font")]public static void ShowWindow(){GetWindow<FontUpdater>("Font Updater");}private void OnGUI(){GUILayout.Label("Update All Fonts");if (GUILayout.Button("Update Fonts")){FindTextComponentsInAllPrefabs();}}private void FindTextComponentsInAllPrefabs(){font = AssetDatabase.LoadAssetAtPath<Font>("Assets/ArtFont/simsun.ttc");Debug.Log("FontName:" + font.name);// 查找所有预制体string[] prefabGUIDs = AssetDatabase.FindAssets("t:Prefab", new[] { "Assets" });List<string> prefabsWithText = new List<string>();foreach (string prefabGUID in prefabGUIDs){string prefabPath = AssetDatabase.GUIDToAssetPath(prefabGUID);GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);if (prefab != null){// 在预制体中查找 Text 组件Text[] texts = prefab.GetComponentsInChildren<Text>(true);if (texts.Length > 0){prefabsWithText.Add(prefabPath);Debug.Log($"Prefab: {prefabPath} contains {texts.Length} Text components:");foreach (Text text in texts){Debug.Log($"  - {text.gameObject.name}");text.font = font;}EditorUtility.SetDirty(prefab);}}}AssetDatabase.SaveAssets();if (prefabsWithText.Count == 0){Debug.Log("No Text components found in any prefabs.");}}
}

其中要注意:

"Assets/ArtFont/msyh.ttc"这个路径是随意存放的。

EditorUtiliy.SetDirty(prefab)。

需要将prefab对象修改为脏对象,AssetDatabase.SaveAssets()才能成功。


http://www.ppmy.cn/embedded/96608.html

相关文章

关于鸿蒙开发中装饰器@Extend、@Styles、@Builder的介绍

总结 名称适合是否可以参数Extend抽取 特定组件 样式、事件√Styles抽取 公共 样式、事件Builder抽取 结构、样式、事件√ Extend 语法&#xff1a; Extend(要扩展的组件&#xff0c;例如Text、Column、Row等) function functionName { ... } 使用规则&#xff1a; 1、Ex…

使用API有效率地管理Dynadot域名,对拍卖的域名进行出价

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

【C++】什么是模板?

有不懂的地方可以翻阅我之前文章&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;CSDN_C入门 目录 模板函数 泛型编程 函数模板 类模板 模板函数 泛型编程 在之前的学习里&#xff0c;我们知道函数可以重载&#xff0c;当我们在实现多参数函数交…

MySQL 简介

一、MySQL 概述 1.1 什么是 MySQL&#xff1f; MySQL 是全球最受欢迎的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;之一&#xff0c;由瑞典的 MySQL AB 公司开发&#xff0c;后被 Sun Microsystems 收购&#xff0c;最终于 2010 年被 Oracle 公司收购。MySQL 使用…

微信小程序--24(列表渲染)

一、wx&#xff1a;for 1.作用 根据指定数组&#xff0c;循环渲染重复的组件结构 2.语法 <view wx:for"{{data中的数据}}"> 索引是&#xff1a;{{index}}, item项是&#xff1a;{{item}}</view> index:表索引item&#xff1a;表当前循环项 …

C++ | Leetcode C++题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> countBits(int n) {vector<int> bits(n 1);for (int i 1; i < n; i) {bits[i] bits[i & (i - 1)] 1;}return bits;} };

政务大数据解决方案(九)

政务大数据解决方案旨在通过构建高效的数据处理与分析系统&#xff0c;全面整合政府各部门数据资源&#xff0c;运用尖端技术进行深入挖掘与智能分析&#xff0c;为政府决策提供科学、精准的数据支撑&#xff0c;优化政策制定与执行流程&#xff0c;同时通过加强数据安全与隐私…

【项目实战】C++视频共享点播系统

目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git&#xff08;如果你的系统尚未安装Git&#xf…