mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
continue work
This commit is contained in:
parent
40b191f039
commit
17bd7a210a
@ -181,6 +181,7 @@
|
||||
<Compile Include="StudioClasses\LocalSerializedObjectIdentifier.cs" />
|
||||
<Compile Include="StudioClasses\ObjectInfo.cs" />
|
||||
<Compile Include="StudioClasses\SerializedFileHeader.cs" />
|
||||
<Compile Include="StudioClasses\SerializedType.cs" />
|
||||
<Compile Include="StudioClasses\SevenZipHelper.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
@ -194,7 +195,7 @@
|
||||
<Compile Include="StudioClasses\BinaryReaderExtensions.cs" />
|
||||
<Compile Include="StudioClasses\BinaryWriterExtensions.cs" />
|
||||
<Compile Include="StudioClasses\BuildTarget.cs" />
|
||||
<Compile Include="StudioClasses\ClassIDReference.cs" />
|
||||
<Compile Include="StudioClasses\ClassIDType.cs" />
|
||||
<Compile Include="StudioClasses\TypeTreeNode.cs" />
|
||||
<Compile Include="StudioClasses\TypeTreeHelper.cs" />
|
||||
<Compile Include="StudioClasses\ResourcesHelper.cs" />
|
||||
@ -207,7 +208,7 @@
|
||||
<Compile Include="Classes\AudioClip.cs" />
|
||||
<Compile Include="Classes\BuildSettings.cs" />
|
||||
<Compile Include="StudioClasses\BundleFile.cs" />
|
||||
<Compile Include="StudioClasses\TypeItem.cs" />
|
||||
<Compile Include="StudioClasses\TypeTreeItem.cs" />
|
||||
<Compile Include="StudioClasses\FBXExporter.cs" />
|
||||
<Compile Include="StudioClasses\SpriteHelper.cs" />
|
||||
<Compile Include="StudioClasses\Exporter.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<ClassIDReference>();
|
||||
var show = new List<ClassIDType>();
|
||||
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));
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<int, List<TypeTreeNode>> m_Type = new SortedDictionary<int, List<TypeTreeNode>>();
|
||||
private List<int[]> classIDs = new List<int[]>();
|
||||
private bool m_EnableTypeTree = true;
|
||||
public List<SerializedType> m_Types;
|
||||
public Dictionary<long, ObjectInfo> m_Objects;
|
||||
private List<LocalSerializedObjectIdentifier> m_ScriptTypes;
|
||||
public List<FileIdentifier> m_Externals;
|
||||
@ -86,19 +85,10 @@ namespace AssetStudio
|
||||
|
||||
//Read types
|
||||
int typeCount = reader.ReadInt32();
|
||||
m_Types = new List<SerializedType>(typeCount);
|
||||
for (int i = 0; i < typeCount; i++)
|
||||
{
|
||||
if (header.m_Version < 13)
|
||||
{
|
||||
int classID = reader.ReadInt32();
|
||||
var typeTreeList = new List<TypeTreeNode>();
|
||||
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<TypeTreeNode> 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<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)
|
||||
{
|
||||
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<TypeTreeNode> 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<TypeTreeNode>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
17
AssetStudio/StudioClasses/SerializedType.cs
Normal file
17
AssetStudio/StudioClasses/SerializedType.cs
Normal 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
|
||||
}
|
||||
}
|
@ -20,7 +20,7 @@ namespace AssetStudio
|
||||
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
|
||||
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 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<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)
|
||||
{
|
||||
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))
|
||||
|
@ -6,21 +6,21 @@ using System.Windows.Forms;
|
||||
|
||||
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;
|
||||
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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user