|
|
- using UnityEngine;
- using UnityEditor;
- using UnityEngine.UI;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- using System.IO;
- using System.Text.RegularExpressions;
- public class AddOutLineTool : EditorWindow
- {
- private static AddOutLineTool instance;
-
- static int _rate = 100;
- static string _targetUid;
- static string _pathRoot;
- static Color _outLineColor = Color.white;
- static Vector2 _outLineDistance = new Vector2(1,1);
- static GameObject go;
- static Sprite _sourceSprite;
- static int _ratePrefab = 10;
- static int _successCount = 0;
- [MenuItem("Tools/为使用指定纹理的按钮文字添加OutLine")]
- static void ShowExcelTools()
- {
- Init();
- instance.Show();
- }
-
-
- void OnGUI()
- {
- DrawOptions();
- }
-
- private void DrawOptions()
- {
- var cur_guid = EditorGUILayout.TextField("GUID", _targetUid);
- var cru_sp = EditorGUILayout.ObjectField("目标纹理", _sourceSprite, typeof(Sprite),false) as Sprite;
-
- var tempSouce = AssetDatabase.LoadAssetAtPath<Sprite>(AssetDatabase.GUIDToAssetPath(cur_guid));
- var tempGuid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(cru_sp));
-
- if (tempSouce != null && cur_guid != _targetUid)
- {
- _sourceSprite = tempSouce;
- _targetUid = cur_guid;
- }
- else if (!string.IsNullOrEmpty(tempGuid))
- {
- _targetUid = tempGuid;
- _sourceSprite = cru_sp;
- }
-
-
- EditorGUILayout.HelpBox("填写 GUID 或者 拖入纹理自动查找GUID 计算以 GUID 为准", MessageType.Info);
- EditorGUILayout.Space();
- _pathRoot = EditorGUILayout.TextField("查找目录", _pathRoot);
- EditorGUILayout.Space();
- _outLineColor = EditorGUILayout.ColorField("描边颜色", _outLineColor);
- EditorGUILayout.Space();
- _outLineDistance = EditorGUILayout.Vector2Field("描边扩展距离", _outLineDistance);
- 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>();
- var path = AssetDatabase.GUIDToAssetPath(_targetUid);
- if(string.IsNullOrEmpty(path))
- {
- Debug.LogErrorFormat("根据GUID,没有找到对应 地址 {0}",_targetUid);
- yield break;
- }
- _sourceSprite = AssetDatabase.LoadAssetAtPath<Sprite>(path);
- if(_sourceSprite == null)
- {
- Debug.LogErrorFormat("根据GUID,没有找到对应 文件 {0}",path);
- yield break;
- }
- //Debug.Log(AssetDatabase.GUIDToAssetPath(_targetUid));
- //找到所有预设
- float count = 0;
- foreach (var file in files)
- {
- count++;
- if (file.EndsWith(".prefab"))
- {
- var clearPaht = file.Replace(Application.dataPath,"Assets");
- prefabsPath.Add(clearPaht);
- //Debug.Log(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)
- {
- CheckSingPrefab(prefab);
- }
- if (count % _ratePrefab == 0)
- {
- yield return 1;
- }
- EditorUtility.DisplayProgressBar("添加或者修改Outline···", "当前 " + singlePaht, count / prefabsPath.Count);
- }
-
- yield return 1;
- AssetDatabase.SaveAssets();
- AssetDatabase.Refresh();
- EditorUtility.ClearProgressBar();
- EditorUtility.DisplayDialog("提示", "查找完成,一共替换 "+ _successCount + " 处", "好的呢", "");
- }
-
- /// <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>
- /// 检查当前对象上是否有Image组件,如果有检查是否和指定的纹理相同,如果相同检查他的子对象的Text组件,尝试添加OutLine
- /// </summary>
- /// <param name="go"></param>
- void CheckSingGameObject(GameObject go)
- {
- var img = go.GetComponent<Image>();
- if(img)
- {
- if(img.sprite == _sourceSprite)
- {
- var t = go.GetComponentInChildren<Text>();
- if(t)
- {
- Outline line = t.gameObject.GetComponent<Outline>();
- if(line == null)
- {
- line = t.gameObject.AddComponent<Outline>();
- }
- line.effectColor = _outLineColor;
- line.effectDistance = _outLineDistance;
- line.enabled = true;
- _successCount++;
- }
- }
- }
- }
-
- void OnSelectionChange()
- {
- //object[] selection = (object[])Selection.objects;
- //Debug.Log(selection .Length);
- ////判断是否有对象被选中
- //if (selection.Length != 1)
- // return;
- ////遍历每一个对象判断不是文件夹
- //string objPath = AssetDatabase.GetAssetPath((Object)selection[0]);
- //Debug.Log(objPath);
- //if( Directory.Exists(objPath) )
- //{
- // _pathRoot = objPath;
- // Repaint();
- //}
- //else
- //{
-
- //}
- }
-
- private static void Init()
- {
- instance=EditorWindow.GetWindow<AddOutLineTool>("添加描边");
- _targetUid = "";
- _pathRoot = Application.dataPath + "/LuaFramework/AssetBundleRes/ui";
- instance.position = new Rect(new Vector2(604, 290), new Vector2(650, 400));
- _sourceSprite = null;
- }
- }
|