/// <summary> /// 搜集资源 /// </summary> /// <param name="searchType">搜集的资源类型</param> /// <param name="searchInFolders">指定搜索的文件夹列表</param> /// <returns>返回搜集到的资源路径列表</returns> public static string[] FindAssets(EAssetSearchType searchType, string[] searchInFolders) { // 注意:AssetDatabase.FindAssets()不支持末尾带分隔符的文件夹路径 for (int i = 0; i < searchInFolders.Length; i++) { string folderPath = searchInFolders[i]; searchInFolders[i] = folderPath.TrimEnd('/'); } // 注意:获取指定目录下的所有资源对象(包括子文件夹) string[] guids; if (searchType == EAssetSearchType.All) { guids = AssetDatabase.FindAssets(string.Empty, searchInFolders); } else { guids = AssetDatabase.FindAssets($"t:{searchType}", searchInFolders); } // 注意:AssetDatabase.FindAssets()可能会获取到重复的资源 List <string> result = new List <string>(); for (int i = 0; i < guids.Length; i++) { string guid = guids[i]; string assetPath = AssetDatabase.GUIDToAssetPath(guid); if (result.Contains(assetPath) == false) { result.Add(assetPath); } } // 返回结果 return(result.ToArray()); }
/// <summary> /// 搜集资源 /// </summary> /// <param name="searchType">搜集的资源类型</param> /// <param name="searchInFolder">指定搜索的文件夹</param> /// <returns>返回搜集到的资源路径列表</returns> public static string[] FindAssets(EAssetSearchType searchType, string searchInFolder) { return(FindAssets(searchType, new string[] { searchInFolder })); }
/// <summary> /// 获取资源被依赖的集合 /// </summary> /// <param name="searchAssetPath">资源路径</param> /// <param name="searchFolder">搜索的文件夹</param> private void FindReferenceInProject(string searchAssetPath, string searchFolder, EAssetSearchType serachType) { ShowProgress(0, 0, 0); // 创建集合 if (_collection == null) { _collection = new Dictionary <EAssetFileExtension, List <string> >(); foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { _collection.Add(value, new List <string>()); } } // 清空集合 foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { _collection[value].Clear(); } // 搜索相关资源的GUID string[] allGuids = null; if (serachType == EAssetSearchType.All) { allGuids = AssetDatabase.FindAssets(string.Empty, new string[] { $"{searchFolder}" }); } else { allGuids = AssetDatabase.FindAssets($"t:{serachType}", new string[] { $"{searchFolder}" }); } // 查找引用 int curCount = 0; foreach (string guid in allGuids) { string path = AssetDatabase.GUIDToAssetPath(guid); string[] dpends = AssetDatabase.GetDependencies(path, false); foreach (string name in dpends) { if (name.Equals(searchAssetPath)) { foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { if (path.EndsWith($".{value}")) { if (_collection[value].Contains(path) == false) { _collection[value].Add(path); break; } } } } } curCount++; ShowProgress((float)curCount / (float)allGuids.Length, allGuids.Length, curCount); } EditorUtility.ClearProgressBar(); }
private void OnGUI() { // 搜索路径 EditorGUILayout.Space(); if (GUILayout.Button("设置搜索目录", GUILayout.MaxWidth(80))) { string resultPath = EditorTools.OpenFolderPanel("搜索目录", _searchFolderPath); if (resultPath != null) { _searchFolderPath = EditorTools.AbsolutePathToAssetPath(resultPath); } } EditorGUILayout.LabelField($"搜索目录:{_searchFolderPath}"); // 搜索类型 _serachType = (EAssetSearchType)EditorGUILayout.EnumPopup("搜索类型", _serachType); // 搜索目标 _searchObject = EditorGUILayout.ObjectField($"搜索目标", _searchObject, typeof(UnityEngine.Object), false); if (_searchObject != null && _searchObject.GetType() == typeof(Texture2D)) { string assetPath = AssetDatabase.GetAssetPath(_searchObject.GetInstanceID()); var spriteObject = AssetDatabase.LoadAssetAtPath <Sprite>(assetPath); if (spriteObject != null) { _searchObject = spriteObject; } } // 执行搜索 EditorGUILayout.Space(); if (GUILayout.Button("搜索")) { if (_searchObject == null) { EditorUtility.DisplayDialog("错误", "请先设置搜索目标", "确定"); return; } string assetPath = AssetDatabase.GetAssetPath(_searchObject.GetInstanceID()); FindReferenceInProject(assetPath, _searchFolderPath, _serachType); } EditorGUILayout.Space(); // 如果字典类为空 if (_collection == null) { return; } // 如果收集列表为空 if (CheckCollectIsEmpty()) { EditorGUILayout.LabelField("提示:没有找到任何被依赖资源。"); return; } _scrollPos = GUILayout.BeginScrollView(_scrollPos); // 显示依赖列表 foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { List <string> collect = _collection[value]; if (collect.Count == 0) { continue; } string HeaderName = value.ToString(); if (value == EAssetFileExtension.prefab) { HeaderName = "预制体"; } else if (value == EAssetFileExtension.fbx) { HeaderName = "模型"; } else if (value == EAssetFileExtension.cs) { HeaderName = "脚本"; } else if (value == EAssetFileExtension.png || value == EAssetFileExtension.jpg) { HeaderName = "图片"; } else if (value == EAssetFileExtension.mat) { HeaderName = "材质球"; } else if (value == EAssetFileExtension.shader) { HeaderName = "着色器"; } else if (value == EAssetFileExtension.ttf) { HeaderName = "字体"; } else if (value == EAssetFileExtension.anim) { HeaderName = "动画"; } else if (value == EAssetFileExtension.unity) { HeaderName = "场景"; } else { throw new NotImplementedException(value.ToString()); } // 绘制头部 if (EditorTools.DrawHeader(HeaderName)) { // 绘制预制体专属按钮 if (value == EAssetFileExtension.prefab) { if (GUILayout.Button("过滤", GUILayout.MaxWidth(80))) { FilterReference(); } if (GUILayout.Button("FindAll", GUILayout.MaxWidth(80))) { FindAll(collect); } } // 绘制依赖列表 foreach (string item in collect) { EditorGUILayout.BeginHorizontal(); UnityEngine.Object go = AssetDatabase.LoadAssetAtPath(item, typeof(UnityEngine.Object)); if (value == EAssetFileExtension.unity) { EditorGUILayout.ObjectField(go, typeof(SceneView), true); } else { EditorGUILayout.ObjectField(go, typeof(UnityEngine.Object), false); } // 绘制预制体专属按钮 if (value == EAssetFileExtension.prefab) { if (GUILayout.Button("Find", GUILayout.MaxWidth(80))) { FindOne(go as GameObject); } } EditorGUILayout.EndHorizontal(); } } } GUILayout.EndScrollView(); }
/// <summary> /// 获取资源被依赖的集合 /// </summary> /// <param name="searchAssetPath">资源路径</param> /// <param name="searchFolder">搜索的文件夹</param> private void FindReferenceInProject(string searchAssetPath, string searchFolder, EAssetSearchType serachType) { // 创建集合 if (_collection == null) { _collection = new Dictionary <EAssetFileExtension, List <string> >(); foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { _collection.Add(value, new List <string>()); } } // 清空集合 foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { _collection[value].Clear(); } // 查找引用 int progressValue = 0; string[] findAssets = EditorTools.FindAssets(serachType, searchFolder); foreach (string assetPath in findAssets) { string[] dpends = AssetDatabase.GetDependencies(assetPath, _recursive); foreach (string name in dpends) { if (name.Equals(assetPath)) { continue; } if (name.Equals(searchAssetPath)) { foreach (EAssetFileExtension value in Enum.GetValues(typeof(EAssetFileExtension))) { if (assetPath.EndsWith($".{value}")) { if (_collection[value].Contains(assetPath) == false) { _collection[value].Add(assetPath); break; } } } } } EditorTools.DisplayProgressBar("正在搜索", ++progressValue, findAssets.Length); } EditorTools.ClearProgressBar(); }