源战役客户端
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.
 
 
 
 
 

208 lines
7.1 KiB

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;
}
}