mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-27 22:00:23 -04:00
improve ClassStruct read and parse
This commit is contained in:
parent
3b7b88be57
commit
7456f9b106
@ -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);
|
||||
}
|
||||
|
@ -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";
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user