improve ClassStruct read and parse

This commit is contained in:
Perfare 2017-01-25 19:38:44 +08:00
parent 3b7b88be57
commit 7456f9b106
4 changed files with 67 additions and 38 deletions

View File

@ -26,7 +26,7 @@ namespace Unity_Studio
public List<UnityShared> sharedAssetsList = new List<UnityShared>() { new UnityShared() }; public List<UnityShared> sharedAssetsList = new List<UnityShared>() { new UnityShared() };
private ClassIDReference UnityClassID = new ClassIDReference(); private ClassIDReference UnityClassID = new ClassIDReference();
public SortedDictionary<int, ClassStrStruct> ClassStructures = new SortedDictionary<int, ClassStrStruct>(); public SortedDictionary<int, ClassStruct> ClassStructures = new SortedDictionary<int, ClassStruct>();
private bool baseDefinitions = false; private bool baseDefinitions = false;
private List<int[]> classIDs = new List<int[]>();//use for 5.5.0 private List<int[]> classIDs = new List<int[]>();//use for 5.5.0
@ -136,10 +136,10 @@ namespace Unity_Studio
a_Stream.Position += 20; a_Stream.Position += 20;
int memberCount = a_Stream.ReadInt32(); int memberCount = a_Stream.ReadInt32();
StringBuilder cb = new StringBuilder(); var cb = new List<ClassMember>();
for (int m = 0; m < memberCount; m++) { readBase(cb, 1); } 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()); aClass.SubItems.Add(classID.ToString());
ClassStructures.Add(classID, aClass); ClassStructures.Add(classID, aClass);
} }
@ -246,7 +246,7 @@ namespace Unity_Studio
} }
} }
private void readBase(StringBuilder cb, int level) private void readBase(List<ClassMember> cb, int level)
{ {
string varType = a_Stream.ReadStringToNull(); string varType = a_Stream.ReadStringToNull();
string varName = a_Stream.ReadStringToNull(); string varName = a_Stream.ReadStringToNull();
@ -260,7 +260,13 @@ namespace Unity_Studio
int childrenCount = a_Stream.ReadInt32(); int childrenCount = a_Stream.ReadInt32();
//Debug.WriteLine(baseFormat + " " + baseName + " " + childrenCount); //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); } for (int i = 0; i < childrenCount; i++) { readBase(cb, level + 1); }
} }
@ -397,8 +403,7 @@ namespace Unity_Studio
a_Stream.Position += varCount * 24; a_Stream.Position += varCount * 24;
string varStrings = Encoding.UTF8.GetString(a_Stream.ReadBytes(stringSize)); string varStrings = Encoding.UTF8.GetString(a_Stream.ReadBytes(stringSize));
string className = ""; string className = "";
var classVarStr = new StringBuilder(); var classVar = new List<ClassMember>();
var classVarStr2 = new StringBuilder();//用来export
//build Class Structures //build Class Structures
a_Stream.Position -= varCount * 24 + stringSize; a_Stream.Position -= varCount * 24 + stringSize;
for (int i = 0; i < varCount; i++) for (int i = 0; i < varCount; i++)
@ -428,8 +433,13 @@ namespace Unity_Studio
if (index == 0) { className = varTypeStr + " " + varNameStr; } if (index == 0) { className = varTypeStr + " " + varNameStr; }
else else
{ {
classVarStr.AppendFormat("{0}{1} {2} {3}\r\n", (new string('\t', level - 1)), varTypeStr, varNameStr, size); classVar.Add(new ClassMember()
classVarStr2.AppendFormat("{0}\t{1}\t{2}\r\n", level - 1, varTypeStr, varNameStr); {
Level = level - 1,
Type = varTypeStr,
Name = varNameStr,
Size = size
});
} }
//for (int t = 0; t < level; t++) { Debug.Write("\t"); } //for (int t = 0; t < level; t++) { Debug.Write("\t"); }
@ -437,7 +447,7 @@ namespace Unity_Studio
} }
a_Stream.Position += stringSize; 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()); aClass.SubItems.Add(classID.ToString());
ClassStructures.Add(classID, aClass); ClassStructures.Add(classID, aClass);
} }

View File

