From cffe96b409943e04d2ad6ebd2624943f59ba91a4 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sun, 20 Oct 2019 08:05:55 +0800 Subject: [PATCH] Skip reading failed assets --- AssetStudio/AssetsManager.cs | 193 +++++++++++++++------------ AssetStudioGUI/AssetStudioGUIForm.cs | 9 +- 2 files changed, 113 insertions(+), 89 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 4adc288..d2abcc7 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using static AssetStudio.ImportHelper; @@ -110,7 +111,7 @@ namespace AssetStudio catch { reader.Dispose(); - //Logger.Error($"Unable to load assets file {fileName}"); + //Logger.Warning($"Unable to load assets file {fileName}"); } } else @@ -121,7 +122,8 @@ namespace AssetStudio private void LoadAssetsFromMemory(string fullName, EndianBinaryReader reader, string originalPath, string unityVersion = null) { - var upperFileName = Path.GetFileName(fullName).ToUpper(); + var fileName = Path.GetFileName(fullName); + var upperFileName = fileName.ToUpper(); if (!assetsFileListHash.Contains(upperFileName)) { try @@ -239,92 +241,107 @@ namespace AssetStudio foreach (var objectInfo in assetsFile.m_Objects) { var objectReader = new ObjectReader(assetsFile.reader, assetsFile, objectInfo); - switch (objectReader.type) + try { - case ClassIDType.Animation: - assetsFile.Objects.Add(objectInfo.m_PathID, new Animation(objectReader)); - break; - case ClassIDType.AnimationClip: - assetsFile.Objects.Add(objectInfo.m_PathID, new AnimationClip(objectReader)); - break; - case ClassIDType.Animator: - assetsFile.Objects.Add(objectInfo.m_PathID, new Animator(objectReader)); - break; - case ClassIDType.AnimatorController: - assetsFile.Objects.Add(objectInfo.m_PathID, new AnimatorController(objectReader)); - break; - case ClassIDType.AnimatorOverrideController: - assetsFile.Objects.Add(objectInfo.m_PathID, new AnimatorOverrideController(objectReader)); - break; - case ClassIDType.AssetBundle: - assetsFile.Objects.Add(objectInfo.m_PathID, new AssetBundle(objectReader)); - break; - case ClassIDType.AudioClip: - assetsFile.Objects.Add(objectInfo.m_PathID, new AudioClip(objectReader)); - break; - case ClassIDType.Avatar: - assetsFile.Objects.Add(objectInfo.m_PathID, new Avatar(objectReader)); - break; - case ClassIDType.Font: - assetsFile.Objects.Add(objectInfo.m_PathID, new Font(objectReader)); - break; - case ClassIDType.GameObject: - assetsFile.Objects.Add(objectInfo.m_PathID, new GameObject(objectReader)); - break; - case ClassIDType.Material: - assetsFile.Objects.Add(objectInfo.m_PathID, new Material(objectReader)); - break; - case ClassIDType.Mesh: - assetsFile.Objects.Add(objectInfo.m_PathID, new Mesh(objectReader)); - break; - case ClassIDType.MeshFilter: - assetsFile.Objects.Add(objectInfo.m_PathID, new MeshFilter(objectReader)); - break; - case ClassIDType.MeshRenderer: - assetsFile.Objects.Add(objectInfo.m_PathID, new MeshRenderer(objectReader)); - break; - case ClassIDType.MonoBehaviour: - assetsFile.Objects.Add(objectInfo.m_PathID, new MonoBehaviour(objectReader)); - break; - case ClassIDType.MonoScript: - assetsFile.Objects.Add(objectInfo.m_PathID, new MonoScript(objectReader)); - break; - case ClassIDType.MovieTexture: - assetsFile.Objects.Add(objectInfo.m_PathID, new MovieTexture(objectReader)); - break; - case ClassIDType.PlayerSettings: - assetsFile.Objects.Add(objectInfo.m_PathID, new PlayerSettings(objectReader)); - break; - case ClassIDType.RectTransform: - assetsFile.Objects.Add(objectInfo.m_PathID, new RectTransform(objectReader)); - break; - case ClassIDType.Shader: - assetsFile.Objects.Add(objectInfo.m_PathID, new Shader(objectReader)); - break; - case ClassIDType.SkinnedMeshRenderer: - assetsFile.Objects.Add(objectInfo.m_PathID, new SkinnedMeshRenderer(objectReader)); - break; - case ClassIDType.Sprite: - assetsFile.Objects.Add(objectInfo.m_PathID, new Sprite(objectReader)); - break; - case ClassIDType.SpriteAtlas: - assetsFile.Objects.Add(objectInfo.m_PathID, new SpriteAtlas(objectReader)); - break; - case ClassIDType.TextAsset: - assetsFile.Objects.Add(objectInfo.m_PathID, new TextAsset(objectReader)); - break; - case ClassIDType.Texture2D: - assetsFile.Objects.Add(objectInfo.m_PathID, new Texture2D(objectReader)); - break; - case ClassIDType.Transform: - assetsFile.Objects.Add(objectInfo.m_PathID, new Transform(objectReader)); - break; - case ClassIDType.VideoClip: - assetsFile.Objects.Add(objectInfo.m_PathID, new VideoClip(objectReader)); - break; - default: - assetsFile.Objects.Add(objectInfo.m_PathID, new Object(objectReader)); - break; + Object obj; + switch (objectReader.type) + { + case ClassIDType.Animation: + obj = new Animation(objectReader); + break; + case ClassIDType.AnimationClip: + obj = new AnimationClip(objectReader); + break; + case ClassIDType.Animator: + obj = new Animator(objectReader); + break; + case ClassIDType.AnimatorController: + obj = new AnimatorController(objectReader); + break; + case ClassIDType.AnimatorOverrideController: + obj = new AnimatorOverrideController(objectReader); + break; + case ClassIDType.AssetBundle: + obj = new AssetBundle(objectReader); + break; + case ClassIDType.AudioClip: + obj = new AudioClip(objectReader); + break; + case ClassIDType.Avatar: + obj = new Avatar(objectReader); + break; + case ClassIDType.Font: + obj = new Font(objectReader); + break; + case ClassIDType.GameObject: + obj = new GameObject(objectReader); + break; + case ClassIDType.Material: + obj = new Material(objectReader); + break; + case ClassIDType.Mesh: + obj = new Mesh(objectReader); + break; + case ClassIDType.MeshFilter: + obj = new MeshFilter(objectReader); + break; + case ClassIDType.MeshRenderer: + obj = new MeshRenderer(objectReader); + break; + case ClassIDType.MonoBehaviour: + obj = new MonoBehaviour(objectReader); + break; + case ClassIDType.MonoScript: + obj = new MonoScript(objectReader); + break; + case ClassIDType.MovieTexture: + obj = new MovieTexture(objectReader); + break; + case ClassIDType.PlayerSettings: + obj = new PlayerSettings(objectReader); + break; + case ClassIDType.RectTransform: + obj = new RectTransform(objectReader); + break; + case ClassIDType.Shader: + obj = new Shader(objectReader); + break; + case ClassIDType.SkinnedMeshRenderer: + obj = new SkinnedMeshRenderer(objectReader); + break; + case ClassIDType.Sprite: + obj = new Sprite(objectReader); + break; + case ClassIDType.SpriteAtlas: + obj = new SpriteAtlas(objectReader); + break; + case ClassIDType.TextAsset: + obj = new TextAsset(objectReader); + break; + case ClassIDType.Texture2D: + obj = new Texture2D(objectReader); + break; + case ClassIDType.Transform: + obj = new Transform(objectReader); + break; + case ClassIDType.VideoClip: + obj = new VideoClip(objectReader); + break; + default: + obj = new Object(objectReader); + break; + } + assetsFile.Objects.Add(objectInfo.m_PathID, obj); + } + catch (Exception e) + { + /*var sb = new StringBuilder(); + sb.AppendLine("Unable to load object") + .AppendLine($"Assets {assetsFile.fileName}") + .AppendLine($"Type {objectReader.type}") + .AppendLine($"PathID {objectInfo.m_PathID}") + .Append(e); + Logger.Error(sb.ToString());*/ } Progress.Report(++i, progressCount); diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 5135e20..5d9b7c9 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -214,7 +214,14 @@ namespace AssetStudioGUI filterTypeToolStripMenuItem.DropDownItems.Add(typeItem); } allToolStripMenuItem.Checked = true; - StatusStripUpdate($"Finished loading {assetsManager.assetsFileList.Count} files with {assetListView.Items.Count} exportable assets."); + var log = $"Finished loading {assetsManager.assetsFileList.Count} files with {assetListView.Items.Count} exportable assets"; + var m_ObjectsCount = assetsManager.assetsFileList.Sum(x => x.m_Objects.Count); + var objectsCount = assetsManager.assetsFileList.Sum(x => x.Objects.Count); + if (m_ObjectsCount != objectsCount) + { + log += $" and {m_ObjectsCount - objectsCount} assets failed to read"; + } + StatusStripUpdate(log); treeSearch.Select(); })); }