continue work

This commit is contained in:
Perfare 2018-10-17 00:43:34 +08:00
parent 40b191f039
commit 17bd7a210a
11 changed files with 262 additions and 217 deletions

View File

@ -181,6 +181,7 @@
<Compile Include="StudioClasses\LocalSerializedObjectIdentifier.cs" /> <Compile Include="StudioClasses\LocalSerializedObjectIdentifier.cs" />
<Compile Include="StudioClasses\ObjectInfo.cs" /> <Compile Include="StudioClasses\ObjectInfo.cs" />
<Compile Include="StudioClasses\SerializedFileHeader.cs" /> <Compile Include="StudioClasses\SerializedFileHeader.cs" />
<Compile Include="StudioClasses\SerializedType.cs" />
<Compile Include="StudioClasses\SevenZipHelper.cs"> <Compile Include="StudioClasses\SevenZipHelper.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
@ -194,7 +195,7 @@
<Compile Include="StudioClasses\BinaryReaderExtensions.cs" /> <Compile Include="StudioClasses\BinaryReaderExtensions.cs" />
<Compile Include="StudioClasses\BinaryWriterExtensions.cs" /> <Compile Include="StudioClasses\BinaryWriterExtensions.cs" />
<Compile Include="StudioClasses\BuildTarget.cs" /> <Compile Include="StudioClasses\BuildTarget.cs" />
<Compile Include="StudioClasses\ClassIDReference.cs" /> <Compile Include="StudioClasses\ClassIDType.cs" />
<Compile Include="StudioClasses\TypeTreeNode.cs" /> <Compile Include="StudioClasses\TypeTreeNode.cs" />
<Compile Include="StudioClasses\TypeTreeHelper.cs" /> <Compile Include="StudioClasses\TypeTreeHelper.cs" />
<Compile Include="StudioClasses\ResourcesHelper.cs" /> <Compile Include="StudioClasses\ResourcesHelper.cs" />
@ -207,7 +208,7 @@
<Compile Include="Classes\AudioClip.cs" /> <Compile Include="Classes\AudioClip.cs" />
<Compile Include="Classes\BuildSettings.cs" /> <Compile Include="Classes\BuildSettings.cs" />
<Compile Include="StudioClasses\BundleFile.cs" /> <Compile Include="StudioClasses\BundleFile.cs" />
<Compile Include="StudioClasses\TypeItem.cs" /> <Compile Include="StudioClasses\TypeTreeItem.cs" />
<Compile Include="StudioClasses\FBXExporter.cs" /> <Compile Include="StudioClasses\FBXExporter.cs" />
<Compile Include="StudioClasses\SpriteHelper.cs" /> <Compile Include="StudioClasses\SpriteHelper.cs" />
<Compile Include="StudioClasses\Exporter.cs" /> <Compile Include="StudioClasses\Exporter.cs" />

View File

