private void LoadAssetsFile(string fileName) { var loadedAssetsFile = assetsfileList.Find(aFile => aFile.filePath == fileName); if (loadedAssetsFile == null) { //open file here and pass the stream to facilitate loading memory files //also by keeping the stream as a property of AssetsFile, it can be used later on to read assets AssetsFile assetsFile = new AssetsFile(fileName, new EndianStream(File.OpenRead(fileName), EndianType.BigEndian)); //if (Path.GetFileName(fileName) == "mainData") { mainDataFile = assetsFile; } totalAssetCount += assetsFile.preloadTable.Count; assetsfileList.Add(assetsFile); #region for 2.6.x find mainData and get string version if (assetsFile.fileGen == 6 && Path.GetFileName(fileName) != "mainData") { AssetsFile mainDataFile = assetsfileList.Find(aFile => aFile.filePath == Path.GetDirectoryName(fileName) + "\\mainData"); if (mainDataFile != null) { assetsFile.m_Version = mainDataFile.m_Version; assetsFile.version = mainDataFile.version; assetsFile.buildType = mainDataFile.buildType; } else if (File.Exists(Path.GetDirectoryName(fileName) + "\\mainData")) { mainDataFile = new AssetsFile(Path.GetDirectoryName(fileName) + "\\mainData", new EndianStream(File.OpenRead(Path.GetDirectoryName(fileName) + "\\mainData"), EndianType.BigEndian)); assetsFile.m_Version = mainDataFile.m_Version; assetsFile.version = mainDataFile.version; assetsFile.buildType = mainDataFile.buildType; } } #endregion progressBar1.PerformStep(); foreach (var sharedFile in assetsFile.sharedAssetsList) { string sharedFilePath = Path.GetDirectoryName(fileName) + "\\" + sharedFile.fileName; string sharedFileName = Path.GetFileName(sharedFile.fileName); //var loadedSharedFile = assetsfileList.Find(aFile => aFile.filePath == sharedFilePath); /*var loadedSharedFile = assetsfileList.Find(aFile => aFile.filePath.EndsWith(Path.GetFileName(sharedFile.fileName))); if (loadedSharedFile != null) { sharedFile.Index = assetsfileList.IndexOf(loadedSharedFile); } else if (File.Exists(sharedFilePath)) { //progressBar1.Maximum += 1; sharedFile.Index = assetsfileList.Count; LoadAssetsFile(sharedFilePath); }*/ //searching in unityFiles would preserve desired order, but... var quedSharedFile = unityFiles.Find(uFile => String.Equals(Path.GetFileName(uFile), sharedFileName, StringComparison.OrdinalIgnoreCase)); if (quedSharedFile == null) { //if (!File.Exists(sharedFilePath)) { sharedFilePath = Path.GetDirectoryName(fileName) + "\\" + sharedFileName; } if (!File.Exists(sharedFilePath)) { var findFiles = Directory.GetFiles(Path.GetDirectoryName(fileName), sharedFileName, SearchOption.AllDirectories); if (findFiles.Length > 0) { sharedFilePath = findFiles[0]; } } if (File.Exists(sharedFilePath)) { //this would get screwed if the file somehow fails to load sharedFile.Index = unityFiles.Count; unityFiles.Add(sharedFilePath); progressBar1.Maximum++; } } else { sharedFile.Index = unityFiles.IndexOf(quedSharedFile); } } } }
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); } } } } }
private void LoadAssetsFile(string fileName) { var loadedAssetsFile = assetsfileList.Find(aFile => aFile.filePath == fileName); if (loadedAssetsFile == null) { //open file here and pass the stream to facilitate loading memory files //also by keeping the stream as a property of AssetsFile, it can be used later on to read assets AssetsFile assetsFile = new AssetsFile(fileName, new EndianStream(File.OpenRead(fileName), EndianType.BigEndian)); //if (Path.GetFileName(fileName) == "mainData") { mainDataFile = assetsFile; } assetsfileList.Add(assetsFile); #region for 2.6.x find mainData and get string version if (assetsFile.fileGen == 6 && Path.GetFileName(fileName) != "mainData") { AssetsFile mainDataFile = assetsfileList.Find(aFile => aFile.filePath == Path.GetDirectoryName(fileName) + "\\mainData"); if (mainDataFile != null) { assetsFile.m_Version = mainDataFile.m_Version; assetsFile.version = mainDataFile.version; assetsFile.buildType = mainDataFile.buildType; } else if (File.Exists(Path.GetDirectoryName(fileName) + "\\mainData")) { mainDataFile = new AssetsFile(Path.GetDirectoryName(fileName) + "\\mainData", new EndianStream(File.OpenRead(Path.GetDirectoryName(fileName) + "\\mainData"), EndianType.BigEndian)); assetsFile.m_Version = mainDataFile.m_Version; assetsFile.version = mainDataFile.version; assetsFile.buildType = mainDataFile.buildType; } } #endregion progressBar1.PerformStep(); foreach (var sharedFile in assetsFile.sharedAssetsList) { string sharedFilePath = Path.GetDirectoryName(fileName) + "\\" + sharedFile.fileName; //TODO add extra code to search for the shared file in case it doesn't exist in the main folder //or if it exists or the path is incorrect //var loadedSharedFile = assetsfileList.Find(aFile => aFile.filePath == sharedFilePath); /*var loadedSharedFile = assetsfileList.Find(aFile => aFile.filePath.EndsWith(Path.GetFileName(sharedFile.fileName))); if (loadedSharedFile != null) { sharedFile.Index = assetsfileList.IndexOf(loadedSharedFile); } else if (File.Exists(sharedFilePath)) { //progressBar1.Maximum += 1; sharedFile.Index = assetsfileList.Count; LoadAssetsFile(sharedFilePath); }*/ //searching in unityFiles would preserve desired order, but... var quedSharedFile = unityFiles.Find(uFile => uFile.EndsWith(Path.GetFileName(sharedFile.fileName))); if (quedSharedFile == null && File.Exists(sharedFilePath)) { sharedFile.Index = unityFiles.Count;//this would get screwed if the file fails to load unityFiles.Add(sharedFilePath); progressBar1.Maximum++; } else { sharedFile.Index = unityFiles.IndexOf(quedSharedFile); } } } }