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() };
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 List<int[]> classIDs = new List<int[]>();//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<ClassMember>();
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<ClassMember> 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<ClassMember>();
//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);
}

View File

@ -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<ClassMember> 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";

View File

@ -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<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 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<ClassMember> ReadArray(List<ClassMember> members, int level, int index)
{
List<string> strs3 = new List<string>();
for (int i = index + 2; i < strs.Length; i++)//skip int size
var member2 = new List<ClassMember>();
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;
}
}
}

View File

@ -41,7 +41,7 @@ namespace Unity_Studio
private string[] fileTypes = new string[] { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" };
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.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<int, ClassStrStruct> curVer;
SortedDictionary<int, ClassStruct> 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;
}
}