@ -352,8 +352,8 @@ namespace AssetStudio
{ {
switch (lastLoadedAsset.Type) switch (lastLoadedAsset.Type)
{ {
case ClassIDReference.Texture2D: case ClassIDType.Texture2D:
case ClassIDReference.Sprite: case ClassIDType.Sprite:
{ {
if (enablePreview.Checked && imageTexture != null) if (enablePreview.Checked && imageTexture != null)
{ {
@ -366,15 +366,15 @@ namespace AssetStudio
} }
} }
break; break;
case ClassIDReference.Shader: case ClassIDType.Shader:
case ClassIDReference.TextAsset: case ClassIDType.TextAsset:
case ClassIDReference.MonoBehaviour: case ClassIDType.MonoBehaviour:
textPreviewBox.Visible = !textPreviewBox.Visible; textPreviewBox.Visible = !textPreviewBox.Visible;
break; break;
case ClassIDReference.Font: case ClassIDType.Font:
fontPreviewBox.Visible = !fontPreviewBox.Visible; fontPreviewBox.Visible = !fontPreviewBox.Visible;
break; break;
case ClassIDReference.AudioClip: case ClassIDType.AudioClip:
{ {
FMODpanel.Visible = !FMODpanel.Visible; FMODpanel.Visible = !FMODpanel.Visible;
@ -646,7 +646,7 @@ namespace AssetStudio
{ {
if (e.IsSelected) 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) switch (asset.Type)
{ {
case ClassIDReference.Texture2D: case ClassIDType.Texture2D:
{ {
imageTexture?.Dispose(); imageTexture?.Dispose();
var m_Texture2D = new Texture2D(asset, true); var m_Texture2D = new Texture2D(asset, true);
@ -690,7 +690,7 @@ namespace AssetStudio
} }
break; break;
} }
case ClassIDReference.AudioClip: case ClassIDType.AudioClip:
{ {
var m_AudioClip = new AudioClip(asset, true); 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}"; FMODtimerLabel.Text = $"0:0.0 / {FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}";
break; break;
} }
case ClassIDReference.Shader: case ClassIDType.Shader:
{ {
Shader m_TextAsset = new Shader(asset); Shader m_TextAsset = new Shader(asset);
string m_Script_Text = Encoding.UTF8.GetString(m_TextAsset.m_Script); string m_Script_Text = Encoding.UTF8.GetString(m_TextAsset.m_Script);
@ -822,7 +822,7 @@ namespace AssetStudio
textPreviewBox.Visible = true; textPreviewBox.Visible = true;
break; break;
} }
case ClassIDReference.TextAsset: case ClassIDType.TextAsset:
{ {
TextAsset m_TextAsset = new TextAsset(asset); TextAsset m_TextAsset = new TextAsset(asset);
@ -833,10 +833,10 @@ namespace AssetStudio
break; break;
} }
case ClassIDReference.MonoBehaviour: case ClassIDType.MonoBehaviour:
{ {
var m_MonoBehaviour = new MonoBehaviour(asset); 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(); textPreviewBox.Text = asset.Dump();
} }
@ -848,7 +848,7 @@ namespace AssetStudio
break; break;
} }
case ClassIDReference.Font: case ClassIDType.Font:
{ {
Font m_Font = new Font(asset); Font m_Font = new Font(asset);
if (m_Font.m_FontData != null) if (m_Font.m_FontData != null)
@ -900,7 +900,7 @@ namespace AssetStudio
StatusStripUpdate("Unsupported font for preview. Try to export."); StatusStripUpdate("Unsupported font for preview. Try to export.");
break; break;
} }
case ClassIDReference.Mesh: case ClassIDType.Mesh:
{ {
var m_Mesh = new Mesh(asset); var m_Mesh = new Mesh(asset);
if (m_Mesh.m_VertexCount > 0) if (m_Mesh.m_VertexCount > 0)
@ -1046,13 +1046,13 @@ namespace AssetStudio
+ "'Ctrl W'=Wireframe | 'Ctrl S'=Shade | 'Ctrl N'=ReNormal "); + "'Ctrl W'=Wireframe | 'Ctrl S'=Shade | 'Ctrl N'=ReNormal ");
} }
break; break;
case ClassIDReference.VideoClip: case ClassIDType.VideoClip:
case ClassIDReference.MovieTexture: case ClassIDType.MovieTexture:
{ {
StatusStripUpdate("Only supported export."); StatusStripUpdate("Only supported export.");
break; break;
} }
case ClassIDReference.Sprite: case ClassIDType.Sprite:
{ {
imageTexture?.Dispose(); imageTexture?.Dispose();
imageTexture = SpriteHelper.GetImageFromSprite(new Sprite(asset)); imageTexture = SpriteHelper.GetImageFromSprite(new Sprite(asset));
@ -1071,12 +1071,12 @@ namespace AssetStudio
} }
break; break;
} }
case ClassIDReference.Animator: case ClassIDType.Animator:
{ {
StatusStripUpdate("Can be exported to FBX file."); StatusStripUpdate("Can be exported to FBX file.");
break; break;
} }
case ClassIDReference.AnimationClip: case ClassIDType.AnimationClip:
{ {
StatusStripUpdate("Can be exported with Animator or objects"); StatusStripUpdate("Can be exported with Animator or objects");
break; break;
@ -1840,11 +1840,11 @@ namespace AssetStudio
if (assetListView.SelectedIndices.Count >= 1) if (assetListView.SelectedIndices.Count >= 1)
{ {
var selectedAssets = GetSelectedAssets(); 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; exportAnimatorwithselectedAnimationClipMenuItem.Visible = true;
} }
else if (selectedAssets.All(x => x.Type == ClassIDReference.AnimationClip)) else if (selectedAssets.All(x => x.Type == ClassIDType.AnimationClip))
{ {
exportobjectswithselectedAnimationClipMenuItem.Visible = true; exportobjectswithselectedAnimationClipMenuItem.Visible = true;
} }
@ -1879,11 +1879,11 @@ namespace AssetStudio
var selectedAssets = GetSelectedAssets(); var selectedAssets = GetSelectedAssets();
foreach (var assetPreloadData in selectedAssets) foreach (var assetPreloadData in selectedAssets)
{ {
if (assetPreloadData.Type == ClassIDReference.Animator) if (assetPreloadData.Type == ClassIDType.Animator)
{ {
animator = assetPreloadData; animator = assetPreloadData;
} }
else if (assetPreloadData.Type == ClassIDReference.AnimationClip) else if (assetPreloadData.Type == ClassIDType.AnimationClip)
{ {
animationList.Add(assetPreloadData); animationList.Add(assetPreloadData);
} }
@ -1927,7 +1927,7 @@ namespace AssetStudio
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
{ {
var exportPath = saveFolderDialog1.Folder + "\\GameObject\\"; 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); ExportObjectsWithAnimationClip(exportPath, sceneTreeView.Nodes, animationList.Count == 0 ? null : animationList);
} }
} }
@ -1981,7 +1981,7 @@ namespace AssetStudio
{ {
assetListView.BeginUpdate(); assetListView.BeginUpdate();
assetListView.SelectedIndices.Clear(); assetListView.SelectedIndices.Clear();
var show = new List<ClassIDReference>(); var show = new List<ClassIDType>();
if (!allToolStripMenuItem.Checked) if (!allToolStripMenuItem.Checked)
{ {
for (var i = 1; i < filterTypeToolStripMenuItem.DropDownItems.Count; i++) for (var i = 1; i < filterTypeToolStripMenuItem.DropDownItems.Count; i++)
@ -1989,7 +1989,7 @@ namespace AssetStudio
var item = (ToolStripMenuItem)filterTypeToolStripMenuItem.DropDownItems[i]; var item = (ToolStripMenuItem)filterTypeToolStripMenuItem.DropDownItems[i];
if (item.Checked) 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)); visibleAssets = exportableAssets.FindAll(x => show.Contains(x.Type));

View File

@ -1,6 +1,4 @@
using System; using System.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
@ -11,14 +9,13 @@ namespace AssetStudio
public long m_PathID; public long m_PathID;
public uint Offset; public uint Offset;
public int Size; public int Size;
public ClassIDReference Type; public ClassIDType Type;
public int Type1; public int typeID;
public int Type2; public int classID;
public SerializedType serializedType;
public string TypeString; public string TypeString;
public int fullSize; public int fullSize;
public string InfoText; public string InfoText;
public AssetsFile sourceFile; public AssetsFile sourceFile;
public GameObject gameObject; public GameObject gameObject;
public string uniqueID; public string uniqueID;
@ -33,10 +30,10 @@ namespace AssetStudio
public string Dump() public string Dump()
{ {
var reader = InitReader(); var reader = InitReader();
if (sourceFile.m_Type.TryGetValue(Type1, out var typeTreeList)) if (serializedType.m_Nodes != null)
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
TypeTreeHelper.ReadTypeString(sb, typeTreeList, reader); TypeTreeHelper.ReadTypeString(sb, serializedType.m_Nodes, reader);
return sb.ToString(); return sb.ToString();
} }
return null; return null;
@ -44,7 +41,7 @@ namespace AssetStudio
public bool HasStructMember(string name) 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);
} }
} }
} }

