コード例 #1
0
        /// <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());
        }
コード例 #2
0
 /// <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 }));
 }
コード例 #3
0
        /// <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();
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        /// <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();
        }