From 7456f9b106aaf5cb792eca8b623c146a1383dc3f Mon Sep 17 00:00:00 2001 From: Perfare Date: Wed, 25 Jan 2017 19:38:44 +0800 Subject: [PATCH] improve ClassStruct read and parse --- Unity Studio/AssetsFile.cs | 30 ++++++++++------ Unity Studio/ClassIDReference.cs | 28 ++++++++++++--- Unity Studio/Unity Classes/MonoBehaviour.cs | 39 ++++++++++----------- Unity Studio/UnityStudioForm.cs | 8 ++--- 4 files changed, 67 insertions(+), 38 deletions(-) diff --git a/Unity Studio/AssetsFile.cs b/Unity Studio/AssetsFile.cs index 5a2becb..3bc5c8b 100644 --- a/Unity Studio/AssetsFile.cs +++ b/Unity Studio/AssetsFile.cs @@ -26,7 +26,7 @@ namespace Unity_Studio public List sharedAssetsList = new List() { new UnityShared() }; private ClassIDReference UnityClassID = new ClassIDReference(); - public SortedDictionary ClassStructures = new SortedDictionary(); + public SortedDictionary ClassStructures = new SortedDictionary(); private bool baseDefinitions = false; private List classIDs = new List();//use for 5.5.0 @@ -136,10 +136,10 @@ namespace Unity_Studio a_Stream.Position += 20; int memberCount = a_Stream.ReadInt32(); - StringBuilder cb = new StringBuilder(); + var cb = new List(); for (int m = 0; m < memberCount; m++) { readBase(cb, 1); } - var aClass = new ClassStrStruct() { ID = classID, Text = (baseType + " " + baseName), members = cb.ToString() }; + var aClass = new ClassStruct() { ID = classID, Text = (baseType + " " + baseName), members = cb }; aClass.SubItems.Add(classID.ToString()); ClassStructures.Add(classID, aClass); } @@ -246,7 +246,7 @@ namespace Unity_Studio } } - private void readBase(StringBuilder cb, int level) + private void readBase(List cb, int level) { string varType = a_Stream.ReadStringToNull(); string varName = a_Stream.ReadStringToNull(); @@ -260,7 +260,13 @@ namespace Unity_Studio int childrenCount = a_Stream.ReadInt32(); //Debug.WriteLine(baseFormat + " " + baseName + " " + childrenCount); - cb.AppendFormat("{0}{1} {2} {3}\r\n", (new string('\t', level)), varType, varName, size); + cb.Add(new ClassMember() + { + Level = level - 1, + Type = varType, + Name = varName, + Size = size + }); for (int i = 0; i < childrenCount; i++) { readBase(cb, level + 1); } } @@ -397,8 +403,7 @@ namespace Unity_Studio a_Stream.Position += varCount * 24; string varStrings = Encoding.UTF8.GetString(a_Stream.ReadBytes(stringSize)); string className = ""; - var classVarStr = new StringBuilder(); - var classVarStr2 = new StringBuilder();//用来export + var classVar = new List(); //build Class Structures a_Stream.Position -= varCount * 24 + stringSize; for (int i = 0; i < varCount; i++) @@ -428,8 +433,13 @@ namespace Unity_Studio if (index == 0) { className = varTypeStr + " " + varNameStr; } else { - classVarStr.AppendFormat("{0}{1} {2} {3}\r\n", (new string('\t', level - 1)), varTypeStr, varNameStr, size); - classVarStr2.AppendFormat("{0}\t{1}\t{2}\r\n", level - 1, varTypeStr, varNameStr); + classVar.Add(new ClassMember() + { + Level = level - 1, + Type = varTypeStr, + Name = varNameStr, + Size = size + }); } //for (int t = 0; t < level; t++) { Debug.Write("\t"); } @@ -437,7 +447,7 @@ namespace Unity_Studio } a_Stream.Position += stringSize; - var aClass = new ClassStrStruct() { ID = classID, Text = className, members = classVarStr.ToString(), members2 = classVarStr2.ToString() }; + var aClass = new ClassStruct() { ID = classID, Text = className, members = classVar }; aClass.SubItems.Add(classID.ToString()); ClassStructures.Add(classID, aClass); } diff --git a/Unity Studio/ClassIDReference.cs b/Unity Studio/ClassIDReference.cs index c04cf38..990a059 100644 --- a/Unity Studio/ClassIDReference.cs +++ b/Unity Studio/ClassIDReference.cs @@ -6,17 +6,37 @@ using System.Windows.Forms; namespace Unity_Studio { - public class ClassStrStruct : ListViewItem + public class ClassStruct : ListViewItem { public int ID; - public string members; - public string members2; + 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 class ClassIDReference { public string[] Names = new string[1121]; - + public ClassIDReference() { Names[1] = "GameObject"; diff --git a/Unity Studio/Unity Classes/MonoBehaviour.cs b/Unity Studio/Unity Classes/MonoBehaviour.cs index b95ffee..41f204c 100644 --- a/Unity Studio/Unity Classes/MonoBehaviour.cs +++ b/Unity Studio/Unity Classes/MonoBehaviour.cs @@ -24,13 +24,12 @@ namespace Unity_Studio { preloadData.extension = ".txt"; a_Stream.Position = preloadData.Offset; - ClassStrStruct classStructure; + ClassStruct classStructure; if (sourceFile.ClassStructures.TryGetValue(preloadData.Type1, out classStructure)) { - var member = classStructure.members2; - var strs = member.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + var member = classStructure.members; var sb = new StringBuilder(); - Read(sb, strs, a_Stream); + Read(sb, member, a_Stream); serializedText = sb.ToString(); } else @@ -60,14 +59,14 @@ namespace Unity_Studio } } - private void Read(StringBuilder sb, string[] strs, EndianStream a_Stream) + private void Read(StringBuilder sb, List members, EndianStream a_Stream) { - for (int i = 0; i < strs.Length; i++) + for (int i = 0; i < members.Count; i++) { - var strs2 = strs[i].Split('\t'); - var level = int.Parse(strs2[0]); - var varTypeStr = strs2[1]; - var varNameStr = strs2[2]; + var member = members[i]; + var level = member.Level; + var varTypeStr = member.Type; + var varNameStr = member.Name; if (varTypeStr == "SInt8")//sbyte { var value = a_Stream.ReadSByte(); @@ -145,13 +144,13 @@ namespace Unity_Studio 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(strs, level, i); + 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.Length + 1;//skip + i += array.Count + 1;//skip } else { @@ -160,23 +159,23 @@ namespace Unity_Studio } } - private string[] ReadArray(string[] strs, int level, int index) + private List ReadArray(List members, int level, int index) { - List strs3 = new List(); - for (int i = index + 2; i < strs.Length; i++)//skip int size + var member2 = new List(); + for (int i = index + 2; i < members.Count; i++)//skip int size { - var strs2 = strs[i].Split('\t'); - var level2 = int.Parse(strs2[0]); + var member = members[i]; + var level2 = member.Level; if (level2 <= level) { - return strs3.ToArray(); + return member2; } else { - strs3.Add(strs[i]); + member2.Add(member); } } - return strs3.ToArray(); + return member2; } } } diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index b1629e6..f57440d 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -41,7 +41,7 @@ namespace Unity_Studio private string[] fileTypes = new string[] { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" }; Dictionary> jsonMats; - Dictionary> AllClassStructures = new Dictionary>(); + Dictionary> AllClassStructures = new Dictionary>(); private FMOD.System system = null; private FMOD.Sound sound = null; @@ -533,7 +533,7 @@ namespace Unity_Studio string saveFile = versionPath + "\\" + uclass.Key + " " + uclass.Value.Text + ".txt"; using (StreamWriter TXTwriter = new StreamWriter(saveFile)) { - TXTwriter.Write(uclass.Value.members); + TXTwriter.Write(uclass.Value.membersstr); } } } @@ -858,7 +858,7 @@ namespace Unity_Studio //group class structures by versionv foreach (var assetsFile in assetsfileList) { - SortedDictionary curVer; + SortedDictionary curVer; if (AllClassStructures.TryGetValue(assetsFile.m_Version, out curVer)) { foreach (var uClass in assetsFile.ClassStructures) @@ -1178,7 +1178,7 @@ namespace Unity_Studio { if (e.IsSelected) { - classTextBox.Text = ((ClassStrStruct)classesListView.SelectedItems[0]).members; + classTextBox.Text = ((ClassStruct)classesListView.SelectedItems[0]).membersstr; } }