Example #1
0
        /// <summary>
        /// 获取打包收集的资源文件
        /// </summary>
        public List <CollectAssetInfo> GetAllCollectAssets(EBuildMode buildMode)
        {
            BuildMode = buildMode;

            Dictionary <string, CollectAssetInfo> result = new Dictionary <string, CollectAssetInfo>(10000);

            // 收集打包资源
            foreach (var group in Groups)
            {
                var temper = group.GetAllCollectAssets();
                foreach (var assetInfo in temper)
                {
                    if (result.ContainsKey(assetInfo.AssetPath) == false)
                    {
                        result.Add(assetInfo.AssetPath, assetInfo);
                    }
                    else
                    {
                        throw new Exception($"The collecting asset file is existed : {assetInfo.AssetPath} in group setting.");
                    }
                }
            }

            // 检测可寻址地址是否重复
            if (EnableAddressable)
            {
                HashSet <string> adressTemper = new HashSet <string>();
                foreach (var collectInfoPair in result)
                {
                    if (collectInfoPair.Value.CollectorType == ECollectorType.MainAssetCollector)
                    {
                        string address = collectInfoPair.Value.Address;
                        if (adressTemper.Contains(address) == false)
                        {
                            adressTemper.Add(address);
                        }
                        else
                        {
                            throw new Exception($"The address is existed : {address} in group setting.");
                        }
                    }
                }
            }

            // 返回列表
            return(result.Values.ToList());
        }
        /// <summary>
        /// 执行资源构建上下文
        /// </summary>
        public static BuildMapContext CreateBuildMap(EBuildMode buildMode)
        {
            BuildMapContext context = new BuildMapContext();
            Dictionary <string, BuildAssetInfo> buildAssetDic = new Dictionary <string, BuildAssetInfo>(1000);

            // 1. 检测配置合法性
            AssetBundleCollectorSettingData.Setting.CheckConfigError();

            // 2. 获取所有收集器收集的资源
            List <CollectAssetInfo> allCollectAssets = AssetBundleCollectorSettingData.Setting.GetAllCollectAssets(buildMode);

            // 3. 剔除未被引用的依赖资源
            List <CollectAssetInfo> removeDependList = new List <CollectAssetInfo>();

            foreach (var collectAssetInfo in allCollectAssets)
            {
                if (collectAssetInfo.CollectorType == ECollectorType.DependAssetCollector)
                {
                    if (IsRemoveDependAsset(allCollectAssets, collectAssetInfo.AssetPath))
                    {
                        removeDependList.Add(collectAssetInfo);
                    }
                }
            }
            foreach (var removeValue in removeDependList)
            {
                allCollectAssets.Remove(removeValue);
            }

            // 4. 录入所有收集器收集的资源
            foreach (var collectAssetInfo in allCollectAssets)
            {
                if (buildAssetDic.ContainsKey(collectAssetInfo.AssetPath) == false)
                {
                    var buildAssetInfo = new BuildAssetInfo(collectAssetInfo.CollectorType, collectAssetInfo.BundleName,
                                                            collectAssetInfo.Address, collectAssetInfo.AssetPath, collectAssetInfo.IsRawAsset);
                    buildAssetInfo.AddAssetTags(collectAssetInfo.AssetTags);
                    buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
                    buildAssetDic.Add(collectAssetInfo.AssetPath, buildAssetInfo);
                }
                else
                {
                    throw new Exception($"Should never get here !");
                }
            }

            // 5. 录入相关依赖的资源
            foreach (var collectAssetInfo in allCollectAssets)
            {
                foreach (var dependAssetPath in collectAssetInfo.DependAssets)
                {
                    if (buildAssetDic.ContainsKey(dependAssetPath))
                    {
                        buildAssetDic[dependAssetPath].AddBundleTags(collectAssetInfo.AssetTags);
                        buildAssetDic[dependAssetPath].AddReferenceBundleName(collectAssetInfo.BundleName);
                    }
                    else
                    {
                        var buildAssetInfo = new BuildAssetInfo(ECollectorType.None, dependAssetPath);
                        buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
                        buildAssetInfo.AddReferenceBundleName(collectAssetInfo.BundleName);
                        buildAssetDic.Add(dependAssetPath, buildAssetInfo);
                    }
                }
            }
            context.AssetFileCount = buildAssetDic.Count;

            // 6. 填充主动收集资源的依赖列表
            foreach (var collectAssetInfo in allCollectAssets)
            {
                var dependAssetInfos = new List <BuildAssetInfo>(collectAssetInfo.DependAssets.Count);
                foreach (var dependAssetPath in collectAssetInfo.DependAssets)
                {
                    if (buildAssetDic.TryGetValue(dependAssetPath, out BuildAssetInfo value))
                    {
                        dependAssetInfos.Add(value);
                    }
                    else
                    {
                        throw new Exception("Should never get here !");
                    }
                }
                buildAssetDic[collectAssetInfo.AssetPath].SetAllDependAssetInfos(dependAssetInfos);
            }

            // 7. 计算完整的资源包名
            foreach (KeyValuePair <string, BuildAssetInfo> pair in buildAssetDic)
            {
                pair.Value.CalculateFullBundleName();
            }

            // 8. 移除不参与构建的资源
            List <BuildAssetInfo> removeBuildList = new List <BuildAssetInfo>();

            foreach (KeyValuePair <string, BuildAssetInfo> pair in buildAssetDic)
            {
                var buildAssetInfo = pair.Value;
                if (buildAssetInfo.HasBundleName() == false)
                {
                    removeBuildList.Add(buildAssetInfo);
                }
            }
            foreach (var removeValue in removeBuildList)
            {
                buildAssetDic.Remove(removeValue.AssetPath);
            }

            // 9. 构建资源包
            var allBuildinAssets = buildAssetDic.Values.ToList();

            if (allBuildinAssets.Count == 0)
            {
                throw new Exception("构建的资源列表不能为空");
            }
            foreach (var assetInfo in allBuildinAssets)
            {
                context.PackAsset(assetInfo);
            }
            return(context);
        }