Esempio n. 1
0
 public void AddDependency(AssetMap asset)
 {
     if (dependencys == null)
     {
         dependencys = new List <AssetMap>();
     }
     dependencys.Add(asset);
 }
Esempio n. 2
0
        public void AddReference(AssetMap asset)
        {
            if (references == null)
            {
                references = new List <AssetMap>();
            }

            references.Add(asset);
        }
        //设置依赖文件的Assetbundle分配
        // 1.生成引用与依赖的映射关系
        // 2.查找打包规则中的最小Order进行设置
        private void checkDependency(Dictionary <string, AssetMap> files)
        {
            //设置依赖文件的Assetbundle名称
            foreach (AssetMap asset in files.Values)
            {
                if (!asset.IsBinding)
                {
                    continue;                    //过滤非显示bundle rule下的资源
                }
                List <AssetMap> dependencys = asset.Dependencys;
                if (dependencys == null)
                {
                    continue;
                }

                for (int j = 0; j < dependencys.Count; j++)
                {
                    AssetImporter importer = AssetImporter.GetAtPath(dependencys[j].AssetPath);
                    if (!string.IsNullOrEmpty(importer.assetBundleName))
                    {
                        continue;                                                   //已经被设置
                    }
                    AssetMap depAsset = dependencys[j];
                    //查询引用文件中最小的Order,使用最小Order的Assetbundle名称
                    AssetBuildRule depAssetRule = findRuleByOrder(depAsset.References, depAsset.Rule);

                    if (depAssetRule == null || depAssetRule.BuildType == (int)BundleBuildType.Ignore)
                    {
                        continue;
                    }

                    //                    Builder.AddBuildLog(string.Format("set dep assetbundle name , path {0} : {1}", depAsset.AssetPath, depAssetRule.AssetBundleName));

                    BuildUtil.SetAssetbundleName(importer, depAssetRule);
                }
            }
        }
        /// <summary>
        /// 设置资源的AB名称
        /// </summary>
        private void SetAbName()
        {
            string savePath = BuilderPreference.BUILD_PATH + "/tempsizefile.txt";

            if (File.Exists(savePath))
            {
                File.Delete(savePath);
            }
            AssetDatabase.Refresh();

            // 设置ab名
            AssetBuildRule[] rules = AssetBuildRuleManager.Instance.Rules;

            Builder.AddBuildLog("<Assetbundle Building> Start set AssetBundleName...");

            Dictionary <string, List <AssetBuildRule> > path2ruleMap = new Dictionary <string, List <AssetBuildRule> >();

            for (int i = 0; i < rules.Length; i++)
            {
                List <AssetBuildRule> ruleList = rules[i].TreeToList();
                for (int j = 0; j < ruleList.Count; j++)
                {
                    AssetBuildRule        rule      = ruleList[j];
                    List <AssetBuildRule> pathRules = null;
                    if (!path2ruleMap.TryGetValue(rule.Path, out pathRules))
                    {
                        pathRules = new List <AssetBuildRule>();
                        path2ruleMap[rule.Path] = pathRules;
                    }

                    pathRules.Add(rule);
                }
            }

            //获取根目录下的所有文件
            List <string> files = new List <string>();

            for (int i = 0; i < rules.Length; i++)
            {
                List <string> rootFiles = BuildUtil.SearchFiles(rules[i], path2ruleMap);
                if (rootFiles != null)
                {
                    files.AddRange(rootFiles);
                }
            }

            Builder.AssetMaps = new Dictionary <string, AssetMap>();
            Dictionary <string, AssetMap> assetMaps = Builder.AssetMaps;

            //构建映射关系
            for (int i = 0; i < files.Count; i++)
            {
                AssetMap fileAssetMap = null;
                FileType fileType     = BuildUtil.GetFileType(new FileInfo(files[i]));
                if (!assetMaps.TryGetValue(files[i], out fileAssetMap))
                {
                    AssetBuildRule rule = findRuleByPath(files[i], path2ruleMap, fileType);
                    if (rule == null)
                    {
                        Debug.LogError("Cant find bundle rule!" + files[i]);
                    }
                    fileAssetMap        = new AssetMap(files[i], rule);
                    assetMaps[files[i]] = fileAssetMap;
                }

                fileAssetMap.IsBinding = true;  //显示设置bundle规则的文件

                //被忽略的规则不查找依赖
                if (fileAssetMap.Rule.BuildType == (int)BundleBuildType.Ignore)
                {
                    continue;
                }

                string[] dependency = AssetDatabase.GetDependencies(files[i]);

                for (int j = 0; j < dependency.Length; j++)
                {
                    string relativePath = BuildUtil.Replace(dependency[j]);
                    string extension    = Path.GetExtension(dependency[j]);

                    if (BuilderPreference.ExcludeFiles.Contains(extension) || relativePath.Equals(files[i]))
                    {
                        continue;
                    }

                    AssetMap assetMap    = null;
                    FileType depFileType = BuildUtil.GetFileType(new FileInfo(relativePath));
                    if (!assetMaps.TryGetValue(relativePath, out assetMap))
                    {
                        AssetBuildRule rule = findRuleByPath(relativePath, path2ruleMap, depFileType);
                        rule     = rule == null ? fileAssetMap.Rule : rule;
                        assetMap = new AssetMap(relativePath, rule);
                        assetMaps[relativePath] = assetMap;
                    }

                    assetMap.AddReference(fileAssetMap);

                    fileAssetMap.AddDependency(assetMap);
                }
            }

            //根据明确的子目录设置AB名,即定义了指定的打包规则的目录
            foreach (AssetMap asset in assetMaps.Values)
            {
                if (asset.Rule.BuildType == (int)BundleBuildType.Ignore || !asset.IsBinding)
                {
                    continue;
                }

                //                Builder.AddBuildLog(string.Format("set assetbundle name , path {0} : {1}", asset.AssetPath, asset.Rule.AssetBundleName));

                BuildUtil.SetAssetbundleName(asset.AssetPath, asset.Rule);
            }

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            Builder.AddBuildLog("<Assetbundle Building> set assetbundle name ... end");


            //设置依赖文件的Assetbundle分配
            this.checkDependency(assetMaps);

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            Builder.AddBuildLog("<Assetbundle Building> Check Dependency... end");
        }