private int extractBundleFile(string bundleFileName) { int extractedCount = 0; StatusStripUpdate("Decompressing " + Path.GetFileName(bundleFileName) + " ,,,"); string extractPath = bundleFileName + "_unpacked\\"; Directory.CreateDirectory(extractPath); using (BundleFile b_File = new BundleFile(bundleFileName)) { foreach (var memFile in b_File.MemoryAssetsFileList) { string filePath = extractPath + memFile.fileName.Replace('/','\\'); if (!Directory.Exists(Path.GetDirectoryName(filePath))) { Directory.CreateDirectory(Path.GetDirectoryName(filePath)); } if (File.Exists(filePath)) { StatusStripUpdate("File " + memFile.fileName + " already exists"); } else { StatusStripUpdate("Extracting " + Path.GetFileName(memFile.fileName)); extractedCount += 1; using (FileStream file = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write)) { memFile.memStream.WriteTo(file); } } } } return extractedCount; }
private void LoadBundleFile(string bundleFileName) { StatusStripUpdate("Decompressing " + Path.GetFileName(bundleFileName) + "..."); using (BundleFile b_File = new BundleFile(bundleFileName)) { List<AssetsFile> b_assetsfileList = new List<AssetsFile>(); foreach (var memFile in b_File.MemoryAssetsFileList) //filter unity files { bool validAssetsFile = false; switch (Path.GetExtension(memFile.fileName)) { case ".assets": case ".sharedAssets": validAssetsFile = true; break; case "": if (memFile.fileName == "mainData" || Regex.IsMatch(memFile.fileName, "level.*?") || Regex.IsMatch(memFile.fileName, "CustomAssetBundle-.*?") || Regex.IsMatch(memFile.fileName, "CAB-.*?") || Regex.IsMatch(memFile.fileName, "BuildPlayer-.*?")) { validAssetsFile = true; } break; } if (validAssetsFile) { StatusStripUpdate("Loading " + memFile.fileName); memFile.fileName = Path.GetDirectoryName(bundleFileName) + "\\" + memFile.fileName; //add path for extract location AssetsFile assetsFile = new AssetsFile(memFile.fileName, new EndianStream(memFile.memStream, EndianType.BigEndian)); if (assetsFile.fileGen == 6 && Path.GetFileName(bundleFileName) != "mainData") //2.6.x and earlier don't have a string version before the preload table { //make use of the bundle file version assetsFile.m_Version = b_File.ver3; assetsFile.version = Array.ConvertAll((b_File.ver3.Split(new string[] { ".", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "\n" }, StringSplitOptions.RemoveEmptyEntries)), int.Parse); assetsFile.buildType = b_File.ver3.Split(new string[] { ".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, StringSplitOptions.RemoveEmptyEntries); } b_assetsfileList.Add(assetsFile); } else { memFile.memStream.Close(); } } assetsfileList.AddRange(b_assetsfileList);//will the streams still be available for reading data? foreach (var assetsFile in b_assetsfileList) { foreach (var sharedFile in assetsFile.sharedAssetsList) { sharedFile.fileName = Path.GetDirectoryName(bundleFileName) + "\\" + sharedFile.fileName; var loadedSharedFile = b_assetsfileList.Find(aFile => aFile.filePath == sharedFile.fileName); if (loadedSharedFile != null) { sharedFile.Index = assetsfileList.IndexOf(loadedSharedFile); } } } } }