From cdfc9cf2e6fb9c3c7b76624e44e0520dcfcd19fe Mon Sep 17 00:00:00 2001 From: Perfare Date: Tue, 19 Sep 2017 01:01:14 +0800 Subject: [PATCH] fixed PlayerSettings in unity 2017.1 split code improve read struct --- Unity Studio/Unity Classes/PlayerSettings.cs | 2 +- Unity Studio/Unity Classes/Shader.cs | 12 +- .../Unity Studio Classes/AssetPreloadData.cs | 122 ----------- .../Unity Studio Classes/AssetsFile.cs | 1 + .../Unity Studio Classes/ClassIDReference.cs | 34 +--- .../Unity Studio Classes/ClassStruct.cs | 192 ++++++++++++++++++ Unity Studio/Unity Studio-x86.csproj | 1 + Unity Studio/Unity Studio.csproj | 1 + 8 files changed, 206 insertions(+), 159 deletions(-) create mode 100644 Unity Studio/Unity Studio Classes/ClassStruct.cs diff --git a/Unity Studio/Unity Classes/PlayerSettings.cs b/Unity Studio/Unity Classes/PlayerSettings.cs index f3aa142..1ce44cf 100644 --- a/Unity Studio/Unity Classes/PlayerSettings.cs +++ b/Unity Studio/Unity Classes/PlayerSettings.cs @@ -39,7 +39,7 @@ namespace Unity_Studio if ((sourceFile.version[0] == 5 && sourceFile.version[1] < 1) || (sourceFile.version[0] == 4 && sourceFile.version[1] == 6 && sourceFile.version[2] >= 3)) { int targetIOSGraphics = a_Stream.ReadInt32(); } - if (sourceFile.version[0] == 5 && (sourceFile.version[1] > 2 || (sourceFile.version[1] == 2 && sourceFile.version[2] >= 1))) + if (sourceFile.version[0] >= 5 || sourceFile.version[0] == 5 && (sourceFile.version[1] > 2 || (sourceFile.version[1] == 2 && sourceFile.version[2] >= 1))) { bool useOnDemandResources = a_Stream.ReadBoolean(); a_Stream.AlignStream(4); } if (sourceFile.version[0] < 5 || (sourceFile.version[0] == 5 && sourceFile.version[1] < 3)) diff --git a/Unity Studio/Unity Classes/Shader.cs b/Unity Studio/Unity Classes/Shader.cs index 9429351..ea40b7d 100644 --- a/Unity Studio/Unity Classes/Shader.cs +++ b/Unity Studio/Unity Classes/Shader.cs @@ -112,6 +112,8 @@ namespace Unity_Studio return decompressedBlob; } var align = (member.Flag & 0x4000) != 0; + if (member.alignBefore) + a_Stream.AlignStream(4); if (varTypeStr == "SInt8")//sbyte { a_Stream.ReadSByte(); @@ -132,7 +134,7 @@ namespace Unity_Studio { a_Stream.ReadInt32(); } - else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int")//UInt32 + else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int" || varTypeStr == "Type*")//UInt32 { a_Stream.ReadUInt32(); } @@ -166,7 +168,7 @@ namespace Unity_Studio if ((members[i - 1].Flag & 0x4000) != 0) align = true; var size = a_Stream.ReadInt32(); - var array = AssetPreloadData.ReadArray(members, level, i); + var array = ClassStructHelper.ReadArray(members, level, i); for (int j = 0; j < size; j++) { ReadSerializedShader(array, a_Stream); @@ -175,7 +177,11 @@ namespace Unity_Studio } else { - align = false; + if (align) + { + align = false; + ClassStructHelper.SetAlignBefore(members, level, i + 1); + } } if (align) a_Stream.AlignStream(4); diff --git a/Unity Studio/Unity Studio Classes/AssetPreloadData.cs b/Unity Studio/Unity Studio Classes/AssetPreloadData.cs index e207b12..4bd58f1 100644 --- a/Unity Studio/Unity Studio Classes/AssetPreloadData.cs +++ b/Unity Studio/Unity Studio Classes/AssetPreloadData.cs @@ -20,127 +20,5 @@ namespace Unity_Studio public AssetsFile sourceFile; public string uniqueID; - - public string ViewStruct() - { - var a_Stream = sourceFile.a_Stream; - a_Stream.Position = Offset; - ClassStruct classStructure; - if (sourceFile.ClassStructures.TryGetValue(Type1, out classStructure)) - { - var member = classStructure.members; - var sb = new StringBuilder(); - Read(sb, member, a_Stream); - return sb.ToString(); - } - return null; - } - - private static void Read(StringBuilder sb, List members, EndianStream a_Stream) - { - for (int i = 0; i < members.Count; i++) - { - var member = members[i]; - var level = member.Level; - var varTypeStr = member.Type; - var varNameStr = member.Name; - object value = null; - var align = (member.Flag & 0x4000) != 0; - var append = true; - if (varTypeStr == "SInt8")//sbyte - { - value = a_Stream.ReadSByte(); - } - else if (varTypeStr == "UInt8")//byte - { - value = a_Stream.ReadByte(); - } - else if (varTypeStr == "short" || varTypeStr == "SInt16")//Int16 - { - value = a_Stream.ReadInt16(); - } - else if (varTypeStr == "UInt16" || varTypeStr == "unsigned short")//UInt16 - { - value = a_Stream.ReadUInt16(); - } - else if (varTypeStr == "int" || varTypeStr == "SInt32")//Int32 - { - value = a_Stream.ReadInt32(); - } - else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int")//UInt32 - { - value = a_Stream.ReadUInt32(); - } - else if (varTypeStr == "long long" || varTypeStr == "SInt64")//Int64 - { - value = a_Stream.ReadInt64(); - } - else if (varTypeStr == "UInt64" || varTypeStr == "unsigned long long")//UInt64 - { - value = a_Stream.ReadUInt64(); - } - else if (varTypeStr == "float")//float - { - value = a_Stream.ReadSingle(); - } - else if (varTypeStr == "double")//double - { - value = a_Stream.ReadDouble(); - } - else if (varTypeStr == "bool")//bool - { - value = a_Stream.ReadBoolean(); - } - else if (varTypeStr == "string")//string - { - append = false; - var str = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); - sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str); - i += 3;//skip - } - else if (varTypeStr == "Array")//Array - { - append = false; - if ((members[i - 1].Flag & 0x4000) != 0) - align = true; - sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); - var size = a_Stream.ReadInt32(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size); - var array = ReadArray(members, level, i); - for (int j = 0; j < size; j++) - { - sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j); - Read(sb, array, a_Stream); - } - i += array.Count + 1;//skip - } - else - { - append = false; - align = false; - sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); - } - if (append) - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - if (align) - a_Stream.AlignStream(4); - } - } - - public static List ReadArray(List members, int level, int index) - { - var member2 = new List(); - for (int i = index + 2; i < members.Count; i++)//skip int size - { - var member = members[i]; - var level2 = member.Level; - if (level2 <= level) - { - return member2; - } - member2.Add(member); - } - return member2; - } } } diff --git a/Unity Studio/Unity Studio Classes/AssetsFile.cs b/Unity Studio/Unity Studio Classes/AssetsFile.cs index d799742..a5bb1f3 100644 --- a/Unity Studio/Unity Studio Classes/AssetsFile.cs +++ b/Unity Studio/Unity Studio Classes/AssetsFile.cs @@ -139,6 +139,7 @@ namespace Unity_Studio {1006, "Vector4f"}, {1015, "m_ScriptingClassIdentifier"}, {1042, "Gradient"}, + {1051, "Type*"} }; #endregion diff --git a/Unity Studio/Unity Studio Classes/ClassIDReference.cs b/Unity Studio/Unity Studio Classes/ClassIDReference.cs index 82f82bc..859d1ab 100644 --- a/Unity Studio/Unity Studio Classes/ClassIDReference.cs +++ b/Unity Studio/Unity Studio Classes/ClassIDReference.cs @@ -1,39 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Forms; +using System.Collections.Generic; namespace Unity_Studio { - public class ClassStruct : ListViewItem - { - public int ID; - public List members; - - public string membersstr - { - get - { - var sb = new StringBuilder(); - foreach (var i in members) - { - sb.AppendFormat("{0}{1} {2} {3}\r\n", (new string('\t', i.Level)), i.Type, i.Name, i.Size); - } - return sb.ToString(); - } - } - } - - public class ClassMember - { - public int Level; - public string Type; - public string Name; - public int Size; - public int Flag; - } - public static class ClassIDReference { public static Dictionary Names = new Dictionary() diff --git a/Unity Studio/Unity Studio Classes/ClassStruct.cs b/Unity Studio/Unity Studio Classes/ClassStruct.cs new file mode 100644 index 0000000..c3963e1 --- /dev/null +++ b/Unity Studio/Unity Studio Classes/ClassStruct.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Unity_Studio +{ + public class ClassMember + { + public int Level; + public string Type; + public string Name; + public int Size; + public int Flag; + + //use for read + public bool alignBefore; + } + + public class ClassStruct : ListViewItem + { + public int ID; + public List members; + + public string membersstr + { + get + { + var sb = new StringBuilder(); + foreach (var i in members) + { + sb.AppendFormat("{0}{1} {2} {3} {4}\r\n", new string('\t', i.Level), i.Type, i.Name, i.Size, (i.Flag & 0x4000) != 0); + } + return sb.ToString(); + } + } + } + + public static class ClassStructHelper + { + public static string ViewStruct(this AssetPreloadData asset) + { + var a_Stream = asset.sourceFile.a_Stream; + a_Stream.Position = asset.Offset; + ClassStruct classStructure; + if (asset.sourceFile.ClassStructures.TryGetValue(asset.Type1, out classStructure)) + { + var sb = new StringBuilder(); + ReadClassStruct(sb, classStructure.members, a_Stream); + return sb.ToString(); + } + return null; + } + + private static void ReadClassStruct(StringBuilder sb, List members, EndianStream a_Stream) + { + for (int i = 0; i < members.Count; i++) + { + var member = members[i]; + var level = member.Level; + var varTypeStr = member.Type; + var varNameStr = member.Name; + object value = null; + var align = (member.Flag & 0x4000) != 0; + var append = true; + if (member.alignBefore) + a_Stream.AlignStream(4); + if (varTypeStr == "SInt8")//sbyte + { + value = a_Stream.ReadSByte(); + } + else if (varTypeStr == "UInt8")//byte + { + value = a_Stream.ReadByte(); + } + else if (varTypeStr == "short" || varTypeStr == "SInt16")//Int16 + { + value = a_Stream.ReadInt16(); + } + else if (varTypeStr == "UInt16" || varTypeStr == "unsigned short")//UInt16 + { + value = a_Stream.ReadUInt16(); + } + else if (varTypeStr == "int" || varTypeStr == "SInt32")//Int32 + { + value = a_Stream.ReadInt32(); + } + else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int" || varTypeStr == "Type*")//UInt32 + { + value = a_Stream.ReadUInt32(); + } + else if (varTypeStr == "long long" || varTypeStr == "SInt64")//Int64 + { + value = a_Stream.ReadInt64(); + } + else if (varTypeStr == "UInt64" || varTypeStr == "unsigned long long")//UInt64 + { + value = a_Stream.ReadUInt64(); + } + else if (varTypeStr == "float")//float + { + value = a_Stream.ReadSingle(); + } + else if (varTypeStr == "double")//double + { + value = a_Stream.ReadDouble(); + } + else if (varTypeStr == "bool")//bool + { + value = a_Stream.ReadBoolean(); + } + else if (varTypeStr == "string")//string + { + append = false; + var str = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str); + i += 3;//skip + } + else if (varTypeStr == "Array")//Array + { + append = false; + if ((members[i - 1].Flag & 0x4000) != 0) + align = true; + sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); + var size = a_Stream.ReadInt32(); + sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size); + var array = ReadArray(members, level, i); + for (int j = 0; j < size; j++) + { + sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j); + ReadClassStruct(sb, array, a_Stream); + } + i += array.Count + 1;//skip + } + else if (varTypeStr == "TypelessData") + { + append = false; + var size = a_Stream.ReadInt32(); + a_Stream.ReadBytes(size); + i += 2; + sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); + sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size); + } + else + { + append = false; + if (align) + { + align = false; + SetAlignBefore(members, level, i + 1); + } + sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); + } + if (append) + sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); + if (align) + a_Stream.AlignStream(4); + } + } + + public static List ReadArray(List members, int level, int index) + { + var member2 = new List(); + for (int i = index + 2; i < members.Count; i++)//skip int size + { + var member = members[i]; + var level2 = member.Level; + if (level2 <= level) + { + return member2; + } + member2.Add(member); + } + return member2; + } + + public static void SetAlignBefore(List members, int level, int index) + { + for (int i = index; i < members.Count; i++) + { + var member = members[i]; + var level2 = member.Level; + if (level2 <= level) + { + member.alignBefore = true; + return; + } + } + } + } +} diff --git a/Unity Studio/Unity Studio-x86.csproj b/Unity Studio/Unity Studio-x86.csproj index 92ad086..2fdb8f0 100644 --- a/Unity Studio/Unity Studio-x86.csproj +++ b/Unity Studio/Unity Studio-x86.csproj @@ -151,6 +151,7 @@ + diff --git a/Unity Studio/Unity Studio.csproj b/Unity Studio/Unity Studio.csproj index 0cb5250..b7f9b35 100644 --- a/Unity Studio/Unity Studio.csproj +++ b/Unity Studio/Unity Studio.csproj @@ -151,6 +151,7 @@ +