View File

@ -27,9 +27,8 @@ namespace AssetStudio
private EndianType m_FileEndianess; private EndianType m_FileEndianess;
public string unityVersion = "2.5.0f5"; public string unityVersion = "2.5.0f5";
public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform; public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform;
private bool m_EnableTypeTree; private bool m_EnableTypeTree = true;
public SortedDictionary<int, List<TypeTreeNode>> m_Type = new SortedDictionary<int, List<TypeTreeNode>>(); public List<SerializedType> m_Types;
private List<int[]> classIDs = new List<int[]>();
public Dictionary<long, ObjectInfo> m_Objects; public Dictionary<long, ObjectInfo> m_Objects;
private List<LocalSerializedObjectIdentifier> m_ScriptTypes; private List<LocalSerializedObjectIdentifier> m_ScriptTypes;
public List<FileIdentifier> m_Externals; public List<FileIdentifier> m_Externals;
@ -86,19 +85,10 @@ namespace AssetStudio
//Read types //Read types
int typeCount = reader.ReadInt32(); int typeCount = reader.ReadInt32();
m_Types = new List<SerializedType>(typeCount);
for (int i = 0; i < typeCount; i++) for (int i = 0; i < typeCount; i++)
{ {
if (header.m_Version < 13) m_Types.Add(ReadSerializedType());;
{
int classID = reader.ReadInt32();
var typeTreeList = new List<TypeTreeNode>();
ReadTypeTree(typeTreeList, 0);
m_Type.Add(classID, typeTreeList);
}
else
{
ReadTypeTree5();
}
} }
if (header.m_Version >= 7 && header.m_Version < 14) if (header.m_Version >= 7 && header.m_Version < 14)
@ -127,32 +117,33 @@ namespace AssetStudio
asset.Offset = reader.ReadUInt32(); asset.Offset = reader.ReadUInt32();
asset.Offset += header.m_DataOffset; asset.Offset += header.m_DataOffset;
asset.Size = reader.ReadInt32(); asset.Size = reader.ReadInt32();
if (header.m_Version > 15) asset.typeID = reader.ReadInt32();
if (header.m_Version < 16)
{ {
int index = reader.ReadInt32(); asset.classID = reader.ReadUInt16();
asset.Type1 = classIDs[index][0]; asset.serializedType = m_Types.Find(x => x.classID == asset.typeID);
asset.Type2 = classIDs[index][1]; reader.Position += 2;
} }
else else
{ {
asset.Type1 = reader.ReadInt32(); var type = m_Types[asset.typeID];
asset.Type2 = reader.ReadUInt16(); asset.serializedType = type;
reader.Position += 2; asset.classID = type.classID;
} }
if (header.m_Version == 15 || header.m_Version == 16) if (header.m_Version == 15 || header.m_Version == 16)
{ {
var stripped = reader.ReadByte(); 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(); asset.TypeString = asset.Type.ToString();
} }
else else
{ {
asset.Type = ClassIDReference.UnknownType; asset.Type = ClassIDType.UnknownType;
asset.TypeString = "UnknownType " + asset.Type2; asset.TypeString = $"UnknownType {asset.classID}";
} }
asset.uniqueID = i.ToString(assetIDfmt); asset.uniqueID = i.ToString(assetIDfmt);
@ -163,7 +154,7 @@ namespace AssetStudio
preloadTable.Add(asset.m_PathID, asset); preloadTable.Add(asset.m_PathID, asset);
#region read BuildSettings to get version for version 2.x files #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; long nextAsset = reader.Position;
@ -238,114 +229,125 @@ namespace AssetStudio
} }
} }
private void ReadTypeTree(List<TypeTreeNode> typeTreeList, int depth) private SerializedType ReadSerializedType()
{ {
var typeTree = new TypeTreeNode(); var type = new SerializedType();
typeTreeList.Add(typeTree);
typeTree.m_Level = depth; type.classID = reader.ReadInt32();
typeTree.m_Type = reader.ReadStringToNull();
typeTree.m_Name = reader.ReadStringToNull(); if (header.m_Version >= 16)
typeTree.m_ByteSize = reader.ReadInt32(); {
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<TypeTreeNode>();
if (header.m_Version >= 12 || header.m_Version == 10)
{
ReadTypeTree5(typeTree);
}
else
{
ReadTypeTree(typeTree);
}
type.m_Nodes = typeTree;
}
return type;
}
private void ReadTypeTree(List<TypeTreeNode> 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) if (header.m_Version == 2)
{ {
var variableCount = reader.ReadInt32(); var variableCount = reader.ReadInt32();
} }
if (header.m_Version != 3) if (header.m_Version != 3)
{ {
typeTree.m_Index = reader.ReadInt32(); typeTreeNode.m_Index = reader.ReadInt32();
} }
typeTree.m_IsArray = reader.ReadInt32(); typeTreeNode.m_IsArray = reader.ReadInt32();
typeTree.m_Version = reader.ReadInt32(); typeTreeNode.m_Version = reader.ReadInt32();
if (header.m_Version != 3) if (header.m_Version != 3)
{ {
typeTree.m_MetaFlag = reader.ReadInt32(); typeTreeNode.m_MetaFlag = reader.ReadInt32();
} }
int childrenCount = reader.ReadInt32(); int childrenCount = reader.ReadInt32();
for (int i = 0; i < childrenCount; i++) for (int i = 0; i < childrenCount; i++)
{ {
ReadTypeTree(typeTreeList, depth + 1); ReadTypeTree(typeTree, depth + 1);
} }
} }
private void ReadTypeTree5() private void ReadTypeTree5(List<TypeTreeNode> typeTree)
{ {
int classID = reader.ReadInt32(); int numberOfNodes = reader.ReadInt32();
if (header.m_Version > 15)//5.5.0 and up int stringBufferSize = reader.ReadInt32();
{
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;
if (m_EnableTypeTree) reader.Position += numberOfNodes * 24;
using (var stringBufferReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringBufferSize))))
{ {
int varCount = reader.ReadInt32(); reader.Position -= numberOfNodes * 24 + stringBufferSize;
int stringSize = reader.ReadInt32(); for (int i = 0; i < numberOfNodes; i++)
reader.Position += varCount * 24;
using (var stringReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringSize))))
{ {
var typeTreeList = new List<TypeTreeNode>(); var typeTreeNode = new TypeTreeNode();
reader.Position -= varCount * 24 + stringSize; typeTree.Add(typeTreeNode);
for (int i = 0; i < varCount; i++) 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(); stringBufferReader.BaseStream.Position = m_TypeStrOffset;
typeTreeList.Add(typeTree); typeTreeNode.m_Type = stringBufferReader.ReadStringToNull();
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();
} }
reader.Position += stringSize; else
m_Type[classID] = typeTreeList; {
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;
} }
} }

