源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

152 lines
5.1 KiB

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 替换预设中Text文字工具
/// </summary>
public class PrefabTextReplaceTools : EditorWindow
{
private static PrefabTextReplaceTools instance;
static string _targetTxt; //被替换的文字内容
static string _replaceTxt = ""; //要替换的文字内容
static string _pathRoot; //查找文件路径
static int _rate = 100;
static int _ratePrefab = 10;
static int _successCount = 0;
private static void Init()
{
instance = EditorWindow.GetWindow<PrefabTextReplaceTools>("替换预设文字内容");
_pathRoot = Application.dataPath + "/LuaFramework/AssetBundleRes/ui";
instance.position = new Rect(new Vector2(604, 290), new Vector2(650, 400));
}
[MenuItem("Tools/替换预设Text组件text属性内容")]
static void ShowExcelTools()
{
Init();
instance.Show();
}
void OnGUI()
{
DrawOptions();
}
private void DrawOptions()
{
_targetTxt = EditorGUILayout.TextField("被替换文字内容", _targetTxt);
_replaceTxt = EditorGUILayout.TextField("要替换文字内容", _replaceTxt);
EditorGUILayout.Space();
_pathRoot = EditorGUILayout.TextField("查找目录", _pathRoot);
EditorGUILayout.Space();
if (GUILayout.Button("转换"))
{
EditorCoroutineRunner.StartEditorCoroutine(Conver());
}
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
_rate = EditorGUILayout.IntField("每帧处理 文件 数", _rate);
_ratePrefab = EditorGUILayout.IntField("每帧处理 预设 数", _ratePrefab);
EditorGUILayout.HelpBox("每帧处理文件数,如果处理过程太卡,可以减少,当然也可以增加。\n目的是为了不让进程出现(未响应)", MessageType.Info);
}
IEnumerator Conver()
{
_successCount = 0;
var files = Directory.GetFiles(_pathRoot, "*prefab*", SearchOption.AllDirectories);
List<string> prefabsPath = new List<string>();
//找到所有预设
float count = 0;
foreach (var file in files)
{
count++;
if (file.EndsWith(".prefab"))
{
var clearPaht = file.Replace(Application.dataPath, "Assets");
prefabsPath.Add(clearPaht);
if (count % _rate == 0)
{
yield return 1;
}
EditorUtility.DisplayProgressBar("查找文件中的预设···", "查找中 " + file, count / files.Length);
}
}
count = 0;
foreach (var singlePaht in prefabsPath)
{
count++;
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(singlePaht);
if (prefab)
{
//boo = false;
CheckSingPrefab(prefab);
//if (boo)
//{
// Debug.Log(prefab.name);
//}
}
if (count % _ratePrefab == 0)
{
yield return 1;
}
EditorUtility.DisplayProgressBar("替换当前预设中Text内容", "当前 " + singlePaht, count / prefabsPath.Count);
}
yield return 1;
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.ClearProgressBar();
EditorUtility.DisplayDialog("提示", "查找完成,一共替换 " + _successCount + " 处", "好的呢", "");
}
//private bool boo = false;
/// <summary>
/// 循环遍历对象的每一个子对象,执行检查操作
/// </summary>
/// <param name="go"></param>
void CheckSingPrefab(GameObject go)
{
CheckSingGameObject(go);
foreach (Transform child in go.transform)
{
if (child.childCount > 0)
{
CheckSingPrefab(child.gameObject);
}
CheckSingGameObject(child.gameObject);
}
}
/// <summary>
/// 检查当前对象上是否有Text组件,如果有检查文字内容是否包含指定的内容,如果有就替换成要被替换的文字内容
/// </summary>
/// <param name="go"></param>
void CheckSingGameObject(GameObject go)
{
var Txt = go.GetComponent<Text>();
if (Txt)
{
string curStr = Txt.text;
curStr = curStr.ToLower();
if (curStr.Contains(_targetTxt))
{
string new_Str = curStr.Replace(_targetTxt, _replaceTxt);
_successCount++;
//boo = true;
Txt.text = new_Str;
EditorUtility.SetDirty(Txt); //必须要先一下这个 才能保存到磁盘 当资源已改变并需要保存到磁盘,Unity内部使用dirty标识来查找
}
}
}
}