diff --git a/AssetStudio/AssetStudio.csproj b/AssetStudio/AssetStudio.csproj index 6c4d56c..d617bf6 100644 --- a/AssetStudio/AssetStudio.csproj +++ b/AssetStudio/AssetStudio.csproj @@ -181,6 +181,7 @@ + Code @@ -194,7 +195,7 @@ - + @@ -207,7 +208,7 @@ - + diff --git a/AssetStudio/AssetStudioForm.cs b/AssetStudio/AssetStudioForm.cs index 91ffd65..13c898b 100644 --- a/AssetStudio/AssetStudioForm.cs +++ b/AssetStudio/AssetStudioForm.cs @@ -352,8 +352,8 @@ namespace AssetStudio { switch (lastLoadedAsset.Type) { - case ClassIDReference.Texture2D: - case ClassIDReference.Sprite: + case ClassIDType.Texture2D: + case ClassIDType.Sprite: { if (enablePreview.Checked && imageTexture != null) { @@ -366,15 +366,15 @@ namespace AssetStudio } } break; - case ClassIDReference.Shader: - case ClassIDReference.TextAsset: - case ClassIDReference.MonoBehaviour: + case ClassIDType.Shader: + case ClassIDType.TextAsset: + case ClassIDType.MonoBehaviour: textPreviewBox.Visible = !textPreviewBox.Visible; break; - case ClassIDReference.Font: + case ClassIDType.Font: fontPreviewBox.Visible = !fontPreviewBox.Visible; break; - case ClassIDReference.AudioClip: + case ClassIDType.AudioClip: { FMODpanel.Visible = !FMODpanel.Visible; @@ -646,7 +646,7 @@ namespace AssetStudio { if (e.IsSelected) { - classTextBox.Text = ((TypeItem)classesListView.SelectedItems[0]).ToString(); + classTextBox.Text = ((TypeTreeItem)classesListView.SelectedItems[0]).ToString(); } } @@ -654,7 +654,7 @@ namespace AssetStudio { switch (asset.Type) { - case ClassIDReference.Texture2D: + case ClassIDType.Texture2D: { imageTexture?.Dispose(); var m_Texture2D = new Texture2D(asset, true); @@ -690,7 +690,7 @@ namespace AssetStudio } break; } - case ClassIDReference.AudioClip: + case ClassIDType.AudioClip: { var m_AudioClip = new AudioClip(asset, true); @@ -812,7 +812,7 @@ namespace AssetStudio FMODtimerLabel.Text = $"0:0.0 / {FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}"; break; } - case ClassIDReference.Shader: + case ClassIDType.Shader: { Shader m_TextAsset = new Shader(asset); string m_Script_Text = Encoding.UTF8.GetString(m_TextAsset.m_Script); @@ -822,7 +822,7 @@ namespace AssetStudio textPreviewBox.Visible = true; break; } - case ClassIDReference.TextAsset: + case ClassIDType.TextAsset: { TextAsset m_TextAsset = new TextAsset(asset); @@ -833,10 +833,10 @@ namespace AssetStudio break; } - case ClassIDReference.MonoBehaviour: + case ClassIDType.MonoBehaviour: { var m_MonoBehaviour = new MonoBehaviour(asset); - if (asset.Type1 != asset.Type2 && asset.sourceFile.m_Type.ContainsKey(asset.Type1)) + if (asset.serializedType.m_Nodes != null) { textPreviewBox.Text = asset.Dump(); } @@ -848,7 +848,7 @@ namespace AssetStudio break; } - case ClassIDReference.Font: + case ClassIDType.Font: { Font m_Font = new Font(asset); if (m_Font.m_FontData != null) @@ -900,7 +900,7 @@ namespace AssetStudio StatusStripUpdate("Unsupported font for preview. Try to export."); break; } - case ClassIDReference.Mesh: + case ClassIDType.Mesh: { var m_Mesh = new Mesh(asset); if (m_Mesh.m_VertexCount > 0) @@ -1046,13 +1046,13 @@ namespace AssetStudio + "'Ctrl W'=Wireframe | 'Ctrl S'=Shade | 'Ctrl N'=ReNormal "); } break; - case ClassIDReference.VideoClip: - case ClassIDReference.MovieTexture: + case ClassIDType.VideoClip: + case ClassIDType.MovieTexture: { StatusStripUpdate("Only supported export."); break; } - case ClassIDReference.Sprite: + case ClassIDType.Sprite: { imageTexture?.Dispose(); imageTexture = SpriteHelper.GetImageFromSprite(new Sprite(asset)); @@ -1071,12 +1071,12 @@ namespace AssetStudio } break; } - case ClassIDReference.Animator: + case ClassIDType.Animator: { StatusStripUpdate("Can be exported to FBX file."); break; } - case ClassIDReference.AnimationClip: + case ClassIDType.AnimationClip: { StatusStripUpdate("Can be exported with Animator or objects"); break; @@ -1840,11 +1840,11 @@ namespace AssetStudio if (assetListView.SelectedIndices.Count >= 1) { var selectedAssets = GetSelectedAssets(); - if (selectedAssets.Any(x => x.Type == ClassIDReference.Animator) && selectedAssets.Any(x => x.Type == ClassIDReference.AnimationClip)) + if (selectedAssets.Any(x => x.Type == ClassIDType.Animator) && selectedAssets.Any(x => x.Type == ClassIDType.AnimationClip)) { exportAnimatorwithselectedAnimationClipMenuItem.Visible = true; } - else if (selectedAssets.All(x => x.Type == ClassIDReference.AnimationClip)) + else if (selectedAssets.All(x => x.Type == ClassIDType.AnimationClip)) { exportobjectswithselectedAnimationClipMenuItem.Visible = true; } @@ -1879,11 +1879,11 @@ namespace AssetStudio var selectedAssets = GetSelectedAssets(); foreach (var assetPreloadData in selectedAssets) { - if (assetPreloadData.Type == ClassIDReference.Animator) + if (assetPreloadData.Type == ClassIDType.Animator) { animator = assetPreloadData; } - else if (assetPreloadData.Type == ClassIDReference.AnimationClip) + else if (assetPreloadData.Type == ClassIDType.AnimationClip) { animationList.Add(assetPreloadData); } @@ -1927,7 +1927,7 @@ namespace AssetStudio if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) { var exportPath = saveFolderDialog1.Folder + "\\GameObject\\"; - var animationList = GetSelectedAssets().Where(x => x.Type == ClassIDReference.AnimationClip).ToList(); + var animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); ExportObjectsWithAnimationClip(exportPath, sceneTreeView.Nodes, animationList.Count == 0 ? null : animationList); } } @@ -1981,7 +1981,7 @@ namespace AssetStudio { assetListView.BeginUpdate(); assetListView.SelectedIndices.Clear(); - var show = new List(); + var show = new List(); if (!allToolStripMenuItem.Checked) { for (var i = 1; i < filterTypeToolStripMenuItem.DropDownItems.Count; i++) @@ -1989,7 +1989,7 @@ namespace AssetStudio var item = (ToolStripMenuItem)filterTypeToolStripMenuItem.DropDownItems[i]; if (item.Checked) { - show.Add((ClassIDReference)Enum.Parse(typeof(ClassIDReference), item.Text)); + show.Add((ClassIDType)Enum.Parse(typeof(ClassIDType), item.Text)); } } visibleAssets = exportableAssets.FindAll(x => show.Contains(x.Type)); diff --git a/AssetStudio/StudioClasses/AssetPreloadData.cs b/AssetStudio/StudioClasses/AssetPreloadData.cs index 78f5018..7eba9c4 100644 --- a/AssetStudio/StudioClasses/AssetPreloadData.cs +++ b/AssetStudio/StudioClasses/AssetPreloadData.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Linq; using System.Text; using System.Windows.Forms; @@ -11,14 +9,13 @@ namespace AssetStudio public long m_PathID; public uint Offset; public int Size; - public ClassIDReference Type; - public int Type1; - public int Type2; - + public ClassIDType Type; + public int typeID; + public int classID; + public SerializedType serializedType; public string TypeString; public int fullSize; public string InfoText; - public AssetsFile sourceFile; public GameObject gameObject; public string uniqueID; @@ -33,10 +30,10 @@ namespace AssetStudio public string Dump() { var reader = InitReader(); - if (sourceFile.m_Type.TryGetValue(Type1, out var typeTreeList)) + if (serializedType.m_Nodes != null) { var sb = new StringBuilder(); - TypeTreeHelper.ReadTypeString(sb, typeTreeList, reader); + TypeTreeHelper.ReadTypeString(sb, serializedType.m_Nodes, reader); return sb.ToString(); } return null; @@ -44,7 +41,7 @@ namespace AssetStudio public bool HasStructMember(string name) { - return sourceFile.m_Type.TryGetValue(Type1, out var typeTreeList) && typeTreeList.Any(x => x.m_Name == name); + return serializedType.m_Nodes != null && serializedType.m_Nodes.Any(x => x.m_Name == name); } } } diff --git a/AssetStudio/StudioClasses/AssetsFile.cs b/AssetStudio/StudioClasses/AssetsFile.cs index 56327e9..50e0a47 100644 --- a/AssetStudio/StudioClasses/AssetsFile.cs +++ b/AssetStudio/StudioClasses/AssetsFile.cs @@ -27,9 +27,8 @@ namespace AssetStudio private EndianType m_FileEndianess; public string unityVersion = "2.5.0f5"; public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform; - private bool m_EnableTypeTree; - public SortedDictionary> m_Type = new SortedDictionary>(); - private List classIDs = new List(); + private bool m_EnableTypeTree = true; + public List m_Types; public Dictionary m_Objects; private List m_ScriptTypes; public List m_Externals; @@ -86,19 +85,10 @@ namespace AssetStudio //Read types int typeCount = reader.ReadInt32(); + m_Types = new List(typeCount); for (int i = 0; i < typeCount; i++) { - if (header.m_Version < 13) - { - int classID = reader.ReadInt32(); - var typeTreeList = new List(); - ReadTypeTree(typeTreeList, 0); - m_Type.Add(classID, typeTreeList); - } - else - { - ReadTypeTree5(); - } + m_Types.Add(ReadSerializedType());; } if (header.m_Version >= 7 && header.m_Version < 14) @@ -127,32 +117,33 @@ namespace AssetStudio asset.Offset = reader.ReadUInt32(); asset.Offset += header.m_DataOffset; asset.Size = reader.ReadInt32(); - if (header.m_Version > 15) + asset.typeID = reader.ReadInt32(); + if (header.m_Version < 16) { - int index = reader.ReadInt32(); - asset.Type1 = classIDs[index][0]; - asset.Type2 = classIDs[index][1]; + asset.classID = reader.ReadUInt16(); + asset.serializedType = m_Types.Find(x => x.classID == asset.typeID); + reader.Position += 2; } else { - asset.Type1 = reader.ReadInt32(); - asset.Type2 = reader.ReadUInt16(); - reader.Position += 2; + var type = m_Types[asset.typeID]; + asset.serializedType = type; + asset.classID = type.classID; } if (header.m_Version == 15 || header.m_Version == 16) { var stripped = reader.ReadByte(); } - if (Enum.IsDefined(typeof(ClassIDReference), asset.Type2)) + if (Enum.IsDefined(typeof(ClassIDType), asset.classID)) { - asset.Type = (ClassIDReference)asset.Type2; + asset.Type = (ClassIDType)asset.classID; asset.TypeString = asset.Type.ToString(); } else { - asset.Type = ClassIDReference.UnknownType; - asset.TypeString = "UnknownType " + asset.Type2; + asset.Type = ClassIDType.UnknownType; + asset.TypeString = $"UnknownType {asset.classID}"; } asset.uniqueID = i.ToString(assetIDfmt); @@ -163,7 +154,7 @@ namespace AssetStudio preloadTable.Add(asset.m_PathID, asset); #region read BuildSettings to get version for version 2.x files - if (asset.Type == ClassIDReference.BuildSettings && header.m_Version == 6) + if (asset.Type == ClassIDType.BuildSettings && header.m_Version == 6) { long nextAsset = reader.Position; @@ -238,114 +229,125 @@ namespace AssetStudio } } - private void ReadTypeTree(List typeTreeList, int depth) + private SerializedType ReadSerializedType() { - var typeTree = new TypeTreeNode(); - typeTreeList.Add(typeTree); - typeTree.m_Level = depth; - typeTree.m_Type = reader.ReadStringToNull(); - typeTree.m_Name = reader.ReadStringToNull(); - typeTree.m_ByteSize = reader.ReadInt32(); + var type = new SerializedType(); + + type.classID = reader.ReadInt32(); + + if (header.m_Version >= 16) + { + type.m_IsStrippedType = reader.ReadBoolean(); + } + + if (header.m_Version >= 17) + { + type.m_ScriptTypeIndex = reader.ReadInt16(); + } + + if (header.m_Version >= 13) + { + if ((header.m_Version < 16 && type.classID < 0) || (header.m_Version >= 16 && type.classID == 114)) + { + type.m_ScriptID = reader.ReadBytes(16); //Hash128 + } + type.m_OldTypeHash = reader.ReadBytes(16); //Hash128 + } + + if (m_EnableTypeTree) + { + var typeTree = new List(); + if (header.m_Version >= 12 || header.m_Version == 10) + { + ReadTypeTree5(typeTree); + } + else + { + ReadTypeTree(typeTree); + } + + type.m_Nodes = typeTree; + } + + return type; + } + + private void ReadTypeTree(List typeTree, int depth = 0) + { + var typeTreeNode = new TypeTreeNode(); + typeTree.Add(typeTreeNode); + typeTreeNode.m_Level = depth; + typeTreeNode.m_Type = reader.ReadStringToNull(); + typeTreeNode.m_Name = reader.ReadStringToNull(); + typeTreeNode.m_ByteSize = reader.ReadInt32(); if (header.m_Version == 2) { var variableCount = reader.ReadInt32(); } if (header.m_Version != 3) { - typeTree.m_Index = reader.ReadInt32(); + typeTreeNode.m_Index = reader.ReadInt32(); } - typeTree.m_IsArray = reader.ReadInt32(); - typeTree.m_Version = reader.ReadInt32(); + typeTreeNode.m_IsArray = reader.ReadInt32(); + typeTreeNode.m_Version = reader.ReadInt32(); if (header.m_Version != 3) { - typeTree.m_MetaFlag = reader.ReadInt32(); - + typeTreeNode.m_MetaFlag = reader.ReadInt32(); } int childrenCount = reader.ReadInt32(); for (int i = 0; i < childrenCount; i++) { - ReadTypeTree(typeTreeList, depth + 1); + ReadTypeTree(typeTree, depth + 1); } } - private void ReadTypeTree5() + private void ReadTypeTree5(List typeTree) { - int classID = reader.ReadInt32(); - if (header.m_Version > 15)//5.5.0 and up - { - reader.ReadByte(); - int typeID = reader.ReadInt16(); - if (typeID >= 0) - { - typeID = -1 - typeID; - } - else - { - typeID = classID; - } - classIDs.Add(new[] { typeID, classID }); - if (classID == 114) - { - reader.Position += 16; - } - classID = typeID; - } - else if (classID < 0) - { - reader.Position += 16; - } - reader.Position += 16; + int numberOfNodes = reader.ReadInt32(); + int stringBufferSize = reader.ReadInt32(); - if (m_EnableTypeTree) + reader.Position += numberOfNodes * 24; + using (var stringBufferReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringBufferSize)))) { - int varCount = reader.ReadInt32(); - int stringSize = reader.ReadInt32(); - - reader.Position += varCount * 24; - using (var stringReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringSize)))) + reader.Position -= numberOfNodes * 24 + stringBufferSize; + for (int i = 0; i < numberOfNodes; i++) { - var typeTreeList = new List(); - reader.Position -= varCount * 24 + stringSize; - for (int i = 0; i < varCount; i++) + var typeTreeNode = new TypeTreeNode(); + typeTree.Add(typeTreeNode); + typeTreeNode.m_Version = reader.ReadUInt16(); + typeTreeNode.m_Level = reader.ReadByte(); + typeTreeNode.m_IsArray = reader.ReadBoolean() ? 1 : 0; + + var m_TypeStrOffset = reader.ReadUInt16(); + var temp = reader.ReadUInt16(); + if (temp == 0) { - var typeTree = new TypeTreeNode(); - typeTreeList.Add(typeTree); - typeTree.m_Version = reader.ReadUInt16(); - typeTree.m_Level = reader.ReadByte(); - typeTree.m_IsArray = reader.ReadBoolean() ? 1 : 0; - - ushort varTypeIndex = reader.ReadUInt16(); - ushort test = reader.ReadUInt16(); - if (test == 0) //varType is an offset in the string block - { - stringReader.BaseStream.Position = varTypeIndex; - typeTree.m_Type = stringReader.ReadStringToNull(); - } - else //varType is an index in an internal strig array - { - typeTree.m_Type = CommonString.StringBuffer.ContainsKey(varTypeIndex) ? CommonString.StringBuffer[varTypeIndex] : varTypeIndex.ToString(); - } - - ushort varNameIndex = reader.ReadUInt16(); - test = reader.ReadUInt16(); - if (test == 0) - { - stringReader.BaseStream.Position = varNameIndex; - typeTree.m_Name = stringReader.ReadStringToNull(); - } - else - { - typeTree.m_Name = CommonString.StringBuffer.ContainsKey(varNameIndex) ? CommonString.StringBuffer[varNameIndex] : varNameIndex.ToString(); - } - - typeTree.m_ByteSize = reader.ReadInt32(); - typeTree.m_Index = reader.ReadInt32(); - typeTree.m_MetaFlag = reader.ReadInt32(); + stringBufferReader.BaseStream.Position = m_TypeStrOffset; + typeTreeNode.m_Type = stringBufferReader.ReadStringToNull(); } - reader.Position += stringSize; - m_Type[classID] = typeTreeList; + else + { + typeTreeNode.m_Type = CommonString.StringBuffer.ContainsKey(m_TypeStrOffset) ? CommonString.StringBuffer[m_TypeStrOffset] : m_TypeStrOffset.ToString(); + } + + var m_NameStrOffset = reader.ReadUInt16(); + temp = reader.ReadUInt16(); + if (temp == 0) + { + stringBufferReader.BaseStream.Position = m_NameStrOffset; + typeTreeNode.m_Name = stringBufferReader.ReadStringToNull(); + } + else + { + typeTreeNode.m_Name = CommonString.StringBuffer.ContainsKey(m_NameStrOffset) ? CommonString.StringBuffer[m_NameStrOffset] : m_NameStrOffset.ToString(); + } + + typeTreeNode.m_ByteSize = reader.ReadInt32(); + typeTreeNode.m_Index = reader.ReadInt32(); + typeTreeNode.m_MetaFlag = reader.ReadInt32(); } + reader.Position += stringBufferSize; } } diff --git a/AssetStudio/StudioClasses/ClassIDReference.cs b/AssetStudio/StudioClasses/ClassIDType.cs similarity index 94% rename from AssetStudio/StudioClasses/ClassIDReference.cs rename to AssetStudio/StudioClasses/ClassIDType.cs index 57310ad..90e3e2f 100644 --- a/AssetStudio/StudioClasses/ClassIDReference.cs +++ b/AssetStudio/StudioClasses/ClassIDType.cs @@ -1,8 +1,9 @@ namespace AssetStudio { - public enum ClassIDReference + public enum ClassIDType { UnknownType = -1, + Object = 0, GameObject = 1, Component = 2, LevelGameManager = 3, @@ -218,6 +219,8 @@ VideoPlayer = 328, VideoClip = 329, OcclusionCullingData = 363, + //kLargestRuntimeClassID = 364 + SmallestEditorClassID = 1000, Prefab = 1001, EditorExtensionImpl = 1002, AssetImporter = 1003, @@ -251,6 +254,7 @@ PVRImporter = 1052, ASTCImporter = 1053, KTXImporter = 1054, + IHVImageFormatImporter = 1055, AnimatorStateTransition = 1101, AnimatorState = 1102, HumanTemplate = 1105, @@ -262,6 +266,16 @@ SubstanceImporter = 1112, LightmapParameters = 1113, LightmapSnapshot = 1120, + GISRaster = 1121, + GISRasterImporter = 1122, + CadImporter = 1123, + SketchUpImporter = 1124, + BuildReport = 1125, + PackedAssets = 1126, + VideoClipImporter = 1127, + ActivationLogComponent = 2000, + //kLargestEditorClassID = 2001 + //kClassIdOutOfHierarchy = 100000 SubDerived = 367388927, SiblingDerived = 334799969, SpriteAtlas = 687078895, diff --git a/AssetStudio/StudioClasses/Exporter.cs b/AssetStudio/StudioClasses/Exporter.cs index 2695b7f..a983762 100644 --- a/AssetStudio/StudioClasses/Exporter.cs +++ b/AssetStudio/StudioClasses/Exporter.cs @@ -107,7 +107,7 @@ namespace AssetStudio return false; var m_MonoBehaviour = new MonoBehaviour(asset); string str; - if (asset.Type1 != asset.Type2 && asset.sourceFile.m_Type.ContainsKey(asset.Type1)) + if (asset.serializedType.m_Nodes != null) { str = asset.Dump(); } diff --git a/AssetStudio/StudioClasses/FBXExporter.cs b/AssetStudio/StudioClasses/FBXExporter.cs index 62277df..9b6cbb5 100644 --- a/AssetStudio/StudioClasses/FBXExporter.cs +++ b/AssetStudio/StudioClasses/FBXExporter.cs @@ -233,7 +233,7 @@ namespace AssetStudio { foreach (var asset in exportableAssets) { - if (asset.Type == ClassIDReference.Texture2D && asset.Text == texName) + if (asset.Type == ClassIDType.Texture2D && asset.Text == texName) { TexturePD = asset; break; @@ -244,7 +244,7 @@ namespace AssetStudio } #endregion - if (TexturePD != null && TexturePD.Type == ClassIDReference.Texture2D) + if (TexturePD != null && TexturePD.Type == ClassIDType.Texture2D) { Textures.Add(TexturePD); diff --git a/AssetStudio/StudioClasses/ModelConverter.cs b/AssetStudio/StudioClasses/ModelConverter.cs index 70afac8..41e6dff 100644 --- a/AssetStudio/StudioClasses/ModelConverter.cs +++ b/AssetStudio/StudioClasses/ModelConverter.cs @@ -127,19 +127,19 @@ namespace AssetStudio { switch (assetPreloadData.Type) { - case ClassIDReference.MeshRenderer: + case ClassIDType.MeshRenderer: { var m_Renderer = new MeshRenderer(assetPreloadData); ConvertMeshRenderer(m_Renderer); break; } - case ClassIDReference.SkinnedMeshRenderer: + case ClassIDType.SkinnedMeshRenderer: { var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); ConvertMeshRenderer(m_SkinnedMeshRenderer); break; } - case ClassIDReference.Animation: + case ClassIDType.Animation: { var m_Animation = new Animation(assetPreloadData); foreach (var animation in m_Animation.m_Animations) @@ -165,7 +165,7 @@ namespace AssetStudio { if (m_Animator.m_Controller.TryGetPD(out var assetPreloadData)) { - if (assetPreloadData.Type == ClassIDReference.AnimatorOverrideController) + if (assetPreloadData.Type == ClassIDType.AnimatorOverrideController) { var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData); if (m_AnimatorOverrideController.m_Controller.TryGetPD(out assetPreloadData)) @@ -187,7 +187,7 @@ namespace AssetStudio } }*/ } - else if (assetPreloadData.Type == ClassIDReference.AnimatorController) + else if (assetPreloadData.Type == ClassIDType.AnimatorController) { var m_AnimatorController = new AnimatorController(assetPreloadData); foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips) @@ -581,7 +581,7 @@ namespace AssetStudio { if (m_Component.TryGetPD(out var assetPreloadData)) { - if (assetPreloadData.Type == ClassIDReference.MeshFilter) + if (assetPreloadData.Type == ClassIDType.MeshFilter) { var m_MeshFilter = new MeshFilter(assetPreloadData); if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD)) @@ -667,7 +667,7 @@ namespace AssetStudio foreach (var texEnv in mat.m_TexEnvs) { Texture2D tex2D = null; - if (texEnv.m_Texture.TryGetPD(out var TexturePD) && TexturePD.Type == ClassIDReference.Texture2D)//TODO other Texture + if (texEnv.m_Texture.TryGetPD(out var TexturePD) && TexturePD.Type == ClassIDType.Texture2D)//TODO other Texture { tex2D = new Texture2D(TexturePD, true); } diff --git a/AssetStudio/StudioClasses/SerializedType.cs b/AssetStudio/StudioClasses/SerializedType.cs new file mode 100644 index 0000000..12c16e9 --- /dev/null +++ b/AssetStudio/StudioClasses/SerializedType.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public class SerializedType + { + public int classID; + public bool m_IsStrippedType; + public short m_ScriptTypeIndex = -1; + public List m_Nodes; + public byte[] m_ScriptID; //Hash128 + public byte[] m_OldTypeHash; //Hash128 + } +} diff --git a/AssetStudio/StudioClasses/Studio.cs b/AssetStudio/StudioClasses/Studio.cs index db8cb4f..673f779 100644 --- a/AssetStudio/StudioClasses/Studio.cs +++ b/AssetStudio/StudioClasses/Studio.cs @@ -20,7 +20,7 @@ namespace AssetStudio public static List exportableAssets = new List(); //used to hold all assets while the ListView is filtered private static HashSet assetsNameHash = new HashSet(); //avoid the same name asset public static List visibleAssets = new List(); //used to build the ListView from all or filtered assets - public static Dictionary> AllTypeMap = new Dictionary>(); + public static Dictionary> AllTypeMap = new Dictionary>(); public static string mainPath; public static string productName = ""; public static bool moduleLoaded; @@ -178,77 +178,77 @@ namespace AssetStudio var exportable = false; switch (asset.Type) { - case ClassIDReference.GameObject: + case ClassIDType.GameObject: { var m_GameObject = new GameObject(asset); asset.Text = m_GameObject.m_Name; assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); break; } - case ClassIDReference.Transform: + case ClassIDType.Transform: { var m_Transform = new Transform(asset); assetsFile.TransformList.Add(asset.m_PathID, m_Transform); break; } - case ClassIDReference.RectTransform: + case ClassIDType.RectTransform: { var m_Rect = new RectTransform(asset); assetsFile.TransformList.Add(asset.m_PathID, m_Rect); break; } - case ClassIDReference.Texture2D: + case ClassIDType.Texture2D: { var m_Texture2D = new Texture2D(asset, false); if (!string.IsNullOrEmpty(m_Texture2D.path)) asset.fullSize = asset.Size + (int)m_Texture2D.size; - goto case ClassIDReference.NamedObject; + goto case ClassIDType.NamedObject; } - case ClassIDReference.AudioClip: + case ClassIDType.AudioClip: { var m_AudioClip = new AudioClip(asset, false); if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) asset.fullSize = asset.Size + (int)m_AudioClip.m_Size; - goto case ClassIDReference.NamedObject; + goto case ClassIDType.NamedObject; } - case ClassIDReference.VideoClip: + case ClassIDType.VideoClip: { var m_VideoClip = new VideoClip(asset, false); if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) asset.fullSize = asset.Size + (int)m_VideoClip.m_Size; - goto case ClassIDReference.NamedObject; + goto case ClassIDType.NamedObject; } - case ClassIDReference.NamedObject: - case ClassIDReference.Mesh: - case ClassIDReference.Shader: - case ClassIDReference.TextAsset: - case ClassIDReference.AnimationClip: - case ClassIDReference.Font: - case ClassIDReference.MovieTexture: - case ClassIDReference.Sprite: + case ClassIDType.NamedObject: + case ClassIDType.Mesh: + case ClassIDType.Shader: + case ClassIDType.TextAsset: + case ClassIDType.AnimationClip: + case ClassIDType.Font: + case ClassIDType.MovieTexture: + case ClassIDType.Sprite: { var obj = new NamedObject(asset); asset.Text = obj.m_Name; exportable = true; break; } - case ClassIDReference.Avatar: - case ClassIDReference.AnimatorController: - case ClassIDReference.AnimatorOverrideController: - case ClassIDReference.Material: - case ClassIDReference.MonoScript: - case ClassIDReference.SpriteAtlas: + case ClassIDType.Avatar: + case ClassIDType.AnimatorController: + case ClassIDType.AnimatorOverrideController: + case ClassIDType.Material: + case ClassIDType.MonoScript: + case ClassIDType.SpriteAtlas: { var obj = new NamedObject(asset); asset.Text = obj.m_Name; break; } - case ClassIDReference.Animator: + case ClassIDType.Animator: { exportable = true; break; } - case ClassIDReference.MonoBehaviour: + case ClassIDType.MonoBehaviour: { var m_MonoBehaviour = new MonoBehaviour(asset); if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGetPD(out var script)) @@ -263,13 +263,13 @@ namespace AssetStudio exportable = true; break; } - case ClassIDReference.PlayerSettings: + case ClassIDType.PlayerSettings: { var plSet = new PlayerSettings(asset); productName = plSet.productName; break; } - case ClassIDReference.AssetBundle: + case ClassIDType.AssetBundle: { ab = new AssetBundle(asset); asset.Text = ab.m_Name; @@ -341,17 +341,17 @@ namespace AssetStudio { switch (asset.Type) { - case ClassIDReference.Transform: + case ClassIDType.Transform: { m_GameObject.m_Transform = m_Component; break; } - case ClassIDReference.MeshRenderer: + case ClassIDType.MeshRenderer: { m_GameObject.m_MeshRenderer = m_Component; break; } - case ClassIDReference.MeshFilter: + case ClassIDType.MeshFilter: { m_GameObject.m_MeshFilter = m_Component; if (m_Component.TryGetPD(out var assetPreloadData)) @@ -364,7 +364,7 @@ namespace AssetStudio } break; } - case ClassIDReference.SkinnedMeshRenderer: + case ClassIDType.SkinnedMeshRenderer: { m_GameObject.m_SkinnedMeshRenderer = m_Component; if (m_Component.TryGetPD(out var assetPreloadData)) @@ -377,7 +377,7 @@ namespace AssetStudio } break; } - case ClassIDReference.Animator: + case ClassIDType.Animator: { m_GameObject.m_Animator = m_Component; asset.Text = m_GameObject.preloadData.Text; @@ -425,19 +425,33 @@ namespace AssetStudio #region build list of class strucutres if (buildClassStructures) { - //group class structures by versionv foreach (var assetsFile in assetsfileList) { if (AllTypeMap.TryGetValue(assetsFile.unityVersion, out var curVer)) { - foreach (var type in assetsFile.m_Type) + foreach (var type in assetsFile.m_Types.Where(x => x.m_Nodes != null)) { - curVer[type.Key] = new TypeItem(type.Key, type.Value); + var key = type.classID; + if (type.m_ScriptTypeIndex >= 0) + { + key = -1 - type.m_ScriptTypeIndex; + } + curVer[key] = new TypeTreeItem(key, type.m_Nodes); } } else { - AllTypeMap.Add(assetsFile.unityVersion, assetsFile.m_Type.ToDictionary(x => x.Key, y => new TypeItem(y.Key, y.Value))); + var items = new SortedDictionary(); + foreach (var type in assetsFile.m_Types.Where(x => x.m_Nodes != null)) + { + var key = type.classID; + if (type.m_ScriptTypeIndex >= 0) + { + key = -1 - type.m_ScriptTypeIndex; + } + items.Add(key, new TypeTreeItem(key, type.m_Nodes)); + } + AllTypeMap.Add(assetsFile.unityVersion, items); } } } @@ -494,73 +508,73 @@ namespace AssetStudio { switch (asset.Type) { - case ClassIDReference.Texture2D: + case ClassIDType.Texture2D: if (ExportTexture2D(asset, exportpath, true)) { exportedCount++; } break; - case ClassIDReference.AudioClip: + case ClassIDType.AudioClip: if (ExportAudioClip(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.Shader: + case ClassIDType.Shader: if (ExportShader(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.TextAsset: + case ClassIDType.TextAsset: if (ExportTextAsset(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.MonoBehaviour: + case ClassIDType.MonoBehaviour: if (ExportMonoBehaviour(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.Font: + case ClassIDType.Font: if (ExportFont(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.Mesh: + case ClassIDType.Mesh: if (ExportMesh(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.VideoClip: + case ClassIDType.VideoClip: if (ExportVideoClip(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.MovieTexture: + case ClassIDType.MovieTexture: if (ExportMovieTexture(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.Sprite: + case ClassIDType.Sprite: if (ExportSprite(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.Animator: + case ClassIDType.Animator: if (ExportAnimator(asset, exportpath)) { exportedCount++; } break; - case ClassIDReference.AnimationClip: + case ClassIDType.AnimationClip: break; default: if (ExportRawFile(asset, exportpath)) diff --git a/AssetStudio/StudioClasses/TypeItem.cs b/AssetStudio/StudioClasses/TypeTreeItem.cs similarity index 57% rename from AssetStudio/StudioClasses/TypeItem.cs rename to AssetStudio/StudioClasses/TypeTreeItem.cs index bd2806a..3badfdd 100644 --- a/AssetStudio/StudioClasses/TypeItem.cs +++ b/AssetStudio/StudioClasses/TypeTreeItem.cs @@ -6,21 +6,21 @@ using System.Windows.Forms; namespace AssetStudio { - public class TypeItem : ListViewItem + public class TypeTreeItem : ListViewItem { - public List typeTreeList; + public List m_Nodes; - public TypeItem(int classID, List typeTreeList) + public TypeTreeItem(int typeID, List m_Nodes) { - this.typeTreeList = typeTreeList; - Text = typeTreeList[0].m_Type + " " + typeTreeList[0].m_Name; - SubItems.Add(classID.ToString()); + this.m_Nodes = m_Nodes; + Text = m_Nodes[0].m_Type + " " + m_Nodes[0].m_Name; + SubItems.Add(typeID.ToString()); } public override string ToString() { var sb = new StringBuilder(); - foreach (var i in typeTreeList) + foreach (var i in m_Nodes) { sb.AppendFormat("{0}{1} {2} {3} {4}\r\n", new string('\t', i.m_Level), i.m_Type, i.m_Name, i.m_ByteSize, (i.m_MetaFlag & 0x4000) != 0); }