AssetEntry ReadTextAsset(Stream input, UnityObject obj) { var script = obj.Type.Children.FirstOrDefault(f => f.Name == "m_Script"); if (null == script) { return(null); } using (var reader = obj.Open(input)) { var name = reader.ReadString(); reader.Align(); uint size = reader.ReadUInt32(); var entry = new AssetEntry { AssetObject = obj, Offset = obj.Offset + reader.Position, Size = size, IsEncrypted = 0 != (script.Flags & 0x04000000), }; if (entry.IsEncrypted) { uint signature = reader.ReadUInt32(); if (0x0D15F641 == signature) { entry.Type = "image"; } else if (0x474E5089 == signature) { entry.Type = "image"; entry.IsEncrypted = false; } } return(entry); } }
Dictionary <long, string> ReadAssetBundle(Stream input, UnityObject bundle) { using (var reader = bundle.Open(input)) { var name = reader.ReadString(); // m_Name reader.Align(); int count = reader.ReadInt32(); // m_PreloadTable for (int i = 0; i < count; ++i) { reader.ReadInt32(); // m_FileID reader.ReadInt64(); // m_PathID } count = reader.ReadInt32(); // m_Container var id_map = new Dictionary <long, string> (count + 1); id_map[bundle.PathId] = name; for (int i = 0; i < count; ++i) { name = reader.ReadString(); reader.Align(); reader.ReadInt32(); // preloadIndex reader.ReadInt32(); // preloadSize reader.ReadInt32(); // m_FileID long id = reader.ReadInt64(); id_map[id] = name; } return(id_map); } }
AssetEntry ReadAudioClip(Stream input, UnityObject obj) { using (var reader = obj.Open(input)) { var clip = new AudioClip(); clip.Load(reader); var bundle_name = Path.GetFileName(clip.m_Source); var bundle = m_bundles.FirstOrDefault(b => b.Name == bundle_name); if (null == bundle) { return(null); } return(new AssetEntry { Type = "audio", Bundle = bundle, AssetObject = obj, Offset = bundle.Offset + clip.m_Offset, Size = (uint)clip.m_Size, }); } }
string GetObjectName(Stream input, UnityObject obj) { var type = obj.Type; if (type != null && type.Children.Count > 0) { var first_field = type.Children[0]; if ("m_Name" == first_field.Name && "string" == first_field.Type) { using (var reader = obj.Open(input)) { var name = reader.ReadString(); if (!string.IsNullOrEmpty(name)) { return(name); } } } } return(obj.PathId.ToString("X16")); }
string GetObjectName(Stream input, UnityObject obj) { TypeTree type; if (obj.Asset.Tree.TypeTrees.TryGetValue(obj.TypeId, out type) && type.Children.Count > 0) { var first_field = type.Children[0]; if ("m_Name" == first_field.Name && "string" == first_field.Type) { using (var reader = obj.Open(input)) { var name = reader.ReadString(); if (!string.IsNullOrEmpty(name)) { return(name); } } } } return(obj.PathId.ToString("X16")); }