示例#1
0
        public static BuildAssetBundleSetting Parse(string content)
        {
            BuildAssetBundleSetting ret = new BuildAssetBundleSetting();
            XmlDocument             doc = new XmlDocument();

            doc.LoadXml(content);
            XmlNodeList xmlBundles = doc.DocumentElement.SelectNodes("/xml/bundles/bundle");

            foreach (XmlNode xmlBundle in xmlBundles)
            {
                BundleSetting bs = new BundleSetting();
                bs.name      = xmlBundle.Attributes.GetNamedItem("name").Value;
                bs.src       = xmlBundle.Attributes.GetNamedItem("src").Value;
                bs.subfixs   = ParseSubfixStr(xmlBundle.Attributes.GetNamedItem("subfix").Value);
                bs.platforms = ParsePlatformStr(xmlBundle.Attributes.GetNamedItem("platform").Value);
                {
                    var nodes = xmlBundle.SelectNodes("includes/elem");
                    foreach (XmlNode elem in nodes)
                    {
                        PathSetting ps = new PathSetting();
                        ps.val       = Path.Combine(bs.src, elem.InnerText).Replace("\\", "/");
                        ps.platforms = ParsePlatformStr(elem.Attributes.GetNamedItem("platform").Value);
                        bs.includes.Add(ps.val, ps);
                    }
                }
                {
                    var nodes = xmlBundle.SelectNodes("excludes/elem");
                    foreach (XmlNode elem in nodes)
                    {
                        PathSetting ps = new PathSetting();
                        ps.val       = Path.Combine(bs.src, elem.InnerText).Replace("\\", "/");
                        ps.platforms = ParsePlatformStr(elem.Attributes.GetNamedItem("platform").Value);
                        bs.excludes.Add(ps.val, ps);
                    }
                }


                Debug.Assert(!ret.bundleSettingMap.ContainsKey(bs.name));
                ret.bundleSettingMap.Add(bs.name, bs);
            }
            return(ret);
        }
示例#2
0
    public static void BuildWin()
    {
        string outDir = Path.Combine(Application.streamingAssetsPath, AssetBundleHelp.Abs_Out_Dir);
        BuildAssetBundleOptions buildOpt    = BuildAssetBundleOptions.None;
        BuildTarget             buildTarget = BuildTarget.StandaloneWindows;
        List <AssetBundleBuild> buildList   = new List <AssetBundleBuild>();

        string dataPathParentDir = Path.GetDirectoryName(Application.dataPath);

        BuildAssetBundleSetting babs = BuildAssetBundleSetting.ParseFile(BuildAssetBundleSetting.GetDefaultSettingFilePath());

        foreach (var setting in babs.bundleSettingMap.Values)
        {
            HashSet <string> assetNames = new HashSet <string>();

            {
                string absAssetDir = Path.Combine(Application.dataPath, setting.src);
                foreach (string fileFormat in setting.subfixs)
                {
                    var resFiles = Directory.GetFiles(absAssetDir, fileFormat, SearchOption.AllDirectories);
                    foreach (var elem in resFiles)
                    {
                        string assetPath = ExtractRelativePath(elem, dataPathParentDir);
                        bool   needPck   = true;
                        if (setting.excludes.TryGetValue(assetPath, out BuildAssetBundleSetting.PathSetting ps))
                        {
                            if (BuildAssetBundleSetting.IsPlatformMatch(ps.platforms))
                            {
                                needPck = false;
                            }
                        }
                        if (needPck)
                        {
                            assetNames.Add(assetPath);
                        }
                    }
                }
            }
            {
                foreach (var ps in setting.includes.Values)
                {
                    if (BuildAssetBundleSetting.IsPlatformMatch(ps.platforms))
                    {
                        assetNames.Add(ps.val);
                    }
                }
            }

            AssetBundleBuild abd = new AssetBundleBuild();
            abd.assetBundleName = setting.name;
            abd.assetNames      = new List <string>(assetNames).ToArray();
            if (abd.assetNames.Length > 0)
            {
                buildList.Add(abd);
            }
        }

        Directory.CreateDirectory(outDir);
        AssetBundleManifest buildRet = BuildPipeline.BuildAssetBundles(outDir, buildList.ToArray(), buildOpt, buildTarget);
        {
            Dictionary <string, AssetBundleMetaData> metaDatas = new Dictionary <string, AssetBundleMetaData>();

            var allBundles = buildRet.GetAllAssetBundles();
            foreach (var elem in allBundles)
            {
                var abDp   = buildRet.GetAllDependencies(elem);
                var abDdp  = buildRet.GetDirectDependencies(elem);
                var abHash = buildRet.GetAssetBundleHash(elem);
                var xx     = abHash;

                var metaData = new AssetBundleMetaData();
                metaData.bundleName         = elem;
                metaData.hash               = abHash.ToString();
                metaData.directDependencies = new List <string>(abDp);
                foreach (var buildInfo in buildList)
                {
                    if (buildInfo.assetBundleName == elem)
                    {
                        metaData.assetNames = new List <string>(buildInfo.assetNames);
                        break;
                    }
                }
                metaDatas.Add(metaData.bundleName, metaData);
            }

            foreach (var kv in metaDatas)
            {
                HashSet <string> dependencies = new HashSet <string>();
                Stack <string>   waitCheckDp  = new Stack <string>(kv.Value.directDependencies);

                while (waitCheckDp.Count > 0)
                {
                    string dp = waitCheckDp.Pop();
                    if (!dependencies.Contains(dp))
                    {
                        dependencies.Add(dp);
                        if (metaDatas.TryGetValue(dp, out AssetBundleMetaData dbMetaData))
                        {
                            foreach (var relateDp in dbMetaData.directDependencies)
                            {
                                if (!dependencies.Contains(relateDp))
                                {
                                    waitCheckDp.Push(relateDp);
                                }
                            }
                        }
                    }
                }
                dependencies.Remove(kv.Key);
                kv.Value.dependencies = new List <string>(dependencies);
            }


            // var jsonStr = JsonConvert.SerializeObject(new AssetBundleMetaDataMap() { datas = metaDatas }, Formatting.Indented);
            var jsonStr = JsonConvert.SerializeObject(metaDatas, Newtonsoft.Json.Formatting.Indented);
            // jsonStr = jsonStr + jsonStr;
            File.WriteAllText(Path.Combine(outDir, AssetBundleHelp.Asset_Bundle_Meta_Data_Name), jsonStr);
        }
    }