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\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" />

View File

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

View File

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

View File

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

View File

@ -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,

View File

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

View File

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

View File

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

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

View File

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