public List <Entry> LoadObjects() { var dir = new List <Entry>(); using (var stream = new BundleStream(m_file, m_segments)) { foreach (BundleEntry bundle in m_bundles) { if (bundle.Name.HasAnyOfExtensions(".resource", ".resS")) { continue; } using (var asset_stream = new StreamRegion(stream, bundle.Offset, bundle.Size, true)) using (var reader = new AssetReader(asset_stream, bundle.Name)) { var asset = new Asset(); asset.Load(reader); var object_dir = ParseAsset(stream, bundle, asset); dir.AddRange(object_dir); } } if (0 == dir.Count) { dir.AddRange(m_bundles); } } return(dir); }
public override IImageDecoder OpenImage(ArcFile arc, Entry entry) { var aent = entry as AssetEntry; if (null == aent || aent.AssetObject.Type != "Texture2D") { return(base.OpenImage(arc, entry)); } var uarc = (UnityBundle)arc; var obj = aent.AssetObject; Stream input = new BundleStream(uarc.File, uarc.Segments); input = new StreamRegion(input, obj.Offset, obj.Size); var reader = new AssetReader(input, entry.Name); reader.SetupReaders(obj.Asset); return(new Texture2DDecoder(reader)); }
public override IImageDecoder OpenImage(ArcFile arc, Entry entry) { var aent = entry as AssetEntry; if (null == aent || aent.AssetObject.TypeName != "Texture2D") { return(base.OpenImage(arc, entry)); } var uarc = (UnityBundle)arc; var obj = aent.AssetObject; var bundles = new BundleStream(uarc.File, uarc.Segments); var input = new StreamRegion(bundles, obj.Offset, obj.Size); var reader = new AssetReader(input, entry.Name); reader.SetupReaders(obj.Asset); Texture2D tex = null; var type = obj.Type; if (type != null && type.Children.Any(t => t.Type == "StreamingInfo")) { var fields = obj.Deserialize(reader); tex = new Texture2D(); tex.Import(fields); var info = fields["m_StreamData"] as StreamingInfo; if (info != null) { var bundle = uarc.Bundles.FirstOrDefault(b => VFS.IsPathEqualsToFileName(info.Path, b.Name)); if (bundle != null) { tex.m_DataLength = (int)info.Size; input = new StreamRegion(bundles, bundle.Offset + info.Offset, info.Size); reader = new AssetReader(input, entry.Name); } } } if (null == tex) { tex = new Texture2D(); tex.Load(reader); } return(new Texture2DDecoder(tex, reader)); }
public override Stream OpenEntry(ArcFile arc, Entry entry) { var uarc = (UnityBundle)arc; Stream input = new BundleStream(uarc.File, uarc.Segments); input = new StreamRegion(input, entry.Offset, entry.Size); var aent = entry as AssetEntry; if (null == aent || !aent.IsEncrypted) { return(input); } using (input) { var data = new byte[entry.Size]; input.Read(data, 0, data.Length); DecryptAsset(data); return(new BinMemoryStream(data)); } }