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);
}