@ -6,17 +6,37 @@ using System.Windows.Forms;
namespace Unity_Studio namespace Unity_Studio
{ {
public class ClassStrStruct : ListViewItem public class ClassStruct : ListViewItem
{ {
public int ID; public int ID;
public string members; public List<ClassMember> members;
public string members2;
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 class ClassIDReference
{ {
public string[] Names = new string[1121]; public string[] Names = new string[1121];
public ClassIDReference() public ClassIDReference()
{ {
Names[1] = "GameObject"; Names[1] = "GameObject";

View File

@ -24,13 +24,12 @@ namespace Unity_Studio
{ {
preloadData.extension = ".txt"; preloadData.extension = ".txt";
a_Stream.Position = preloadData.Offset; a_Stream.Position = preloadData.Offset;
ClassStrStruct classStructure; ClassStruct classStructure;
if (sourceFile.ClassStructures.TryGetValue(preloadData.Type1, out classStructure)) if (sourceFile.ClassStructures.TryGetValue(preloadData.Type1, out classStructure))
{ {
var member = classStructure.members2; var member = classStructure.members;
var strs = member.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
var sb = new StringBuilder(); var sb = new StringBuilder();
Read(sb, strs, a_Stream); Read(sb, member, a_Stream);
serializedText = sb.ToString(); serializedText = sb.ToString();
} }
else else
@ -60,14 +59,14 @@ namespace Unity_Studio
} }
} }
private void Read(StringBuilder sb, string[] strs, EndianStream a_Stream) private void Read(StringBuilder sb, List<ClassMember> 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 member = members[i];
var level = int.Parse(strs2[0]); var level = member.Level;
var varTypeStr = strs2[1]; var varTypeStr = member.Type;
var varNameStr = strs2[2]; var varNameStr = member.Name;
if (varTypeStr == "SInt8")//sbyte if (varTypeStr == "SInt8")//sbyte
{ {
var value = a_Stream.ReadSByte(); 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); sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
var size = a_Stream.ReadInt32(); var size = a_Stream.ReadInt32();
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size); 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++) for (int j = 0; j < size; j++)
{ {
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j); sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j);
Read(sb, array, a_Stream); Read(sb, array, a_Stream);
} }
i += array.Length + 1;//skip i += array.Count + 1;//skip
} }
else else
{ {
@ -160,23 +159,23 @@ namespace Unity_Studio
} }
} }
private string[] ReadArray(string[] strs, int level, int index) private List<ClassMember> ReadArray(List<ClassMember> members, int level, int index)
{ {
List<string> strs3 = new List<string>(); var member2 = new List<ClassMember>();
for (int i = index + 2; i < strs.Length; i++)//skip int size for (int i = index + 2; i < members.Count; i++)//skip int size
{ {
var strs2 = strs[i].Split('\t'); var member = members[i];
var level2 = int.Parse(strs2[0]); var level2 = member.Level;
if (level2 <= level) if (level2 <= level)
{ {
return strs3.ToArray(); return member2;
} }
else else
{ {
strs3.Add(strs[i]); member2.Add(member);
} }
} }
return strs3.ToArray(); return member2;
} }
} }
} }

View File

@ -41,7 +41,7 @@ namespace Unity_Studio
private string[] fileTypes = new string[] { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" }; private string[] fileTypes = new string[] { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" };
Dictionary<string, Dictionary<string, string>> jsonMats; Dictionary<string, Dictionary<string, string>> jsonMats;
Dictionary<string, SortedDictionary<int, ClassStrStruct>> AllClassStructures = new Dictionary<string, SortedDictionary<int, ClassStrStruct>>(); Dictionary<string, SortedDictionary<int, ClassStruct>> AllClassStructures = new Dictionary<string, SortedDictionary<int, ClassStruct>>();
private FMOD.System system = null; private FMOD.System system = null;
private FMOD.Sound sound = null; private FMOD.Sound sound = null;
@ -533,7 +533,7 @@ namespace Unity_Studio
string saveFile = versionPath + "\\" + uclass.Key + " " + uclass.Value.Text + ".txt"; string saveFile = versionPath + "\\" + uclass.Key + " " + uclass.Value.Text + ".txt";
using (StreamWriter TXTwriter = new StreamWriter(saveFile)) 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 //group class structures by versionv
foreach (var assetsFile in assetsfileList) foreach (var assetsFile in assetsfileList)
{ {
SortedDictionary<int, ClassStrStruct> curVer; SortedDictionary<int, ClassStruct> curVer;
if (AllClassStructures.TryGetValue(assetsFile.m_Version, out curVer)) if (AllClassStructures.TryGetValue(assetsFile.m_Version, out curVer))
{ {
foreach (var uClass in assetsFile.ClassStructures) foreach (var uClass in assetsFile.ClassStructures)
@ -1178,7 +1178,7 @@ namespace Unity_Studio
{ {
if (e.IsSelected) if (e.IsSelected)
{ {
classTextBox.Text = ((ClassStrStruct)classesListView.SelectedItems[0]).members; classTextBox.Text = ((ClassStruct)classesListView.SelectedItems[0]).membersstr;
} }
} }