View File

@ -1,8 +1,9 @@
namespace AssetStudio namespace AssetStudio
{ {
public enum ClassIDReference public enum ClassIDType
{ {
UnknownType = -1, UnknownType = -1,
Object = 0,
GameObject = 1, GameObject = 1,
Component = 2, Component = 2,
LevelGameManager = 3, LevelGameManager = 3,
@ -218,6 +219,8 @@
VideoPlayer = 328, VideoPlayer = 328,
VideoClip = 329, VideoClip = 329,
OcclusionCullingData = 363, OcclusionCullingData = 363,
//kLargestRuntimeClassID = 364
SmallestEditorClassID = 1000,
Prefab = 1001, Prefab = 1001,
EditorExtensionImpl = 1002, EditorExtensionImpl = 1002,
AssetImporter = 1003, AssetImporter = 1003,
@ -251,6 +254,7 @@
PVRImporter = 1052, PVRImporter = 1052,
ASTCImporter = 1053, ASTCImporter = 1053,
KTXImporter = 1054, KTXImporter = 1054,
IHVImageFormatImporter = 1055,
AnimatorStateTransition = 1101, AnimatorStateTransition = 1101,
AnimatorState = 1102, AnimatorState = 1102,
HumanTemplate = 1105, HumanTemplate = 1105,
@ -262,6 +266,16 @@
SubstanceImporter = 1112, SubstanceImporter = 1112,
LightmapParameters = 1113, LightmapParameters = 1113,
LightmapSnapshot = 1120, LightmapSnapshot = 1120,
GISRaster = 1121,
GISRasterImporter = 1122,
CadImporter = 1123,
SketchUpImporter = 1124,
BuildReport = 1125,
PackedAssets = 1126,
VideoClipImporter = 1127,
ActivationLogComponent = 2000,
//kLargestEditorClassID = 2001
//kClassIdOutOfHierarchy = 100000
SubDerived = 367388927, SubDerived = 367388927,
SiblingDerived = 334799969, SiblingDerived = 334799969,
SpriteAtlas = 687078895, SpriteAtlas = 687078895,

View File

@ -107,7 +107,7 @@ namespace AssetStudio
return false; return false;
var m_MonoBehaviour = new MonoBehaviour(asset); var m_MonoBehaviour = new MonoBehaviour(asset);
string str; string str;
if (asset.Type1 != asset.Type2 && asset.sourceFile.m_Type.ContainsKey(asset.Type1)) if (asset.serializedType.m_Nodes != null)
{ {
str = asset.Dump(); str = asset.Dump();
} }

View File

@ -233,7 +233,7 @@ namespace AssetStudio
{ {
foreach (var asset in exportableAssets) foreach (var asset in exportableAssets)
{ {
if (asset.Type == ClassIDReference.Texture2D && asset.Text == texName) if (asset.Type == ClassIDType.Texture2D && asset.Text == texName)
{ {
TexturePD = asset; TexturePD = asset;
break; break;
@ -244,7 +244,7 @@ namespace AssetStudio
} }
#endregion #endregion
if (TexturePD != null && TexturePD.Type == ClassIDReference.Texture2D) if (TexturePD != null && TexturePD.Type == ClassIDType.Texture2D)
{ {
Textures.Add(TexturePD); Textures.Add(TexturePD);

View File

@ -127,19 +127,19 @@ namespace AssetStudio
{ {
switch (assetPreloadData.Type) switch (assetPreloadData.Type)
{ {
case ClassIDReference.MeshRenderer: case ClassIDType.MeshRenderer:
{ {
var m_Renderer = new MeshRenderer(assetPreloadData); var m_Renderer = new MeshRenderer(assetPreloadData);
ConvertMeshRenderer(m_Renderer); ConvertMeshRenderer(m_Renderer);
break; break;
} }
case ClassIDReference.SkinnedMeshRenderer: case ClassIDType.SkinnedMeshRenderer:
{ {
var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData);
ConvertMeshRenderer(m_SkinnedMeshRenderer); ConvertMeshRenderer(m_SkinnedMeshRenderer);
break; break;
} }
case ClassIDReference.Animation: case ClassIDType.Animation:
{ {
var m_Animation = new Animation(assetPreloadData); var m_Animation = new Animation(assetPreloadData);
foreach (var animation in m_Animation.m_Animations) foreach (var animation in m_Animation.m_Animations)
@ -165,7 +165,7 @@ namespace AssetStudio
{ {
if (m_Animator.m_Controller.TryGetPD(out var assetPreloadData)) 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); var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData);
if (m_AnimatorOverrideController.m_Controller.TryGetPD(out 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); var m_AnimatorController = new AnimatorController(assetPreloadData);
foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips) foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips)
@ -581,7 +581,7 @@ namespace AssetStudio
{ {
if (m_Component.TryGetPD(out var assetPreloadData)) if (m_Component.TryGetPD(out var assetPreloadData))
{ {
if (assetPreloadData.Type == ClassIDReference.MeshFilter) if (assetPreloadData.Type == ClassIDType.MeshFilter)
{ {
var m_MeshFilter = new MeshFilter(assetPreloadData); var m_MeshFilter = new MeshFilter(assetPreloadData);
if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD)) if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD))
@ -667,7 +667,7 @@ namespace AssetStudio
foreach (var texEnv in mat.m_TexEnvs) foreach (var texEnv in mat.m_TexEnvs)
{ {
Texture2D tex2D = null; 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); tex2D = new Texture2D(TexturePD, true);
} }

View File

@ -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<TypeTreeNode> m_Nodes;
public byte[] m_ScriptID; //Hash128
public byte[] m_OldTypeHash; //Hash128
}
}

View File

@ -20,7 +20,7 @@ namespace AssetStudio
public static List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>(); //used to hold all assets while the ListView is filtered public static List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>(); //used to hold all assets while the ListView is filtered
private static HashSet<string> assetsNameHash = new HashSet<string>(); //avoid the same name asset private static HashSet<string> assetsNameHash = new HashSet<string>(); //avoid the same name asset
public static List<AssetPreloadData> visibleAssets = new List<AssetPreloadData>(); //used to build the ListView from all or filtered assets public static List<AssetPreloadData> visibleAssets = new List<AssetPreloadData>(); //used to build the ListView from all or filtered assets
public static Dictionary<string, Dictionary<int, TypeItem>> AllTypeMap = new Dictionary<string, Dictionary<int, TypeItem>>(); public static Dictionary<string, SortedDictionary<int, TypeTreeItem>> AllTypeMap = new Dictionary<string, SortedDictionary<int, TypeTreeItem>>();
public static string mainPath; public static string mainPath;
public static string productName = ""; public static string productName = "";
public static bool moduleLoaded; public static bool moduleLoaded;
@ -178,77 +178,77 @@ namespace AssetStudio
var exportable = false; var exportable = false;
switch (asset.Type) switch (asset.Type)
{ {
case ClassIDReference.GameObject: case ClassIDType.GameObject:
{ {
var m_GameObject = new GameObject(asset); var m_GameObject = new GameObject(asset);
asset.Text = m_GameObject.m_Name; asset.Text = m_GameObject.m_Name;
assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject);
break; break;
} }
case ClassIDReference.Transform: case ClassIDType.Transform:
{ {
var m_Transform = new Transform(asset); var m_Transform = new Transform(asset);
assetsFile.TransformList.Add(asset.m_PathID, m_Transform); assetsFile.TransformList.Add(asset.m_PathID, m_Transform);
break; break;
} }
case ClassIDReference.RectTransform: case ClassIDType.RectTransform:
{ {
var m_Rect = new RectTransform(asset); var m_Rect = new RectTransform(asset);
assetsFile.TransformList.Add(asset.m_PathID, m_Rect); assetsFile.TransformList.Add(asset.m_PathID, m_Rect);
break; break;
} }
case ClassIDReference.Texture2D: case ClassIDType.Texture2D:
{ {
var m_Texture2D = new Texture2D(asset, false); var m_Texture2D = new Texture2D(asset, false);
if (!string.IsNullOrEmpty(m_Texture2D.path)) if (!string.IsNullOrEmpty(m_Texture2D.path))
asset.fullSize = asset.Size + (int)m_Texture2D.size; 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); var m_AudioClip = new AudioClip(asset, false);
if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) if (!string.IsNullOrEmpty(m_AudioClip.m_Source))
asset.fullSize = asset.Size + (int)m_AudioClip.m_Size; 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); var m_VideoClip = new VideoClip(asset, false);
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
asset.fullSize = asset.Size + (int)m_VideoClip.m_Size; asset.fullSize = asset.Size + (int)m_VideoClip.m_Size;
goto case ClassIDReference.NamedObject; goto case ClassIDType.NamedObject;
} }
case ClassIDReference.NamedObject: case ClassIDType.NamedObject:
case ClassIDReference.Mesh: case ClassIDType.Mesh:
case ClassIDReference.Shader: case ClassIDType.Shader:
case ClassIDReference.TextAsset: case ClassIDType.TextAsset:
case ClassIDReference.AnimationClip: case ClassIDType.AnimationClip:
case ClassIDReference.Font: case ClassIDType.Font:
case ClassIDReference.MovieTexture: case ClassIDType.MovieTexture:
case ClassIDReference.Sprite: case ClassIDType.Sprite:
{ {
var obj = new NamedObject(asset); var obj = new NamedObject(asset);
asset.Text = obj.m_Name; asset.Text = obj.m_Name;
exportable = true; exportable = true;
break; break;
} }
case ClassIDReference.Avatar: case ClassIDType.Avatar:
case ClassIDReference.AnimatorController: case ClassIDType.AnimatorController:
case ClassIDReference.AnimatorOverrideController: case ClassIDType.AnimatorOverrideController:
case ClassIDReference.Material: case ClassIDType.Material:
case ClassIDReference.MonoScript: case ClassIDType.MonoScript:
case ClassIDReference.SpriteAtlas: case ClassIDType.SpriteAtlas:
{ {
var obj = new NamedObject(asset); var obj = new NamedObject(asset);
asset.Text = obj.m_Name; asset.Text = obj.m_Name;
break; break;
} }
case ClassIDReference.Animator: case ClassIDType.Animator:
{ {
exportable = true; exportable = true;
break; break;
} }
case ClassIDReference.MonoBehaviour: case ClassIDType.MonoBehaviour:
{ {
var m_MonoBehaviour = new MonoBehaviour(asset); var m_MonoBehaviour = new MonoBehaviour(asset);
if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGetPD(out var script)) if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGetPD(out var script))
@ -263,13 +263,13 @@ namespace AssetStudio
exportable = true; exportable = true;
break; break;
} }
case ClassIDReference.PlayerSettings: case ClassIDType.PlayerSettings:
{ {
var plSet = new PlayerSettings(asset); var plSet = new PlayerSettings(asset);
productName = plSet.productName; productName = plSet.productName;
break; break;
} }
case ClassIDReference.AssetBundle: case ClassIDType.AssetBundle:
{ {
ab = new AssetBundle(asset); ab = new AssetBundle(asset);
asset.Text = ab.m_Name; asset.Text = ab.m_Name;
@ -341,17 +341,17 @@ namespace AssetStudio
{ {
switch (asset.Type) switch (asset.Type)
{ {
case ClassIDReference.Transform: case ClassIDType.Transform:
{ {
m_GameObject.m_Transform = m_Component; m_GameObject.m_Transform = m_Component;
break; break;
} }
case ClassIDReference.MeshRenderer: case ClassIDType.MeshRenderer:
{ {
m_GameObject.m_MeshRenderer = m_Component; m_GameObject.m_MeshRenderer = m_Component;
break; break;
} }
case ClassIDReference.MeshFilter: case ClassIDType.MeshFilter:
{ {
m_GameObject.m_MeshFilter = m_Component; m_GameObject.m_MeshFilter = m_Component;
if (m_Component.TryGetPD(out var assetPreloadData)) if (m_Component.TryGetPD(out var assetPreloadData))
@ -364,7 +364,7 @@ namespace AssetStudio
} }
break; break;
} }
case ClassIDReference.SkinnedMeshRenderer: case ClassIDType.SkinnedMeshRenderer:
{ {
m_GameObject.m_SkinnedMeshRenderer = m_Component; m_GameObject.m_SkinnedMeshRenderer = m_Component;
if (m_Component.TryGetPD(out var assetPreloadData)) if (m_Component.TryGetPD(out var assetPreloadData))
@ -377,7 +377,7 @@ namespace AssetStudio
} }
break; break;
} }
case ClassIDReference.Animator: case ClassIDType.Animator:
{ {
m_GameObject.m_Animator = m_Component; m_GameObject.m_Animator = m_Component;
asset.Text = m_GameObject.preloadData.Text; asset.Text = m_GameObject.preloadData.Text;
@ -425,19 +425,33 @@ namespace AssetStudio
#region build list of class strucutres #region build list of class strucutres
if (buildClassStructures) if (buildClassStructures)
{ {
//group class structures by versionv
foreach (var assetsFile in assetsfileList) foreach (var assetsFile in assetsfileList)
{ {
if (AllTypeMap.TryGetValue(assetsFile.unityVersion, out var curVer)) 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 else
{ {
AllTypeMap.Add(assetsFile.unityVersion, assetsFile.m_Type.ToDictionary(x => x.Key, y => new TypeItem(y.Key, y.Value))); var items = new SortedDictionary<int, TypeTreeItem>();
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) switch (asset.Type)
{ {
case ClassIDReference.Texture2D: case ClassIDType.Texture2D:
if (ExportTexture2D(asset, exportpath, true)) if (ExportTexture2D(asset, exportpath, true))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.AudioClip: case ClassIDType.AudioClip:
if (ExportAudioClip(asset, exportpath)) if (ExportAudioClip(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.Shader: case ClassIDType.Shader:
if (ExportShader(asset, exportpath)) if (ExportShader(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.TextAsset: case ClassIDType.TextAsset:
if (ExportTextAsset(asset, exportpath)) if (ExportTextAsset(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.MonoBehaviour: case ClassIDType.MonoBehaviour:
if (ExportMonoBehaviour(asset, exportpath)) if (ExportMonoBehaviour(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.Font: case ClassIDType.Font:
if (ExportFont(asset, exportpath)) if (ExportFont(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.Mesh: case ClassIDType.Mesh:
if (ExportMesh(asset, exportpath)) if (ExportMesh(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.VideoClip: case ClassIDType.VideoClip:
if (ExportVideoClip(asset, exportpath)) if (ExportVideoClip(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.MovieTexture: case ClassIDType.MovieTexture:
if (ExportMovieTexture(asset, exportpath)) if (ExportMovieTexture(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.Sprite: case ClassIDType.Sprite:
if (ExportSprite(asset, exportpath)) if (ExportSprite(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.Animator: case ClassIDType.Animator:
if (ExportAnimator(asset, exportpath)) if (ExportAnimator(asset, exportpath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case ClassIDReference.AnimationClip: case ClassIDType.AnimationClip:
break; break;
default: default:
if (ExportRawFile(asset, exportpath)) if (ExportRawFile(asset, exportpath))

View File

@ -6,21 +6,21 @@ using System.Windows.Forms;
namespace AssetStudio namespace AssetStudio
{ {
public class TypeItem : ListViewItem public class TypeTreeItem : ListViewItem
{ {
public List<TypeTreeNode> typeTreeList; public List<TypeTreeNode> m_Nodes;
public TypeItem(int classID, List<TypeTreeNode> typeTreeList) public TypeTreeItem(int typeID, List<TypeTreeNode> m_Nodes)
{ {
this.typeTreeList = typeTreeList; this.m_Nodes = m_Nodes;
Text = typeTreeList[0].m_Type + " " + typeTreeList[0].m_Name; Text = m_Nodes[0].m_Type + " " + m_Nodes[0].m_Name;
SubItems.Add(classID.ToString()); SubItems.Add(typeID.ToString());
} }
public override string ToString() public override string ToString()
{ {
var sb = new StringBuilder(); 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); 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);
} }