public void Parse(AssetsReader reader) { Version = reader.ReadCStr(); Platform = reader.ReadInt32(); HasTypeTrees = reader.ReadBoolean(); int numTypes = reader.ReadInt32(); for (int i = 0; i < numTypes; i++) { Types.Add(new AssetsType(reader, HasTypeTrees)); } List <ObjectRecord> records = new List <ObjectRecord>(); int numObj = reader.ReadInt32(); for (int i = 0; i < numObj; i++) { reader.AlignTo(4); var obj = new ObjectRecord(reader); records.Add(obj); } int numAdds = reader.ReadInt32(); for (int i = 0; i < numAdds; i++) { reader.AlignTo(4); Adds.Add(new RawPtr(reader)); } int numExt = reader.ReadInt32(); for (int i = 0; i < numExt; i++) { ExternalFiles.Add(new ExternalFile(reader)); } reader.ReadCStr(); //load the object infos in order based on their type foreach (var record in records.OrderBy(x => PreloadObjectOrder(x)).ThenBy(x => x.ObjectID)) { var obj = ObjectInfo <AssetsObject> .Parse(ParentFile, record); ObjectInfos.Add(obj); if (ShouldForceLoadObject(record)) { var o = obj.Object; } } }
private void Parse(AssetsReader reader) { Offset = reader.ReadBEInt64(); Size = reader.ReadBEInt64(); _flags = reader.ReadBEUInt32(); Filename = reader.ReadCStr(); }
private void Parse(AssetsReader reader) { //basic header stuff signature = reader.ReadCStr(); if (signature != "UnityFS") { throw new NotSupportedException("Stream is not UnityFS"); } fileVersion = reader.ReadBEInt32(); if (fileVersion != 6) { throw new NotSupportedException("File version is not supported"); } PlayerVersion = reader.ReadCStr(); EngineVersion = reader.ReadCStr(); BundleSize = reader.ReadBEInt64(); //header info int compressedSize = reader.ReadBEInt32(); int decompressedSize = reader.ReadBEInt32(); flags = reader.ReadBEUInt32(); if (IsDirectoryAtEnd(flags)) { var start = (int)reader.BaseStream.Position; reader.Seek((int)reader.BaseStream.Length - compressedSize); infoBytes = reader.ReadBytes(compressedSize); reader.Seek(start); } else { infoBytes = reader.ReadBytes(compressedSize); } Stream blockInfoStream = null; try { switch (CompressionMode(flags)) { case UnityFSCompressionMode.LZ4: case UnityFSCompressionMode.LZ4HC: blockInfoStream = new MemoryStream(LZ4.LZ4Codec.Decode(infoBytes, 0, infoBytes.Length, decompressedSize)); break; case UnityFSCompressionMode.NoCompression: blockInfoStream = new MemoryStream(infoBytes); break; case UnityFSCompressionMode.LZMA: // TODO Better way of encoding/decoding blockInfoStream = new MemoryStream(LZMADecode(infoBytes, decompressedSize)); break; } using (AssetsReader infoReader = new AssetsReader(blockInfoStream, false)) ParseDirectory(infoReader); } finally { if (blockInfoStream != null) { blockInfoStream.Dispose(); } } MemoryStream outputStream = new MemoryStream(); foreach (var blockInfo in BlockInfos) { byte[] blockData = null; switch (blockInfo.CompressionMode) { case UnityFSCompressionMode.LZ4: case UnityFSCompressionMode.LZ4HC: blockData = LZ4.LZ4Codec.Decode(reader.ReadBytes((int)blockInfo.CompressedSize), 0, (int)blockInfo.CompressedSize, (int)blockInfo.UncompressedSize); break; case UnityFSCompressionMode.NoCompression: blockData = reader.ReadBytes((int)blockInfo.UncompressedSize); break; case UnityFSCompressionMode.LZMA: blockData = LZMADecode(reader.BaseStream, (int)blockInfo.CompressedSize, (int)blockInfo.UncompressedSize); break; } outputStream.Write(blockData, 0, blockData.Length); } using (outputStream) { foreach (var entry in Entries) { outputStream.Seek(entry.Offset, SeekOrigin.Begin); entry.Data = outputStream.ReadBytes((int)entry.Size); } } }