目录
1.背景介绍
工作中常见的是,字体资源暂未确定的情况下,先要进行UI的排版布局。待到后续字体资源确定后,再进行统一的更换。
但是单纯替换字体的方式异常繁琐,又容易遗漏,故而通过此脚本,创造一个EditorGUI,以进行一键更换字体
2.具体代码
using System.Collections.Generic;
using System.IO;
using TMPro;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 该脚本允许一键更换所有TMP_Text与TMP_InputField的字体
/// 包括场景及预制体
/// </summary>
public class ChangeFontWindow : EditorWindow
{
/*
* MenuItem属性在编辑器上方创建了一个选项类
* 默认的类有File, Edit, Assets, GameObject, Component, Window, Help七类
*/
[MenuItem("Tools/TMP_Text Fonts Change")]
public static void Open()
{
/*
* GetWindow方法则直接打开了一个小窗口
* 并调用其中的OnGUI方法
*/
GetWindow(typeof(ChangeFontWindow));
}
private TMP_FontAsset fontToChange;//这个作局部变量使用,用于保护静态变量被随意修改
private static TMP_FontAsset m_fontToChange;
private void OnGUI()
{
/*
* EditorGUILayout.ObjectField生成了一个选项栏,允许给予特定的类型或资产
* 其返回类型为Object,需要自己进行类型转换
*/
fontToChange =
EditorGUILayout.ObjectField(fontToChange, typeof(TMP_FontAsset), true, GUILayout.MinWidth(100f))
as TMP_FontAsset;
m_fontToChange = fontToChange;
/*
* GUILayout.Button方法绘制了一个按钮,按钮上的字符串便是参数中的值
* 如果按下了按钮,则该值返回true,并随之调用设定好的函数
*/
if (GUILayout.Button("Change Fonts In Canvas"))
{
ChangeInCanvas();
}
if (GUILayout.Button("Change Fonts In Prefabs"))
{
ChangeInPrefabs();
}
}
#region 修改场景中的字体
private static void ChangeInCanvas()
{
TMP_Text[] tmpTexts = Resources.FindObjectsOfTypeAll<TMP_Text>();
TMP_InputField[] tmpInputs = Resources.FindObjectsOfTypeAll<TMP_InputField>();
foreach (TMP_Text text in tmpTexts)
{
/*
* Undo.RecordObject用于记录场景中的物体的修改
* EditorUtility.SetDirty用于记录预制体中的修改
* 拓展内容见后续
*/
Undo.RecordObject(text, text.gameObject.name);
text.font = m_fontToChange;
EditorUtility.SetDirty(text);
}
/*
* 注意到,TMP_InputField下的TMP_Text是无法单纯更改其字体实现的
* 需要修改TMP_InputField的参数才可以
*/
foreach (TMP_InputField input in tmpInputs)
{
//同上
Undo.RecordObject(input, input.gameObject.name);
input.fontAsset = m_fontToChange;
EditorUtility.SetDirty(input);
}
Debug.Log(&