diff --git a/Unity Studio/Unity Classes/Texture2D.cs b/Unity Studio/Unity Classes/Texture2D.cs index db212d9..3d10124 100644 --- a/Unity Studio/Unity Classes/Texture2D.cs +++ b/Unity Studio/Unity Classes/Texture2D.cs @@ -95,7 +95,7 @@ namespace Unity_Studio private static extern bool DecompressCRN(byte[] pSrc_file_data, int src_file_size, out IntPtr dxtdata, out int dxtsize); [DllImport("texgenpack.dll", CallingConvention = CallingConvention.Cdecl)] - private static extern bool texgenpackdecode(int texturetype, byte[] texturedata, int width, int height, IntPtr bmp, bool fixAlpha); + private static extern void texgenpackdecode(int texturetype, byte[] texturedata, int width, int height, IntPtr bmp, bool fixAlpha); public Texture2D(AssetPreloadData preloadData, bool readSwitch) { diff --git a/Unity Studio/Unity Studio Classes/AssetsFile.cs b/Unity Studio/Unity Studio Classes/AssetsFile.cs index 589b054..e0c8109 100644 --- a/Unity Studio/Unity Studio Classes/AssetsFile.cs +++ b/Unity Studio/Unity Studio Classes/AssetsFile.cs @@ -273,14 +273,13 @@ namespace Unity_Studio private void readBase5() { int classID = a_Stream.ReadInt32(); - if (fileGen > 15) + if (fileGen > 15)//5.5.0 and up { a_Stream.ReadByte(); int type1; if ((type1 = a_Stream.ReadInt16()) >= 0) { type1 = -1 - type1; - a_Stream.Position += 16; } else { @@ -288,13 +287,21 @@ namespace Unity_Studio } classIDs.Add(new[] { type1, classID }); classID = type1; - //TODO 某些文件出现type1=-1时还需要跳过16字节的情况 + /*TODO 替换? + if(classID == 114) + { + a_Stream.Position += 16; + }*/ var temp = a_Stream.ReadInt32(); if (temp == 0) { a_Stream.Position += 16; } a_Stream.Position -= 4; + if (type1 < 0) + { + a_Stream.Position += 16; + } } else if (classID < 0) { diff --git a/Unity Studio/Unity Studio Classes/BundleFile.cs b/Unity Studio/Unity Studio Classes/BundleFile.cs index d673781..130a9e3 100644 --- a/Unity Studio/Unity Studio Classes/BundleFile.cs +++ b/Unity Studio/Unity Studio Classes/BundleFile.cs @@ -69,9 +69,9 @@ namespace Unity_Studio { int bundleSize = b_Stream.ReadInt32(); } - else + else if (format == 6) { - long bundleSize = b_Stream.ReadInt64(); + ReadFormat6(b_Stream, true); return; } short dummy2 = b_Stream.ReadInt16(); @@ -117,118 +117,7 @@ namespace Unity_Studio versionEngine = b_Stream.ReadStringToNull(); if (format == 6) { - var bundleSize = b_Stream.ReadInt64(); - int compressedSize = b_Stream.ReadInt32(); - int uncompressedSize = b_Stream.ReadInt32(); - int flag = b_Stream.ReadInt32(); - byte[] blocksInfoBytes; - if ((flag & 0x80) != 0)//at end of file - { - var position = b_Stream.Position; - b_Stream.Position = b_Stream.BaseStream.Length - compressedSize; - blocksInfoBytes = b_Stream.ReadBytes(compressedSize); - b_Stream.Position = position; - } - else - { - blocksInfoBytes = b_Stream.ReadBytes(compressedSize); - } - EndianStream blocksInfo; - switch (flag & 0x3F) - { - default: - case 0://None - { - blocksInfo = new EndianStream(new MemoryStream(blocksInfoBytes), EndianType.BigEndian); - break; - } - case 1://LZMA - { - blocksInfo = new EndianStream(SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(new MemoryStream(blocksInfoBytes)), EndianType.BigEndian); - break; - } - case 2://LZ4 - case 3://LZ4HC - { - byte[] uncompressedBytes = new byte[uncompressedSize]; - using (var mstream = new MemoryStream(blocksInfoBytes)) - { - var decoder = new Lz4DecoderStream(mstream); - decoder.Read(uncompressedBytes, 0, uncompressedSize); - decoder.Dispose(); - } - blocksInfo = new EndianStream(new MemoryStream(uncompressedBytes), EndianType.BigEndian); - break; - } - //case 4:LZHAM? - } - using (blocksInfo) - { - blocksInfo.Position = 0x10; - int blockcount = blocksInfo.ReadInt32(); - EndianStream assetsData; - var assetsDataStream = new MemoryStream(); - for (int i = 0; i < blockcount; i++) - { - uncompressedSize = blocksInfo.ReadInt32(); - compressedSize = blocksInfo.ReadInt32(); - flag = blocksInfo.ReadInt16(); - var compressedBytes = b_Stream.ReadBytes(compressedSize); - switch (flag & 0x3F) - { - default: - case 0://None - { - assetsDataStream.Write(compressedBytes, 0, compressedSize); - break; - } - case 1://LZMA - { - var uncompressedBytes = new byte[uncompressedSize]; - using (var mstream = new MemoryStream(compressedBytes)) - { - var decoder = SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(mstream, uncompressedSize); - decoder.Read(uncompressedBytes, 0, uncompressedSize); - decoder.Dispose(); - } - assetsDataStream.Write(uncompressedBytes, 0, uncompressedSize); - break; - } - case 2://LZ4 - case 3://LZ4HC - { - var uncompressedBytes = new byte[uncompressedSize]; - using (var mstream = new MemoryStream(compressedBytes)) - { - var decoder = new Lz4DecoderStream(mstream); - decoder.Read(uncompressedBytes, 0, uncompressedSize); - decoder.Dispose(); - } - assetsDataStream.Write(uncompressedBytes, 0, uncompressedSize); - break; - } - //case 4:LZHAM? - } - } - assetsData = new EndianStream(assetsDataStream, EndianType.BigEndian); - using (assetsData) - { - var entryinfo_count = blocksInfo.ReadInt32(); - for (int i = 0; i < entryinfo_count; i++) - { - var memFile = new MemoryAssetsFile(); - var entryinfo_offset = blocksInfo.ReadInt64(); - var entryinfo_size = blocksInfo.ReadInt64(); - var unknown = blocksInfo.ReadInt32(); - memFile.fileName = blocksInfo.ReadStringToNull(); - assetsData.Position = entryinfo_offset; - var buffer = new byte[entryinfo_size]; - assetsData.Read(buffer, 0, (int)entryinfo_size); - memFile.memStream = new MemoryStream(buffer); - MemoryAssetsFileList.Add(memFile); - } - } - } + ReadFormat6(b_Stream); } } } @@ -253,5 +142,123 @@ namespace Unity_Studio f_Stream.Position = nextFile; } } + + private void ReadFormat6(EndianStream b_Stream, bool padding = false) + { + var bundleSize = b_Stream.ReadInt64(); + int compressedSize = b_Stream.ReadInt32(); + int uncompressedSize = b_Stream.ReadInt32(); + int flag = b_Stream.ReadInt32(); + if (padding) + b_Stream.ReadByte(); + byte[] blocksInfoBytes; + if ((flag & 0x80) != 0)//at end of file + { + var position = b_Stream.Position; + b_Stream.Position = b_Stream.BaseStream.Length - compressedSize; + blocksInfoBytes = b_Stream.ReadBytes(compressedSize); + b_Stream.Position = position; + } + else + { + blocksInfoBytes = b_Stream.ReadBytes(compressedSize); + } + EndianStream blocksInfo; + switch (flag & 0x3F) + { + default: + case 0://None + { + blocksInfo = new EndianStream(new MemoryStream(blocksInfoBytes), EndianType.BigEndian); + break; + } + case 1://LZMA + { + blocksInfo = new EndianStream(SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(new MemoryStream(blocksInfoBytes)), EndianType.BigEndian); + break; + } + case 2://LZ4 + case 3://LZ4HC + { + byte[] uncompressedBytes = new byte[uncompressedSize]; + using (var mstream = new MemoryStream(blocksInfoBytes)) + { + var decoder = new Lz4DecoderStream(mstream); + decoder.Read(uncompressedBytes, 0, uncompressedSize); + decoder.Dispose(); + } + blocksInfo = new EndianStream(new MemoryStream(uncompressedBytes), EndianType.BigEndian); + break; + } + //case 4:LZHAM? + } + using (blocksInfo) + { + blocksInfo.Position = 0x10; + int blockcount = blocksInfo.ReadInt32(); + EndianStream assetsData; + var assetsDataStream = new MemoryStream(); + for (int i = 0; i < blockcount; i++) + { + uncompressedSize = blocksInfo.ReadInt32(); + compressedSize = blocksInfo.ReadInt32(); + flag = blocksInfo.ReadInt16(); + var compressedBytes = b_Stream.ReadBytes(compressedSize); + switch (flag & 0x3F) + { + default: + case 0://None + { + assetsDataStream.Write(compressedBytes, 0, compressedSize); + break; + } + case 1://LZMA + { + var uncompressedBytes = new byte[uncompressedSize]; + using (var mstream = new MemoryStream(compressedBytes)) + { + var decoder = SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(mstream, uncompressedSize); + decoder.Read(uncompressedBytes, 0, uncompressedSize); + decoder.Dispose(); + } + assetsDataStream.Write(uncompressedBytes, 0, uncompressedSize); + break; + } + case 2://LZ4 + case 3://LZ4HC + { + var uncompressedBytes = new byte[uncompressedSize]; + using (var mstream = new MemoryStream(compressedBytes)) + { + var decoder = new Lz4DecoderStream(mstream); + decoder.Read(uncompressedBytes, 0, uncompressedSize); + decoder.Dispose(); + } + assetsDataStream.Write(uncompressedBytes, 0, uncompressedSize); + break; + } + //case 4:LZHAM? + } + } + assetsData = new EndianStream(assetsDataStream, EndianType.BigEndian); + using (assetsData) + { + var entryinfo_count = blocksInfo.ReadInt32(); + for (int i = 0; i < entryinfo_count; i++) + { + var memFile = new MemoryAssetsFile(); + var entryinfo_offset = blocksInfo.ReadInt64(); + var entryinfo_size = blocksInfo.ReadInt64(); + var unknown = blocksInfo.ReadInt32(); + memFile.fileName = blocksInfo.ReadStringToNull(); + assetsData.Position = entryinfo_offset; + var buffer = new byte[entryinfo_size]; + assetsData.Read(buffer, 0, (int)entryinfo_size); + memFile.memStream = new MemoryStream(buffer); + MemoryAssetsFileList.Add(memFile); + } + } + } + } } } diff --git a/Unity Studio/Unity Studio Classes/UnityStudio.cs b/Unity Studio/Unity Studio Classes/UnityStudio.cs index c2ff626..ae92f51 100644 --- a/Unity Studio/Unity Studio Classes/UnityStudio.cs +++ b/Unity Studio/Unity Studio Classes/UnityStudio.cs @@ -228,7 +228,7 @@ namespace Unity_Studio StatusStripUpdate("Extracting " + Path.GetFileName(memFile.fileName)); extractedCount += 1; - using (FileStream file = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write)) + using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { memFile.memStream.WriteTo(file); memFile.memStream.Close(); @@ -262,68 +262,68 @@ namespace Unity_Studio switch (asset.Type2) { case 1: //GameObject - { - GameObject m_GameObject = new GameObject(asset); - assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); - //totalTreeNodes++; - break; - } + { + GameObject m_GameObject = new GameObject(asset); + assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); + //totalTreeNodes++; + break; + } case 4: //Transform - { - Transform m_Transform = new Transform(asset); - assetsFile.TransformList.Add(asset.m_PathID, m_Transform); - break; - } + { + Transform m_Transform = new Transform(asset); + assetsFile.TransformList.Add(asset.m_PathID, m_Transform); + break; + } case 224: //RectTransform - { - RectTransform m_Rect = new RectTransform(asset); - assetsFile.TransformList.Add(asset.m_PathID, m_Rect.m_Transform); - break; - } + { + RectTransform m_Rect = new RectTransform(asset); + assetsFile.TransformList.Add(asset.m_PathID, m_Rect.m_Transform); + break; + } //case 21: //Material case 28: //Texture2D - { - Texture2D m_Texture2D = new Texture2D(asset, false); - exportable = true; - break; - } - case 48: //Shader - { - Shader m_Shader = new Shader(asset, false); - exportable = true; - break; - } - case 49: //TextAsset - { - TextAsset m_TextAsset = new TextAsset(asset, false); - exportable = true; - break; - } - case 83: //AudioClip - { - AudioClip m_AudioClip = new AudioClip(asset, false); - exportable = true; - break; - } - case 114: //MonoBehaviour - { - var m_MonoBehaviour = new MonoBehaviour(asset, false); - if (asset.Type1 != asset.Type2 && assetsFile.ClassStructures.ContainsKey(asset.Type1)) + { + Texture2D m_Texture2D = new Texture2D(asset, false); exportable = true; - break; - } + break; + } + case 48: //Shader + { + Shader m_Shader = new Shader(asset, false); + exportable = true; + break; + } + case 49: //TextAsset + { + TextAsset m_TextAsset = new TextAsset(asset, false); + exportable = true; + break; + } + case 83: //AudioClip + { + AudioClip m_AudioClip = new AudioClip(asset, false); + exportable = true; + break; + } + case 114: //MonoBehaviour + { + var m_MonoBehaviour = new MonoBehaviour(asset, false); + if (asset.Type1 != asset.Type2 && assetsFile.ClassStructures.ContainsKey(asset.Type1)) + exportable = true; + break; + } case 128: //Font - { - unityFont m_Font = new unityFont(asset, false); - exportable = true; - break; - } + { + unityFont m_Font = new unityFont(asset, false); + exportable = true; + break; + } case 129: //PlayerSettings - { - var plSet = new PlayerSettings(asset); - productName = plSet.productName; - break; - } + { + var plSet = new PlayerSettings(asset); + productName = plSet.productName; + break; + } case 21: //Material case 43: //Mesh case 74: //AnimationClip @@ -331,18 +331,18 @@ namespace Unity_Studio case 91: //AnimatorController case 115: //MonoScript case 213: //Sprite - { - if (asset.Offset + 4 > asset.sourceFile.a_Stream.BaseStream.Length) - break; - asset.sourceFile.a_Stream.Position = asset.Offset; - var len = asset.sourceFile.a_Stream.ReadInt32(); - if (len > 0 && len < asset.Size - 4) { - var bytes = asset.sourceFile.a_Stream.ReadBytes(len); - asset.Text = Encoding.UTF8.GetString(bytes); + if (asset.Offset + 4 > asset.sourceFile.a_Stream.BaseStream.Length) + break; + asset.sourceFile.a_Stream.Position = asset.Offset; + var len = asset.sourceFile.a_Stream.ReadInt32(); + if (len > 0 && len < asset.Size - 4) + { + var bytes = asset.sourceFile.a_Stream.ReadBytes(len); + asset.Text = Encoding.UTF8.GetString(bytes); + } + break; } - break; - } } if (!exportable && displayAll) { @@ -351,7 +351,7 @@ namespace Unity_Studio asset.Text = asset.TypeString + " #" + asset.uniqueID; } asset.extension = ".dat"; - asset.SubItems.AddRange(new[] {asset.TypeString, asset.Size.ToString()}); + asset.SubItems.AddRange(new[] { asset.TypeString, asset.Size.ToString() }); exportable = true; } if (exportable) @@ -1612,7 +1612,7 @@ namespace Unity_Studio else if (ext == "JPEG") format = ImageFormat.Jpeg; var exportFullName = exportPathName + asset.Text + "." + ext.ToLower(); - if (ExportFileExists(exportFullName, asset.TypeString)) + if (ExportFileExists(exportFullName)) return false; var bitmap = m_Texture2D.ConvertToBitmap(flip); if (bitmap != null) @@ -1623,7 +1623,7 @@ namespace Unity_Studio } } var exportFullName2 = exportPathName + asset.Text + asset.extension; - if (ExportFileExists(exportFullName2, asset.TypeString)) + if (ExportFileExists(exportFullName2)) return false; File.WriteAllBytes(exportFullName2, m_Texture2D.ConvertToContainer()); return true; @@ -1637,7 +1637,7 @@ namespace Unity_Studio exportFileextension = ".wav"; } var exportFullname = exportFilename + exportFileextension; - if (ExportFileExists(exportFullname, "AudioClip")) + if (ExportFileExists(exportFullname)) return false; var m_AudioClip = new AudioClip(asset, true); if ((bool)Properties.Settings.Default["convertfsb"] && oldextension == ".fsb") @@ -1733,7 +1733,7 @@ namespace Unity_Studio } } - public static bool ExportFileExists(string filename, string assetType) + public static bool ExportFileExists(string filename) { if (File.Exists(filename)) { diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index e8fbfb6..616395c 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -1336,7 +1336,7 @@ namespace Unity_Studio } break; case 48: - if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString)) + if (!ExportFileExists(exportpath + asset.Text + asset.extension)) { ExportShader(new Shader(asset, true), exportpath + asset.Text + ".txt"); exportedCount++; @@ -1344,7 +1344,7 @@ namespace Unity_Studio break; case 49: TextAsset m_TextAsset = new TextAsset(asset, true); - if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString)) + if (!ExportFileExists(exportpath + asset.Text + asset.extension)) { ExportText(m_TextAsset, exportpath + asset.Text + asset.extension); exportedCount++; @@ -1352,7 +1352,7 @@ namespace Unity_Studio break; case 114: MonoBehaviour m_MonoBehaviour = new MonoBehaviour(asset, true); - if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString)) + if (!ExportFileExists(exportpath + asset.Text + asset.extension)) { ExportMonoBehaviour(m_MonoBehaviour, exportpath + asset.Text + asset.extension); exportedCount++; @@ -1360,14 +1360,14 @@ namespace Unity_Studio break; case 128: unityFont m_Font = new unityFont(asset, true); - if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString)) + if (!ExportFileExists(exportpath + asset.Text + asset.extension)) { ExportFont(m_Font, exportpath + asset.Text + asset.extension); exportedCount++; } break; default: - if (!ExportFileExists(exportpath + asset.Text + asset.extension, asset.TypeString)) + if (!ExportFileExists(exportpath + asset.Text + asset.extension)) { ExportRawFile(asset, exportpath + asset.Text + asset.extension); exportedCount++;