之前写过一个 一键替换场景、Prefab字体的工具,用于批量修改Font字体,不过只能一键修改全部字体,使用不方便,现在根据刚写过的 多方式批量修改Tag值 工具类,对Font重新写了一个操作窗口,用起来就方便多了,可以根据需求继续扩展~~
//#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
namespace SimpleFrame.Tool
{
//关于Font的所有属性,均可再次获取并修改,目前只有font、fontSize、fontStyle属性,可根据实际需求再添加
public class ChangeFontByObjWindow : EditorWindow
{
[MenuItem("MyTools/Font/Change Font By GameObj")]
public static void ShowWindow()
{
//弹出窗口
EditorWindow.GetWindow(typeof(ChangeFontByObjWindow), false, "Change Font Window");
}
string showNotify;
//目标字体、类型
Font targetFont;
int targetFontSize;
FontStyle targetFontStyle;
List selectObjs = new List();
GameObject newAddObj;
void OnEnable()
{
GameObject[] tmpSelections = Selection.gameObjects;
selectObjs.Clear();
selectObjs.AddRange(tmpSelections);
targetFontSize = -1;
newAddObj = null;
showNotify = "";
}
void OnGUI()
{
GUILayout.Space(10);
GUILayout.Label("Change Font By GameObj");
GUILayout.Label("U Can Select GameObjects By Mouse In Hierachy And Project Then Open This Window");
//选择目标字体
GUILayout.Space(10);
GUILayout.Label("Target Font");
targetFont = (Font)EditorGUILayout.ObjectField(targetFont, typeof(Font), true);
//选择目标字号
GUILayout.Label("Target Font Size (if value < 0, will not change font size)");
targetFontSize = EditorGUILayout.IntField(targetFontSize);
//选择目标字体类型
GUILayout.Label("Target FontStyle");
targetFontStyle = (FontStyle)EditorGUILayout.EnumPopup(targetFontStyle);
//已选中GameObject列表
GUILayout.Space(10);
GUILayout.Label("Selection");
if (selectObjs != null && selectObjs.Count > 0)
{
for (int i = 0; i < selectObjs.Count; i++)
{
selectObjs[i] = EditorGUILayout.ObjectField(selectObjs[i], typeof(GameObject), true) as GameObject;
}
}
else
GUILayout.Label("None");
//新添加到GameObject列表
GUILayout.Space(10);
GUILayout.Label("Add To Selection");
newAddObj = EditorGUILayout.ObjectField(newAddObj, typeof(GameObject), true) as GameObject;
if (newAddObj != null && !selectObjs.Contains(newAddObj))
{
if (GUILayout.Button("Add Obj"))
{
for (int i = 0; i < selectObjs.Count; i++)
{
if (selectObjs[i] == null)
{
selectObjs[i] = newAddObj;
showNotify = "Add Obj To Select List";
return;
}
}
selectObjs.Add(newAddObj);
showNotify = "Add Obj To Select List";
}
}
GUILayout.Space(10);
if (GUILayout.Button("Change Selection Font"))
{
ChangeFont(selectObjs, targetFont, targetFontSize, targetFontStyle);
}
GUILayout.Space(10);
if (GUILayout.Button("Change All Scene Font"))
{
ChangeFont(GetAllSceneTexts(), targetFont, targetFontSize, targetFontStyle);
}
if (GUILayout.Button("Change All Prefab Font"))
{
ChangeFont(GetAllPrefabTexts(), targetFont, targetFontSize, targetFontStyle);
}
GUILayout.Space(10);
//关闭弹窗
if (GUILayout.Button("Close"))
{
this.Close();
}
GUILayout.Space(10);
EditorGUILayout.TextArea(showNotify, GUILayout.ExpandHeight(true));
this.Repaint();
}
void OnDisable()
{
selectObjs = null;
newAddObj = null;
showNotify = "";
}
void OnLostFocus()
{
}
void ChangeFont(List objs, Font font, int fontSize, FontStyle fontStyle)
{
if (font == null)
{
showNotify = "Target Font Is Null";
return;
}
string tmpNotify = "";
for (int i = 0; i < objs.Count; i++)
{
if (objs[i] == null)
continue;
Text tmpText = objs[i].GetComponent();
if (tmpText != null)
{
tmpText.font = font;
tmpText.fontStyle = fontStyle;
if (fontSize >= 0)
tmpText.fontSize = fontSize;
}
else
tmpNotify += "\n Not Text Component : " + objs[i].name;
}
showNotify = tmpNotify + "\n Change Fond Finish";
}
List GetAllSceneTexts()
{
List allSceneTexts = new List();
//获取场景所有Text组件Obj
GameObject[] allSceneObjs = Object.FindObjectsOfType();
if (allSceneObjs != null && allSceneObjs.Length > 0)
{
for (int i = 0; i < allSceneObjs.Length; i++)
{
Text tmpText = allSceneObjs[i].GetComponent();
if (tmpText != null)
allSceneTexts.Add(allSceneObjs[i]);
}
}
return allSceneTexts;
}
List GetAllPrefabTexts()
{
List allPrefabTexts = new List();
//获取Project所有Text组件Obj
//获取Asset文件夹下所有Prefab的GUID
string[] ids = AssetDatabase.FindAssets("t:Prefab");
string tmpPath;
for (int i = 0; i < ids.Length; i++)
{
//根据GUID获取路径
tmpPath = AssetDatabase.GUIDToAssetPath(ids[i]);
if (!string.IsNullOrEmpty(tmpPath))
{
//根据路径获取Prefab(GameObject)
GameObject tmpObj = AssetDatabase.LoadAssetAtPath(tmpPath, typeof(GameObject)) as GameObject;
if (tmpObj != null)
{
Text tmpText = tmpObj.GetComponent();
if (tmpText != null)
allPrefabTexts.Add(tmpObj);
}
}
}
return allPrefabTexts;
}
}
// ---------
public class ChangeFontByFontWindow : EditorWindow
{
[MenuItem("MyTools/Font/Change Font By Font")]
public static void ShowWindow()
{
//弹出窗口
EditorWindow.GetWindow(typeof(ChangeFontByFontWindow), false, "Change Font Window");
}
string showNotify;
//目标字体、类型
Font targetFont;
int targetFontSize;
FontStyle targetFontStyle;
Font searchFont;
Dictionary allSceneTexts = new Dictionary();
Dictionary allPrefabTexts = new Dictionary();
List searchTexts = new List();
void OnEnable()
{
GetAllSceneTexts();
GetAllPrefabTexts();
targetFontSize = -1;
showNotify = "";
}
void OnGUI()
{
GUILayout.Space(10);
GUILayout.Label("Change Font By Font");
//选择查找字体
GUILayout.Space(10);
GUILayout.Label("Search Font");
searchFont = (Font)EditorGUILayout.ObjectField(searchFont, typeof(Font), true);
//查找字体
if (GUILayout.Button("Search"))
{
searchTexts.Clear();
foreach (var item in allSceneTexts)
{
if (item.Value.font == searchFont)
searchTexts.Add(item.Key);
}
foreach (var item in allPrefabTexts)
{
if (item.Value.font == searchFont)
searchTexts.Add(item.Key);
}
}
if (searchTexts.Count > 0)
{
for (int i = 0; i < searchTexts.Count; i++)
{
searchTexts[i] = EditorGUILayout.ObjectField(searchTexts[i], typeof(GameObject), true) as GameObject;
}
}
else
GUILayout.Label("None");
//选择目标字体
GUILayout.Space(10);
GUILayout.Label("Target Font");
targetFont = (Font)EditorGUILayout.ObjectField(targetFont, typeof(Font), true);
//选择目标字号
GUILayout.Label("Target Font Size (if value < 0, will not change font size)");
targetFontSize = EditorGUILayout.IntField(targetFontSize);
//选择目标字体类型
GUILayout.Label("Target FontStyle");
targetFontStyle = (FontStyle)EditorGUILayout.EnumPopup(targetFontStyle);
GUILayout.Space(10);
if (GUILayout.Button("Change Selection Font"))
{
ChangeFont(searchTexts, targetFont, targetFontSize, targetFontStyle);
}
GUILayout.Space(10);
if (GUILayout.Button("Change All Scene Font"))
{
ChangeFont(allSceneTexts, targetFont, targetFontSize, targetFontStyle);
}
if (GUILayout.Button("Change All Prefab Font"))
{
ChangeFont(allPrefabTexts, targetFont, targetFontSize, targetFontStyle);
}
GUILayout.Space(10);
//关闭弹窗
if (GUILayout.Button("Close"))
{
this.Close();
}
GUILayout.Space(10);
EditorGUILayout.TextArea(showNotify, GUILayout.ExpandHeight(true));
this.Repaint();
}
void OnDisable()
{
allSceneTexts.Clear();
allPrefabTexts.Clear();
searchTexts.Clear();
showNotify = "";
}
void GetAllSceneTexts()
{
allSceneTexts.Clear();
//获取场景所有Text组件
GameObject[] allSceneObjs = Object.FindObjectsOfType();
if (allSceneObjs != null && allSceneObjs.Length > 0)
{
for (int i = 0; i < allSceneObjs.Length; i++)
{
Text tmpText = allSceneObjs[i].GetComponent();
if (tmpText != null)
allSceneTexts.Add(allSceneObjs[i], tmpText);
}
}
}
void GetAllPrefabTexts()
{
allPrefabTexts.Clear();
//获取Project所有Text组件
//获取Asset文件夹下所有Prefab的GUID
string[] ids = AssetDatabase.FindAssets("t:Prefab");
string tmpPath;
for (int i = 0; i < ids.Length; i++)
{
//根据GUID获取路径
tmpPath = AssetDatabase.GUIDToAssetPath(ids[i]);
if (!string.IsNullOrEmpty(tmpPath))
{
//根据路径获取Prefab(GameObject)
GameObject tmpObj = AssetDatabase.LoadAssetAtPath(tmpPath, typeof(GameObject)) as GameObject;
if (tmpObj != null)
{
Text tmpText = tmpObj.GetComponent();
if (tmpText != null)
allPrefabTexts.Add(tmpObj, tmpText);
}
}
}
}
void ChangeFont(List objs, Font font, int fontSize, FontStyle fontStyle)
{
if (font == null)
{
showNotify = "Target Font Is Null";
return;
}
string tmpNotify = "";
for (int i = 0; i < objs.Count; i++)
{
if (objs[i] == null)
continue;
Text tmpText = objs[i].GetComponent();
if (tmpText != null)
{
tmpText.font = font;
tmpText.fontStyle = fontStyle;
if (fontSize >= 0)
tmpText.fontSize = fontSize;
}
else
tmpNotify += "\n Not Text Component : " + objs[i].name;
}
showNotify = tmpNotify + "\n Change Fond Finish";
}
void ChangeFont(Dictionary objs, Font font, int fontSize, FontStyle fontStyle)
{
if (font == null)
{
showNotify = "Target Font Is Null";
return;
}
string tmpNotify = "";
foreach (var item in objs.Values)
{
if (item == null)
continue;
Text tmpText = item.GetComponent();
if (tmpText != null)
{
tmpText.font = font;
tmpText.fontStyle = fontStyle;
if (fontSize >= 0)
tmpText.fontSize = fontSize;
}
else
tmpNotify += "\n Not Text Component : " + item.name;
}
showNotify = tmpNotify + "\n Change Fond Finish";
}
}
}
//#endif
重点不在于实现了具体什么功能,而是实现功能的方法,这样才可以将其应用到实际项目的需求中~~~