当前位置:网站首页>unity 将Text批量替换为TextMeshProUGUI
unity 将Text批量替换为TextMeshProUGUI
2022-08-05 05:25:00 【木棉-小健】
```csharp
using System.Collections.Generic;
using System.IO;
using TMPro;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class Text2TextMeshProUtil : EditorWindow
{
Vector2 scrollPos = Vector2.zero;
static List<string> scriptsFolders;
string path;
string Path
{
get
{
return path;
}
set
{
if (value != path)
{
if (directoryPrefabs == null)
{
directoryPrefabs = new List<string>();
}
else
{
directoryPrefabs.Clear();
}
if (AllAssetPaths == null)
{
AllAssetPaths = new List<string>();
}
else
{
AllAssetPaths.Clear();
}
path = value;
}
}
}
static EditorWindow myWindow;
static List<string> directoryPrefabs;
static List<string> AllAssetPaths;
bool showPrefabs = true;
private static TMP_FontAsset tmp_Font = null;
readonly string[] ReplaceMode = { "批量替换", "单个替换" };
int replaceModeIndex;
int ReplaceModeIndex
{
get
{
return replaceModeIndex;
}
set
{
if (value != replaceModeIndex)
{
if (directoryPrefabs == null)
{
directoryPrefabs = new List<string>();
}
else
{
directoryPrefabs.Clear();
}
if (AllAssetPaths == null)
{
AllAssetPaths = new List<string>();
}
else
{
AllAssetPaths.Clear();
}
Path = "";
replaceModeIndex = value;
}
}
}
bool isAutoFixLinkedScripts = true;
[MenuItem("Tools/Text2TextMeshPro")]
static void Init()
{
myWindow = EditorWindow.GetWindow(typeof(Text2TextMeshProUtil));
directoryPrefabs = new List<string>();
AllAssetPaths = new List<string>();
scriptsFolders = new List<string> { "Assets/GameMain/Scripts/UI" };
myWindow.minSize = new Vector2(500, 300);
}
void OnGUI()
{
isAutoFixLinkedScripts = EditorGUILayout.BeginToggleGroup("修改关联脚本", isAutoFixLinkedScripts);
ShowScriptsFolders();
EditorGUILayout.EndToggleGroup();
ReplaceModeIndex = GUILayout.Toolbar(ReplaceModeIndex, ReplaceMode);
if (ReplaceModeIndex == 0)
{
scrollPos = EditorGUILayout.BeginScrollView(scrollPos, new GUILayoutOption[] { GUILayout.Width(myWindow.position.width), GUILayout.Height(myWindow.position.height - scriptsFolders.Count * 20 - 70) });
GetPath(true);
ShowAllPrefabs();
EditorGUILayout.EndScrollView();
EditorGUILayout.BeginHorizontal();
LoadPrefab();
Text2TextMeshPro();
EditorGUILayout.EndHorizontal();
}
else if (ReplaceModeIndex == 1)
{
scrollPos = EditorGUILayout.BeginScrollView(scrollPos, new GUILayoutOption[] { GUILayout.Width(myWindow.position.width), GUILayout.Height(myWindow.position.height - scriptsFolders.Count * 20 - 70) });
GetPath(false);
ShowAllPrefabs();
EditorGUILayout.EndScrollView();
Text2TextMeshPro();
}
}
void GetPath(bool isFolder = true)
{
Event e = Event.current;
EditorGUILayout.BeginHorizontal();
GUILayout.Label("Path:", GUILayout.Width(40));
Path = GUILayout.TextField(Path);
EditorGUILayout.EndHorizontal();
if (Event.current.type == EventType.DragExited || Event.current.type == EventType.DragUpdated)
{
if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
{
DragAndDrop.visualMode = DragAndDropVisualMode.Link;
if (Event.current.type == EventType.DragExited)
{
DragAndDrop.AcceptDrag();
if (!isFolder)
{
if (DragAndDrop.objectReferences != null && DragAndDrop.objectReferences.Length > 0)
{
Object[] objectReferences = DragAndDrop.objectReferences;
for (int i = 0; i < objectReferences.Length; i++)
{
int index = i;
if (AssetDatabase.GetAssetPath(objectReferences[index]).EndsWith(".prefab"))
{
if (!directoryPrefabs.Contains(AssetDatabase.GetAssetPath(objectReferences[index])))
{
directoryPrefabs.Add(AssetDatabase.GetAssetPath(objectReferences[index]));
}
}
}
}
}
else
{
if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)
{
if (File.Exists(DragAndDrop.paths[0]))
{
EditorUtility.DisplayDialog("警告", "批量模式下请拖拽文件夹!", "确定");
return;
}
Path = DragAndDrop.paths[0];
}
}
}
e.Use();
}
else
{
DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
}
}
}
void ShowAllPrefabs()
{
if (directoryPrefabs != null && directoryPrefabs.Count > 0)
{
showPrefabs = EditorGUILayout.Foldout(showPrefabs, "显示预制体");
if (showPrefabs)
{
for (int i = 0; i < directoryPrefabs.Count; i++)
{
int index = i;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.SelectableLabel($"预制体路径:{directoryPrefabs[index]}");
if (GUILayout.Button("查看", GUILayout.Width(60)))
{
EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath<Object>(directoryPrefabs[index]));
Selection.activeGameObject = AssetDatabase.LoadAssetAtPath<Object>(directoryPrefabs[index]) as GameObject;
}
if (GUILayout.Button("删除", GUILayout.Width(60)))
{
directoryPrefabs.RemoveAt(index);
}
EditorGUILayout.EndHorizontal();
}
}
else
{
if (GUILayout.Button("清空选择", GUILayout.Width(60)))
{
directoryPrefabs.Clear();
AllAssetPaths.Clear();
Path = "";
}
}
}
}
void LoadPrefab()
{
if (GUILayout.Button("加载预制体"))
{
if (!string.IsNullOrEmpty(Path))
{
DirectoryInfo direction = new DirectoryInfo(Path);
FileInfo[] files = direction.GetFiles("*.prefab", SearchOption.AllDirectories);
for (int i = 0; i < files.Length; i++)
{
int startindex = files[i].FullName.IndexOf("Assets");
string unityPath = files[i].FullName.Substring(startindex);
if (!directoryPrefabs.Contains(unityPath))
{
directoryPrefabs.Add(unityPath);
}
}
}
}
}
void Text2TextMeshPro()
{
if (directoryPrefabs != null && directoryPrefabs.Count > 0)
{
if (GUILayout.Button("一键替换"))
{
for (int i = 0; i < directoryPrefabs.Count; i++)
{
int index = i;
Text2TextMeshPro(directoryPrefabs[index]);
EditorUtility.DisplayProgressBar("替换进度", "当前进度", index / (float)directoryPrefabs.Count);
}
EditorUtility.ClearProgressBar();
}
}
}
void Text2TextMeshPro(string path)
{
GameObject root = PrefabUtility.LoadPrefabContents(path);
if (root)
{
Text[] list = root.GetComponentsInChildren<Text>(true);
for (int i = 0; i < list.Length; i++)
{
Text text = list[i];
Transform target = text.transform;
Vector2 size = text.rectTransform.sizeDelta;
string strContent = text.text;
Color color = text.color;
int fontSize = text.fontSize;
FontStyle fontStyle = text.fontStyle;
TextAnchor textAnchor = text.alignment;
bool richText = text.supportRichText;
HorizontalWrapMode horizontalWrapMode = text.horizontalOverflow;
VerticalWrapMode verticalWrapMode = text.verticalOverflow;
bool raycastTarget = text.raycastTarget;
GameObject.DestroyImmediate(text);
//这里添加语言扩展组件 TODO
target.gameObject.AddComponent<TextMeshProExtend>();
TextMeshProUGUI textMeshPro = target.gameObject.AddComponent<TextMeshProUGUI>();
if (tmp_Font == null)
{
//这里更换很重要 记得要看
tmp_Font = Resources.Load<TMP_FontAsset>("Alibaba-PuHuiTi-Regular SDF");
}
textMeshPro.rectTransform.sizeDelta = size;
textMeshPro.text = strContent;
textMeshPro.color = color;
textMeshPro.fontSize = fontSize;
textMeshPro.fontStyle = fontStyle == FontStyle.BoldAndItalic ? FontStyles.Bold : (FontStyles)fontStyle;
switch (textAnchor)
{
case TextAnchor.UpperLeft:
textMeshPro.alignment = TextAlignmentOptions.TopLeft;
break;
case TextAnchor.UpperCenter:
textMeshPro.alignment = TextAlignmentOptions.Top;
break;
case TextAnchor.UpperRight:
textMeshPro.alignment = TextAlignmentOptions.TopRight;
break;
case TextAnchor.MiddleLeft:
textMeshPro.alignment = TextAlignmentOptions.MidlineLeft;
break;
case TextAnchor.MiddleCenter:
textMeshPro.alignment = TextAlignmentOptions.Midline;
break;
case TextAnchor.MiddleRight:
textMeshPro.alignment = TextAlignmentOptions.MidlineRight;
break;
case TextAnchor.LowerLeft:
textMeshPro.alignment = TextAlignmentOptions.BottomLeft;
break;
case TextAnchor.LowerCenter:
textMeshPro.alignment = TextAlignmentOptions.Bottom;
break;
case TextAnchor.LowerRight:
textMeshPro.alignment = TextAlignmentOptions.BottomRight;
break;
}
textMeshPro.richText = richText;
if (verticalWrapMode == VerticalWrapMode.Overflow)
{
textMeshPro.enableWordWrapping = true;
textMeshPro.overflowMode = TextOverflowModes.Overflow;
}
else
{
textMeshPro.enableWordWrapping = horizontalWrapMode == HorizontalWrapMode.Overflow ? false : true;
}
textMeshPro.raycastTarget = raycastTarget;
}
}
PrefabUtility.SaveAsPrefabAsset(root, path, out bool success);
if (!success)
{
Debug.LogError($"预制体:{path} 保存失败!");
}
if (isAutoFixLinkedScripts)
{
ChangeScriptsText2TextMeshPro();
}
}
void ShowScriptsFolders()
{
for (int i = 0; i < scriptsFolders.Count; i++)
{
int index = i;
EditorGUILayout.BeginHorizontal();
SelectScriptsFolder(index);
EditorGUILayout.EndHorizontal();
}
}
void SelectScriptsFolder(int index)
{
Event e = Event.current;
EditorGUILayout.BeginHorizontal();
GUILayout.Label($"scriptsFolder{index + 1}:", GUILayout.Width(80));
scriptsFolders[index] = GUILayout.TextField(scriptsFolders[index], GUILayout.Width(200));
if (Event.current.type == EventType.DragExited || Event.current.type == EventType.DragUpdated)
{
if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
{
DragAndDrop.visualMode = DragAndDropVisualMode.Link;
if (Event.current.type == EventType.DragExited)
{
DragAndDrop.AcceptDrag();
if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)
{
if (File.Exists(DragAndDrop.paths[0]))
{
EditorUtility.DisplayDialog("警告", "请选择文件夹!", "确定");
return;
}
scriptsFolders[index] = DragAndDrop.paths[0];
}
}
e.Use();
}
else
{
DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
}
}
if (GUILayout.Button("添加路径"))
{
scriptsFolders.Add(scriptsFolders[scriptsFolders.Count - 1]);
}
if (GUILayout.Button("删除路径"))
{
if (scriptsFolders.Count == 1)
{
EditorUtility.DisplayDialog("警告", "仅剩最后一个文件夹,删除将会出错!", "确定");
return;
}
scriptsFolders.RemoveAt(index);
}
EditorGUILayout.EndHorizontal();
}
void ChangeScriptsText2TextMeshPro()
{
AllAssetPaths.Clear();
Debug.LogError(directoryPrefabs.Count);
if (directoryPrefabs != null && directoryPrefabs.Count > 0)
{
for (int i = 0; i < directoryPrefabs.Count; i++)
{
int index = i;
string scriptsName = System.IO.Path.GetFileNameWithoutExtension(directoryPrefabs[index]);
string[] tmp = AssetDatabase.FindAssets($"{scriptsName} t:Script", scriptsFolders.ToArray());
if (tmp != null && tmp.Length > 0)
{
AllAssetPaths.AddRange(tmp);
}
}
for (int i = 0; i < AllAssetPaths.Count; i++)
{
int index = i;
ChangeScriptsText2TextMeshPro(AssetDatabase.GUIDToAssetPath(AllAssetPaths[index]));
}
}
AssetDatabase.Refresh();
}
void ChangeScriptsText2TextMeshPro(string script)
{
StreamReader sr = new StreamReader(script);
string str = sr.ReadToEnd();
sr.Close();
str = str.Replace("<Text>", "<TMPro.TextMeshProUGUI>");
str = str.Replace(" Text ", " TMPro.TextMeshProUGUI ");
StreamWriter sw = new StreamWriter(script, false, System.Text.Encoding.UTF8);
sw.Write(str);
sw.Close();
}
}
创建一个脚本,复制该代码进去,在unity菜单栏tools里面即可找到使用
边栏推荐
- Come, come, let you understand how Cocos Creator reads and writes JSON files
- ROS2下使用ROS1 bag的方法
- Media query, rem mobile terminal adaptation
- Difference between link and @improt
- 网络排错基础-学习笔记
- Take you in-depth understanding of cookies
- The hook of the operation of the selenium module
- wc, grep, tar, vi/vim
- 教您简单几步实现工业树莓派正确安装RS232转USB驱动
- What should I do if the SSL certificate prompts that it is expired or invalid?
猜你喜欢
ALC experiment
Introduction to Network Layer Protocols
前置++和后置++的区别
docker部署完mysql无法连接
VLAN介绍与实验
Take you in-depth understanding of cookies
What?CDN cache acceleration only works for accelerating static content?
System basics - study notes (some command records)
Successful indie developers deal with failure & imposters
Nacos配置服务的源码解析(全)
随机推荐
Come, come, let you understand how Cocos Creator reads and writes JSON files
摆脱极域软件的限制
产品学习资料
transport layer protocol
wc, grep, tar, vi/vim
Take you in-depth understanding of cookies
Mina disconnects and reconnects
disabledDate 日期选择器 datePicker
Problems encountered in installing Yolo3 target detection module in Autoware
Difference between link and @improt
sql server 重复值在后面计数
DevOps流程demo(实操记录)
带你深入了解Cookie
浏览器兼容汇总
selenium学习
Alibaba Cloud Video on Demand
Will intelligent operation and maintenance replace manual operation and maintenance?
单片机期末复习大题
网络协议基础-学习笔记
初识网页与浏览器