需求
预制体中的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()才能成功。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Unity脚本一键修改所有预制体
发表评论 取消回复