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")); }
AssetEntry ReadAsset(Stream file, UnityObject obj) { string type = obj.Type; if ("AudioClip" == type) { return(ReadAudioClip(file, obj)); } else if ("TextAsset" == type) { return(ReadTextAsset(file, obj)); } else if ("Texture2D" == type) { type = "image"; } return(new AssetEntry { Type = type, AssetObject = obj, Offset = obj.Offset, Size = obj.Size, }); }
AssetEntry ReadTextAsset(Stream input, UnityObject obj) { var type_def = obj.Asset.Tree.TypeTrees[obj.TypeId]; var script = type_def.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); } }