This commit is contained in:
Perfare
2018-09-27 01:15:37 +08:00
parent 250856598b
commit 767e4d0bf6
50 changed files with 1802 additions and 2210 deletions

View File

@@ -25,6 +25,8 @@ namespace AssetStudio
public static string productName = "";
public static bool moduleLoaded;
public static Dictionary<string, ModuleDef> LoadedModuleDic = new Dictionary<string, ModuleDef>();
public static List<GameObjectTreeNode> treeNodeCollection = new List<GameObjectTreeNode>();
public static Dictionary<GameObject, GameObjectTreeNode> treeNodeDictionary = new Dictionary<GameObject, GameObjectTreeNode>();
//UI
public static Action<int> SetProgressBarValue;
@@ -153,10 +155,8 @@ namespace AssetStudio
return extractedCount;
}
public static void BuildAssetStructures(bool loadAssets, bool displayAll, bool buildHierarchy, bool buildClassStructures, bool displayOriginalName, out List<GameObject> fileNodes)
public static void BuildAssetStructures(bool loadAssets, bool displayAll, bool buildHierarchy, bool buildClassStructures, bool displayOriginalName)
{
fileNodes = null;
#region first loop - read asset data & create list
if (loadAssets)
{
@@ -180,43 +180,52 @@ namespace AssetStudio
{
case ClassIDReference.GameObject:
{
GameObject m_GameObject = new GameObject(asset);
var m_GameObject = new GameObject(asset);
asset.Text = m_GameObject.m_Name;
assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject);
break;
}
case ClassIDReference.Transform:
{
Transform m_Transform = new Transform(asset);
var m_Transform = new Transform(asset);
assetsFile.TransformList.Add(asset.m_PathID, m_Transform);
break;
}
case ClassIDReference.RectTransform:
{
RectTransform m_Rect = new RectTransform(asset);
assetsFile.TransformList.Add(asset.m_PathID, m_Rect.m_Transform);
var m_Rect = new RectTransform(asset);
assetsFile.TransformList.Add(asset.m_PathID, m_Rect);
break;
}
case ClassIDReference.Texture2D:
{
Texture2D m_Texture2D = new Texture2D(asset, false);
exportable = true;
break;
}
case ClassIDReference.Mesh:
case ClassIDReference.Shader:
{
Shader m_Shader = new Shader(asset, false);
exportable = true;
break;
}
case ClassIDReference.TextAsset:
case ClassIDReference.AnimationClip:
case ClassIDReference.AudioClip:
case ClassIDReference.Font:
case ClassIDReference.MovieTexture:
case ClassIDReference.Sprite:
case ClassIDReference.VideoClip:
{
TextAsset m_TextAsset = new TextAsset(asset, false);
var obj = new NamedObject(asset);
asset.Text = obj.m_Name;
exportable = true;
break;
}
case ClassIDReference.AudioClip:
case ClassIDReference.Avatar:
case ClassIDReference.AnimatorController:
case ClassIDReference.AnimatorOverrideController:
case ClassIDReference.Material:
case ClassIDReference.MonoScript:
case ClassIDReference.SpriteAtlas:
{
var obj = new NamedObject(asset);
asset.Text = obj.m_Name;
break;
}
case ClassIDReference.Animator:
{
AudioClip m_AudioClip = new AudioClip(asset, false);
exportable = true;
break;
}
@@ -235,58 +244,16 @@ namespace AssetStudio
exportable = true;
break;
}
case ClassIDReference.Font:
{
UFont m_Font = new UFont(asset, false);
exportable = true;
break;
}
case ClassIDReference.PlayerSettings:
{
var plSet = new PlayerSettings(asset);
productName = plSet.productName;
break;
}
case ClassIDReference.Mesh:
{
Mesh m_Mesh = new Mesh(asset, false);
exportable = true;
break;
}
case ClassIDReference.AssetBundle:
{
ab = new AssetBundle(asset);
break;
}
case ClassIDReference.VideoClip:
{
var m_VideoClip = new VideoClip(asset, false);
exportable = true;
break;
}
case ClassIDReference.MovieTexture:
{
var m_MovieTexture = new MovieTexture(asset, false);
exportable = true;
break;
}
case ClassIDReference.Sprite:
{
var m_Sprite = new Sprite(asset, false);
exportable = true;
break;
}
case ClassIDReference.Animator:
{
exportable = true;
break;
}
case ClassIDReference.AnimationClip:
{
exportable = true;
var reader = asset.sourceFile.reader;
reader.Position = asset.Offset;
asset.Text = reader.ReadAlignedString();
asset.Text = ab.m_Name;
break;
}
}
@@ -335,7 +302,6 @@ namespace AssetStudio
#region second loop - build tree structure
if (buildHierarchy)
{
fileNodes = new List<GameObject>();
var gameObjectCount = assetsfileList.Sum(x => x.GameObjectList.Values.Count);
if (gameObjectCount > 0)
{
@@ -345,9 +311,8 @@ namespace AssetStudio
foreach (var assetsFile in assetsfileList)
{
GameObject fileNode = new GameObject(null);
fileNode.Text = Path.GetFileName(assetsFile.filePath);
fileNode.m_Name = "RootNode";
var fileNode = new GameObjectTreeNode(null); //RootNode
fileNode.Text = assetsFile.fileName;
foreach (var m_GameObject in assetsFile.GameObjectList.Values)
{
@@ -399,7 +364,7 @@ namespace AssetStudio
case ClassIDReference.Animator:
{
m_GameObject.m_Animator = m_Component;
asset.Text = m_GameObject.asset.Text;
asset.Text = m_GameObject.preloadData.Text;
break;
}
}
@@ -413,19 +378,29 @@ namespace AssetStudio
{
if (assetsfileList.TryGetTransform(m_Transform.m_Father, out var m_Father))
{
if (assetsfileList.TryGetGameObject(m_Father.m_GameObject, out parentNode))
if (assetsfileList.TryGetGameObject(m_Father.m_GameObject, out var parentGameObject))
{
if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode))
{
parentNode = new GameObjectTreeNode(parentGameObject);
treeNodeDictionary.Add(parentGameObject, parentNode);
}
}
}
}
parentNode.Nodes.Add(m_GameObject);
if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
{
currentNode = new GameObjectTreeNode(m_GameObject);
treeNodeDictionary.Add(m_GameObject, currentNode);
}
parentNode.Nodes.Add(currentNode);
ProgressBarPerformStep();
}
if (fileNode.Nodes.Count > 0)
{
fileNodes.Add(fileNode);
treeNodeCollection.Add(fileNode);
}
}
}
@@ -608,10 +583,10 @@ namespace AssetStudio
{
ThreadPool.QueueUserWorkItem(state =>
{
foreach (TreeNode node in nodes)
foreach (GameObjectTreeNode node in nodes)
{
//遍历一级子节点
foreach (TreeNode j in node.Nodes)
foreach (GameObjectTreeNode j in node.Nodes)
{
ProgressBarPerformStep();
//收集所有子节点
@@ -643,7 +618,7 @@ namespace AssetStudio
{
try
{
ExportGameObject((GameObject)j, targetPath);
ExportGameObject(j.gameObject, targetPath);
}
catch (Exception ex)
{
@@ -658,10 +633,10 @@ namespace AssetStudio
});
}
private static void CollectNode(TreeNode node, List<GameObject> gameObjects)
private static void CollectNode(GameObjectTreeNode node, List<GameObject> gameObjects)
{
gameObjects.Add((GameObject)node);
foreach (TreeNode i in node.Nodes)
gameObjects.Add(node.gameObject);
foreach (GameObjectTreeNode i in node.Nodes)
{
CollectNode(i, gameObjects);
}
@@ -698,11 +673,11 @@ namespace AssetStudio
SetProgressBarMaximum(gameObjects.Count);
foreach (var gameObject in gameObjects)
{
StatusStripUpdate($"Exporting {gameObject.Text}");
StatusStripUpdate($"Exporting {gameObject.m_Name}");
try
{
ExportGameObject(gameObject, exportPath, animationList);
StatusStripUpdate($"Finished exporting {gameObject.Text}");
StatusStripUpdate($"Finished exporting {gameObject.m_Name}");
}
catch (Exception ex)
{
@@ -722,11 +697,11 @@ namespace AssetStudio
private static void GetSelectedParentNode(TreeNodeCollection nodes, List<GameObject> gameObjects)
{
foreach (TreeNode i in nodes)
foreach (GameObjectTreeNode i in nodes)
{
if (i.Checked)
{
gameObjects.Add((GameObject)i);
gameObjects.Add(i.gameObject);
}
else
{