using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEditor;
|
using System;
|
using System.IO;
|
using System.Text.RegularExpressions;
|
|
public class TextureRefrenceFinder : EditorWindow
|
{
|
|
static TextureRefrenceFinder window;
|
|
[UnityEditor.MenuItem("美术工具/贴图引用查找工具")]
|
static void Init()
|
{
|
window = GetWindow(typeof(TextureRefrenceFinder), false, "贴图引用查找工具") as TextureRefrenceFinder;
|
window.Show();
|
window.autoRepaintOnSceneChange = true;
|
}
|
|
static List<Texture> selectedTextures = new List<Texture>();
|
static Texture selectedTexture;
|
|
static bool findAllMaterials = false;
|
static List<Material> allMaterials = new List<Material>();
|
static List<Material> refrenceMaterials = new List<Material>();
|
|
[MenuItem("Assets/选择图片")]
|
public static void SetSelectedTextures()
|
{
|
var assets = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets);
|
var total = assets.Length;
|
var index = 0;
|
|
try
|
{
|
selectedTextures.Clear();
|
foreach (var asset in assets)
|
{
|
var assetPath = AssetDatabase.GetAssetPath(asset);
|
var texture = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Texture));
|
if (texture != null)
|
{
|
selectedTextures.Add((Texture)texture);
|
}
|
|
index++;
|
|
EditorUtility.DisplayProgressBar("查找图片", assetPath, index / (float)total);
|
}
|
}
|
catch (Exception ex)
|
{
|
Debug.LogError(ex);
|
}
|
finally
|
{
|
selectedTexture = selectedTextures != null && selectedTextures.Count > 0 ? selectedTextures[0] : null;
|
EditorUtility.ClearProgressBar();
|
}
|
}
|
|
Vector2 textureScrollViewPosition = Vector2.zero;
|
Vector2 materialScrollViewPosition = Vector2.zero;
|
|
private void OnGUI()
|
{
|
EditorGUILayout.BeginVertical();
|
|
EditorGUILayout.LabelField("贴图");
|
EditorGUILayout.Space();
|
|
if (selectedTextures != null && selectedTextures.Count > 0)
|
{
|
EditorGUI.indentLevel++;
|
textureScrollViewPosition = EditorGUILayout.BeginScrollView(textureScrollViewPosition);
|
foreach (var texture in selectedTextures)
|
{
|
DrawTexture(texture);
|
}
|
EditorGUILayout.EndScrollView();
|
|
EditorGUI.indentLevel--;
|
}
|
|
EditorGUILayout.Space();
|
if (GUILayout.Button("查找材质"))
|
{
|
if (!findAllMaterials)
|
{
|
FindAllMaterials();
|
}
|
|
FindRefreceMaterials(selectedTexture);
|
}
|
|
EditorGUILayout.Space();
|
|
EditorGUILayout.LabelField("引用贴图的材质");
|
EditorGUILayout.Space();
|
if (refrenceMaterials != null && refrenceMaterials.Count > 0)
|
{
|
EditorGUI.indentLevel++;
|
materialScrollViewPosition = EditorGUILayout.BeginScrollView(materialScrollViewPosition);
|
foreach (var material in refrenceMaterials)
|
{
|
DrawMaterial(material);
|
}
|
EditorGUILayout.EndScrollView();
|
|
EditorGUI.indentLevel--;
|
}
|
|
EditorGUILayout.Space();
|
EditorGUILayout.Space();
|
EditorGUILayout.EndVertical();
|
}
|
|
private void DrawTexture(Texture _texture)
|
{
|
if (_texture == null)
|
{
|
return;
|
}
|
|
EditorGUILayout.BeginHorizontal();
|
EditorGUILayout.ObjectField(_texture.name, _texture, typeof(Texture), true);
|
if (EditorGUILayout.Toggle(_texture != null && _texture == selectedTexture))
|
{
|
selectedTexture = _texture;
|
}
|
EditorGUILayout.EndHorizontal();
|
}
|
|
private void DrawMaterial(Material _material)
|
{
|
if (_material == null)
|
{
|
return;
|
}
|
|
EditorGUILayout.ObjectField(_material.name, _material, typeof(Material), true);
|
}
|
|
static void FindAllMaterials()
|
{
|
var path = Application.dataPath + "/Art";
|
var allFiles = new DirectoryInfo(path).GetFiles("*", SearchOption.AllDirectories);
|
var total = allFiles.Length;
|
var index = 0;
|
|
try
|
{
|
allMaterials.Clear();
|
foreach (var file in allFiles)
|
{
|
var assetPath = "Assets" + file.FullName.Replace("\\", "/").Replace(Application.dataPath, "");
|
var material = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Material));
|
if (material != null)
|
{
|
allMaterials.Add((Material)material);
|
}
|
|
index++;
|
EditorUtility.DisplayProgressBar("初始化材质", assetPath, index / (float)total);
|
}
|
}
|
catch (Exception ex)
|
{
|
Debug.LogError(ex);
|
}
|
finally
|
{
|
findAllMaterials = true;
|
EditorUtility.ClearProgressBar();
|
}
|
}
|
|
static void FindRefreceMaterials(Texture _texture)
|
{
|
refrenceMaterials.Clear();
|
if (_texture == null)
|
{
|
return;
|
}
|
|
var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(_texture));
|
var total = allMaterials.Count;
|
var index = 0;
|
|
try
|
{
|
foreach (var material in allMaterials)
|
{
|
var text = File.ReadAllText(AssetDatabase.GetAssetPath(material));
|
if (!string.IsNullOrEmpty(text) && Regex.IsMatch(text, guid))
|
{
|
refrenceMaterials.Add(material);
|
|
break;
|
}
|
|
index++;
|
|
EditorUtility.DisplayProgressBar("查找引用材质", material.name, index / (float)total);
|
}
|
}
|
catch (Exception ex)
|
{
|
Debug.Log(ex);
|
}
|
finally
|
{
|
EditorUtility.ClearProgressBar();
|
}
|
|
}
|
|
}
|