/// <summary>
        /// 提取资源文件的引用关系
        /// </summary>
        /// <param name="resConfig"></param>
        /// <param name="lstAssetItem"></param>
        private static void ExtractReferenceInfo(ResConfig resConfig, List <AssetItem> lstAssetItem)
        {
            SetProgress("收集文件引用信息...", 0.3f);
            for (int i = 0; i < lstAssetItem.Count; ++i)
            {
                AssetItem assetItem = lstAssetItem[i];

                var referenceInfo = new AssetReferenceInfo()
                {
                    guid = assetItem.guid
                };
                string[] dependentAsset = AssetDatabase.GetDependencies(assetItem.path).Where(item => !item.EndsWith(".cs") && !item.EndsWith(".js")).ToArray();;
                foreach (string asset in dependentAsset)
                {
                    string guid = AssetDatabase.AssetPathToGUID(asset);
                    if (!referenceInfo.lstReferences.Contains(guid))
                    {
                        referenceInfo.lstReferences.Add(guid);
                    }

                    if (!IsContainsItemGUID(resConfig.lstAssetItems, guid))
                    {
                        AssetItem referenceItem = new AssetItem(EAssetType.Reference, guid, asset);
                        resConfig.lstAssetItems.Add(referenceItem);
                    }
                }
                if (referenceInfo.lstReferences.Count > 0)
                {
                    resConfig.lstAssetReferenceInfos.Add(referenceInfo);
                }

                SetProgress("收集文件引用信息...", sProgress + 0.7f / lstAssetItem.Count);
            }
        }
Exemplo n.º 2
0
        private static void ExtractReferenceInfo(ResConfig resConfig, List <AssetItem> lstAssetItem)
        {
            SetProgress("收集文件引用信息...", 0.3f);
            for (int i = 0; i < lstAssetItem.Count; ++i)
            {
                AssetItem          assetItem     = lstAssetItem[i];
                AssetReferenceInfo referenceInfo = GetAssetReferenceInfo(assetItem);
                if (referenceInfo.lstReferences.Count > 0)
                {
                    resConfig.lstAssetReferenceInfos.Add(referenceInfo);
                    foreach (string referenceAssetGUID in referenceInfo.lstReferences)
                    {
                        //if (IsContainsItemGUID(resConfig.lstExternalAssetItems, referenceAssetGUID))
                        if (IsContainsItemGUID(resConfig.lstAssetItems, referenceAssetGUID))
                        {
                            continue;
                        }

                        AssetItem referenceAssetItem = GetAssetItemFromGUID(EAssetType.Reference, referenceAssetGUID);
                        if (referenceAssetItem != null)
                        {
                            resConfig.lstAssetItems.Add(referenceAssetItem);
                        }
                        //resConfig.lstExternalAssetItems.Add(referenceAssetItem);
                    }
                }
                SetProgress("收集文件引用信息...", sProgress + 0.7f / lstAssetItem.Count);
            }
        }
        internal static ResConfig Generate(List <string> scenePaths)
        {
            sProgress = 0;
            ResConfig resConfig = new ResConfig();

            #region 提取所有Resources下的文件
            SetProgress("收集Resources信息...", sProgress);
            var resItemQuery = from assetPath in Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories)
                               where (!assetPath.EndsWith(".meta")) && IsResourceFile(assetPath)
                               select new AssetItem(EAssetType.Resources,
                                                    AssetDatabase.AssetPathToGUID(assetPath.Replace('\\', '/').Replace(PROJECT_PATH, "")),
                                                    assetPath.Replace('\\', '/').Replace(PROJECT_PATH, ""));
            foreach (AssetItem resItem in resItemQuery)
            {
                if (!IsContainsItemGUID(resConfig.lstAssetItems, resItem.guid))
                {
                    resConfig.lstAssetItems.Add(resItem);
                }
            }

            SetProgress("收集Resources信息...", sProgress + 0.05f);
            #endregion

            #region 提取所有StreamingAssets下的文件
            SetProgress("收集StreamingAssets信息...", sProgress);
            var streamingAssetItemQuery = from assetPath in Directory.GetFiles(Application.streamingAssetsPath, "*.*", SearchOption.AllDirectories)
                                          where (!assetPath.EndsWith(".meta"))
                                          select new AssetItem(EAssetType.Streaming,
                                                               AssetDatabase.AssetPathToGUID(assetPath.Replace('\\', '/').Replace(PROJECT_PATH, "")),
                                                               assetPath.Replace('\\', '/').Replace(PROJECT_PATH, ""));

            foreach (AssetItem streamingAsset in streamingAssetItemQuery)
            {
                if (!IsContainsItemGUID(resConfig.lstAssetItems, streamingAsset.guid))
                {
                    resConfig.lstAssetItems.Add(streamingAsset);
                }
            }
            SetProgress("收集StreamingAssets信息...", sProgress + 0.05f);
            #endregion

            #region 提取场景引用的资源
            SetProgress("收集场景引用信息...", 0.1f);
            for (int sceneID = 0; sceneID < scenePaths.Count; ++sceneID)
            {
                SceneResCfg sceneResCfg = new SceneResCfg()
                {
                    sceneId   = sceneID,
                    sceneName = scenePaths[sceneID]
                };

                string[] dependentAssets = AssetDatabase.GetDependencies(scenePaths[sceneID]).Where(item => !item.EndsWith(".cs") && !item.EndsWith(".js")).ToArray();
                foreach (string asset in dependentAssets)
                {
                    string    guid      = AssetDatabase.AssetPathToGUID(asset);
                    AssetItem assetItem = new AssetItem(EAssetType.Reference, guid, asset);

                    if (!sceneResCfg.lstReferencedResGUID.Contains(assetItem.guid))
                    {
                        sceneResCfg.lstReferencedResGUID.Add(assetItem.guid);
                    }

                    if (!IsContainsItemGUID(resConfig.lstAssetItems, assetItem.guid))
                    {
                        resConfig.lstAssetItems.Add(assetItem);
                    }
                }
                resConfig.lstSceneResCfg.Add(sceneResCfg);

                SetProgress("收集场景引用信息...", sProgress + 0.2f / scenePaths.Count);
            }
            #endregion

            #region 提取资源引用关系
            ExtractReferenceInfo(resConfig, resConfig.lstAssetItems);
            #endregion

            EditorUtility.ClearProgressBar();
            return(resConfig);
        }