This commit is contained in:
Perfare 2018-08-05 20:03:54 +08:00
parent cdaeb36e06
commit 0c23548817

View File

@ -830,10 +830,10 @@ namespace AssetStudio
{ {
var typeDef = typeSig.ToTypeDefOrRef().ResolveTypeDefThrow(); var typeDef = typeSig.ToTypeDefOrRef().ResolveTypeDefThrow();
var reader = assetsFile.reader; var reader = assetsFile.reader;
if (typeDef.IsPrimitive) if (typeSig.IsPrimitive)
{ {
object value = null; object value = null;
switch (typeDef.Name) switch (typeSig.TypeName)
{ {
case "Boolean": case "Boolean":
value = reader.ReadBoolean(); value = reader.ReadBoolean();
@ -868,23 +868,33 @@ namespace AssetStudio
case "Double": case "Double":
value = reader.ReadDouble(); value = reader.ReadDouble();
break; break;
case "Char":
value = reader.ReadChar();
break;
} }
reader.AlignStream(4); reader.AlignStream(4);
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {value}"); sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {value}");
return; return;
} }
if (typeDef.FullName == "System.String") if (typeSig.FullName == "System.String")
{ {
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = \"{reader.ReadAlignedString()}\""); sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = \"{reader.ReadAlignedString()}\"");
return; return;
} }
if (typeDef.IsEnum) if (typeSig.FullName == "System.Object")
{
return;
}
if (typeDef.IsDelegate)
{ {
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {reader.ReadUInt32()}");
return; return;
} }
if (typeSig is ArraySigBase) if (typeSig is ArraySigBase)
{ {
if (!typeDef.IsEnum && !IsBaseType(typeDef) && !IsAssignFromUnityObject(typeDef) && !IsEngineType(typeDef) && !typeDef.IsSerializable)
{
return;
}
var size = reader.ReadInt32(); var size = reader.ReadInt32();
sb.AppendLine($"{new string('\t', indent)}{typeSig.TypeName} {name}"); sb.AppendLine($"{new string('\t', indent)}{typeSig.TypeName} {name}");
sb.AppendLine($"{new string('\t', indent + 1)}Array Array"); sb.AppendLine($"{new string('\t', indent + 1)}Array Array");
@ -898,58 +908,81 @@ namespace AssetStudio
} }
if (!isRoot && typeSig is GenericInstSig genericInstSig) if (!isRoot && typeSig is GenericInstSig genericInstSig)
{ {
var size = reader.ReadInt32(); if (genericInstSig.GenericArguments.Count == 1)
sb.AppendLine($"{new string('\t', indent)}{typeSig.TypeName} {name}");
sb.AppendLine($"{new string('\t', indent + 1)}Array Array");
sb.AppendLine($"{new string('\t', indent + 1)}int size = {size}");
if (genericInstSig.GenericArguments.Count == 1) //vector
{ {
var type = genericInstSig.GenericArguments[0].ToTypeDefOrRef().ResolveTypeDefThrow();
if (!type.IsEnum && !IsBaseType(type) && !IsAssignFromUnityObject(type) && !IsEngineType(type) && !type.IsSerializable)
{
return;
}
var size = reader.ReadInt32();
sb.AppendLine($"{new string('\t', indent)}{typeSig.TypeName} {name}");
sb.AppendLine($"{new string('\t', indent + 1)}Array Array");
sb.AppendLine($"{new string('\t', indent + 1)}int size = {size}");
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
sb.AppendLine($"{new string('\t', indent + 2)}[{i}]"); sb.AppendLine($"{new string('\t', indent + 2)}[{i}]");
DumpType(genericInstSig.GenericArguments[0], sb, assetsFile, "data", indent + 2); DumpType(genericInstSig.GenericArguments[0], sb, assetsFile, "data", indent + 2);
} }
} }
else if (genericInstSig.GenericArguments.Count == 2) //map
{
for (int i = 0; i < size; i++)
{
sb.AppendLine($"{new string('\t', indent + 2)}[{i}]");
DumpType(genericInstSig.GenericArguments[0], sb, assetsFile, "first", indent + 2);
DumpType(genericInstSig.GenericArguments[1], sb, assetsFile, "second", indent + 2);
}
}
return; return;
} }
if (indent != -1 && typeDef.FullName == "UnityEngine.Object") if (indent != -1 && IsAssignFromUnityObject(typeDef))
{ {
var pptr = assetsFile.ReadPPtr(); var pptr = assetsFile.ReadPPtr();
sb.AppendLine($"{new string('\t', indent)}PPtr<{typeDef.Name}> {name} = {{fileID: {pptr.m_FileID}, pathID: {pptr.m_PathID}}}"); sb.AppendLine($"{new string('\t', indent)}PPtr<{typeDef.Name}> {name} = {{fileID: {pptr.m_FileID}, pathID: {pptr.m_PathID}}}");
return; return;
} }
if (indent != -1 && typeDef.BaseType != null && typeDef.BaseType.FullName != "System.Object") if (typeDef.IsEnum)
{ {
var flag = false; sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {reader.ReadUInt32()}");
var type = typeDef; return;
while (true) }
{ if (indent != -1 && !IsEngineType(typeDef) && !typeDef.IsSerializable)
if (type.BaseType.FullName == "UnityEngine.Object") {
{ return;
flag = true; }
break; if (typeDef.FullName == "UnityEngine.Rect")
} {
type = type.BaseType.ResolveTypeDefThrow(); sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}");
if (type.BaseType == null) var rect = reader.ReadSingleArray(4);
{ return;
break; }
} if (typeDef.FullName == "UnityEngine.LayerMask")
} {
if (flag) sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}");
{ var value = reader.ReadInt32();
var pptr = assetsFile.ReadPPtr(); return;
sb.AppendLine($"{new string('\t', indent)}PPtr<{typeDef.Name}> {name} = {{fileID: {pptr.m_FileID}, pathID: {pptr.m_PathID}}}"); }
return; if (typeDef.FullName == "UnityEngine.AnimationCurve")
} {
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}");
var animationCurve = new AnimationCurve<float>(reader, reader.ReadSingle, assetsFile.version);
return;
}
if (typeDef.FullName == "UnityEngine.Gradient")
{
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}");
if (assetsFile.version[0] == 5 && assetsFile.version[1] < 5)
reader.Position += 68;
else if (assetsFile.version[0] == 5 && assetsFile.version[1] < 6)
reader.Position += 72;
else
reader.Position += 168;
return;
}
if (typeDef.FullName == "UnityEngine.RectOffset")
{
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}");
var left = reader.ReadSingle();
var right = reader.ReadSingle();
var top = reader.ReadSingle();
var bottom = reader.ReadSingle();
return;
}
if (typeDef.FullName == "UnityEngine.GUIStyle") //TODO
{
return;
} }
if (typeDef.IsClass || typeDef.IsValueType) if (typeDef.IsClass || typeDef.IsValueType)
{ {
@ -965,10 +998,6 @@ namespace AssetStudio
{ {
DumpType(typeDef.BaseType.ToTypeSig(), sb, assetsFile, null, indent, true); DumpType(typeDef.BaseType.ToTypeSig(), sb, assetsFile, null, indent, true);
} }
/*if (typeDef.FullName == "UnityEngine.AnimationCurve") //TODO
{
var AnimationCurve = new AnimationCurve<float>(reader, reader.ReadSingle, assetsFile.version);
}*/
foreach (var fieldDef in typeDef.Fields) foreach (var fieldDef in typeDef.Fields)
{ {
var access = fieldDef.Access & FieldAttributes.FieldAccessMask; var access = fieldDef.Access & FieldAttributes.FieldAccessMask;
@ -979,12 +1008,85 @@ namespace AssetStudio
DumpType(fieldDef.FieldType, sb, assetsFile, fieldDef.Name, indent + 1); DumpType(fieldDef.FieldType, sb, assetsFile, fieldDef.Name, indent + 1);
} }
} }
else if ((fieldDef.Attributes & FieldAttributes.Static) == 0 && (fieldDef.Attributes & FieldAttributes.InitOnly) == 0) else if ((fieldDef.Attributes & FieldAttributes.Static) == 0 && (fieldDef.Attributes & FieldAttributes.InitOnly) == 0 && (fieldDef.Attributes & FieldAttributes.NotSerialized) == 0)
{ {
DumpType(fieldDef.FieldType, sb, assetsFile, fieldDef.Name, indent + 1); DumpType(fieldDef.FieldType, sb, assetsFile, fieldDef.Name, indent + 1);
} }
} }
} }
} }
private static bool IsAssignFromUnityObject(TypeDef typeDef)
{
if (typeDef.FullName == "UnityEngine.Object")
{
return true;
}
if (typeDef.BaseType != null)
{
if (typeDef.BaseType.FullName == "UnityEngine.Object")
{
return true;
}
while (true)
{
typeDef = typeDef.BaseType.ResolveTypeDefThrow();
if (typeDef.BaseType == null)
{
break;
}
if (typeDef.BaseType.FullName == "UnityEngine.Object")
{
return true;
}
}
}
return false;
}
private static bool IsBaseType(IFullName typeDef)
{
switch (typeDef.FullName)
{
case "System.Boolean":
case "System.Byte":
case "System.SByte":
case "System.Int16":
case "System.UInt16":
case "System.Int32":
case "System.UInt32":
case "System.Int64":
case "System.UInt64":
case "System.Single":
case "System.Double":
case "System.String":
return true;
default:
return false;
}
}
private static bool IsEngineType(IFullName typeDef)
{
switch (typeDef.FullName)
{
case "UnityEngine.Vector2":
case "UnityEngine.Vector3":
case "UnityEngine.Vector4":
case "UnityEngine.Rect":
case "UnityEngine.Quaternion":
case "UnityEngine.Matrix4x4":
case "UnityEngine.Color":
case "UnityEngine.Color32":
case "UnityEngine.LayerMask":
case "UnityEngine.AnimationCurve":
case "UnityEngine.Gradient":
case "UnityEngine.RectOffset":
case "UnityEngine.GUIStyle":
return true;
default:
return false;
}
}
} }
} }