根据sprite查看被哪些prefab引用
项目中经常会有重复被使用或者重复的资源图片,在整理的时候想查看图片被哪些prefab引用好进行安全清除。可以利用AssetDataBase相关API查找资源的GUID,GUID是每个资源在导入后唯一存在的。根据GUID查看整个AssetDatabase中的所有Prefab中含有GUID的引用。
之前都是直接打log输出Prefab名字,还要手动进行复制搜索,操作繁琐。 网上搜到的一个工具,很好用,可以直接点击查看进行跳转,使用了EditorGUI的ObjectField
代码
public class SearchReferenceEditorWindow : EditorWindow
{
[MenuItem("Assets/SearchReference")]
static void SearchRef()
{
SearchReferenceEditorWindow window =
(SearchReferenceEditorWindow) EditorWindow.GetWindow(typeof(SearchReferenceEditorWindow), false, "Searching", true);
}
private static Object _searchObject;
private List<Object> _resultList = new List<Object>();
private void OnGUI()
{
EditorGUILayout.BeginHorizontal();
_searchObject = EditorGUILayout.ObjectField(_searchObject, typeof(Object), true, GUILayout.Width(200));
if (GUILayout.Button("Search", GUILayout.Width(100)))
{
_resultList.Clear();
if (_searchObject == null)
{
return;
}
string assetPath = AssetDatabase.GetAssetPath(_searchObject); // 获取资源的路径
string assetGuid = AssetDatabase.AssetPathToGUID(assetPath); // 获取资源的GUID
// / 遍历工程中的所有Object,第一个参数搜索变量,第二个参数,搜索文件夹目录
string[] guids = AssetDatabase.FindAssets("t:Prefab", new[] {"Assets"});
int length = guids.Length;
for (int i = 0; i < length; i++)
{
string filePath = AssetDatabase.GUIDToAssetPath(guids[i]); // 获取每个Prefab路径
EditorUtility.DisplayCancelableProgressBar("Checking", filePath, i / length * 1.0f);
string content = File.ReadAllText(filePath); // 查找prefab文件中的引用
if (content.Contains(assetGuid))
{
Object fileObject = AssetDatabase.LoadAssetAtPath(filePath, typeof(Object)); // 将Prefab加载到ObjectField上
_resultList.Add(fileObject);
}
EditorUtility.ClearProgressBar();
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginVertical();
foreach (var obj in _resultList)
{
EditorGUILayout.ObjectField(obj, typeof(Object), true, GUILayout.Width(300));
}
EditorGUILayout.EndVertical();
}
}