From c22c87e16b5d5df6f1a8d5d83253bf1d15ad5b42 Mon Sep 17 00:00:00 2001 From: hevinci Date: Sun, 8 May 2022 21:51:27 +0800 Subject: [PATCH] Update asset bundle reporter window MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新构建报告窗口:增加预览AssetBundle文件内容的功能。 --- .../BuildReport/ReportBundleInfo.cs | 46 +++++++++++++ .../AssetBundleInspector.cs | 46 +++++++++++++ .../AssetBundleInspector.cs.meta | 11 ++++ .../AssetBundleRecorder.cs | 65 +++++++++++++++++++ .../AssetBundleRecorder.cs.meta | 11 ++++ .../AssetBundleReporterWindow.cs | 16 +++-- .../VisualViewers/AssetListReporterViewer.cs | 2 +- .../VisualViewers/BundleListReporterViewer.cs | 25 +++++-- 8 files changed, 211 insertions(+), 11 deletions(-) create mode 100644 Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs create mode 100644 Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs.meta create mode 100644 Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs create mode 100644 Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs.meta diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs index b1e941a..862114d 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs @@ -8,6 +8,21 @@ namespace YooAsset.Editor [Serializable] public class ReportBundleInfo { + public class FlagsData + { + public bool IsEncrypted { private set; get; } + public bool IsBuildin { private set; get; } + public bool IsRawFile { private set; get; } + public FlagsData(bool isEncrypted, bool isBuildin, bool isRawFile) + { + IsEncrypted = isEncrypted; + IsBuildin = isBuildin; + IsRawFile = isRawFile; + } + } + + private FlagsData _flagData; + /// /// 资源包名称 /// @@ -38,6 +53,26 @@ namespace YooAsset.Editor /// public int Flags; + + /// + /// 获取标志位的解析数据 + /// + public FlagsData GetFlagData() + { + if (_flagData == null) + { + BitMask32 value = Flags; + bool isEncrypted = value.Test(0); + bool isBuildin = value.Test(1); + bool isRawFile = value.Test(2); + _flagData = new FlagsData(isEncrypted, isBuildin, isRawFile); + } + return _flagData; + } + + /// + /// 获取资源分类标签的字符串 + /// public string GetTagsString() { if (Tags != null) @@ -45,5 +80,16 @@ namespace YooAsset.Editor else return string.Empty; } + + /// + /// 是否为原生文件 + /// + public bool IsRawFile() + { + if (System.IO.Path.GetExtension(BundleName) == $".{YooAssetSettingsData.Setting.RawFileVariant}") + return true; + else + return false; + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs new file mode 100644 index 0000000..85a1bf2 --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs @@ -0,0 +1,46 @@ +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace YooAsset.Editor +{ + public class AssetBundleInspector + { + [CustomEditor(typeof(AssetBundle))] + internal class AssetBundleEditor : UnityEditor.Editor + { + internal bool pathFoldout = false; + internal bool advancedFoldout = false; + public override void OnInspectorGUI() + { + AssetBundle bundle = target as AssetBundle; + + using (new EditorGUI.DisabledScope(true)) + { + var leftStyle = new GUIStyle(GUI.skin.GetStyle("Label")); + leftStyle.alignment = TextAnchor.UpperLeft; + GUILayout.Label(new GUIContent("Name: " + bundle.name), leftStyle); + + var assetNames = bundle.GetAllAssetNames(); + pathFoldout = EditorGUILayout.Foldout(pathFoldout, "Source Asset Paths"); + if (pathFoldout) + { + EditorGUI.indentLevel++; + foreach (var asset in assetNames) + EditorGUILayout.LabelField(asset); + EditorGUI.indentLevel--; + } + + advancedFoldout = EditorGUILayout.Foldout(advancedFoldout, "Advanced Data"); + } + + if (advancedFoldout) + { + EditorGUI.indentLevel++; + base.OnInspectorGUI(); + EditorGUI.indentLevel--; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs.meta b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs.meta new file mode 100644 index 0000000..d1a870d --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8016a4c13444bf45830d714ab2aa430 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs new file mode 100644 index 0000000..1ce2b3f --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs @@ -0,0 +1,65 @@ +using System.IO; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace YooAsset.Editor +{ + public static class AssetBundleRecorder + { + private static readonly Dictionary _loadedAssetBundles = new Dictionary(1000); + + /// + /// 获取AssetBundle对象,如果没有被缓存就重新加载。 + /// + public static AssetBundle GetAssetBundle(string filePath) + { + // 如果文件不存在 + if (File.Exists(filePath) == false) + { + Debug.LogWarning($"Not found asset bundle file : {filePath}"); + return null; + } + + // 验证文件有效性(可能文件被加密) + byte[] fileData = File.ReadAllBytes(filePath); + if (EditorTools.CheckBundleFileValid(fileData) == false) + { + Debug.LogWarning($"The asset bundle file is invalid and may be encrypted : {filePath}"); + return null; + } + + if (_loadedAssetBundles.TryGetValue(filePath, out AssetBundle bundle)) + { + return bundle; + } + else + { + AssetBundle newBundle = AssetBundle.LoadFromFile(filePath); + if(newBundle != null) + { + string[] assetNames = newBundle.GetAllAssetNames(); + foreach (string name in assetNames) + { + newBundle.LoadAsset(name); + } + _loadedAssetBundles.Add(filePath, newBundle); + } + return newBundle; + } + } + + /// + /// 卸载所有已经加载的AssetBundle文件 + /// + public static void UnloadAll() + { + foreach(var valuePair in _loadedAssetBundles) + { + if (valuePair.Value != null) + valuePair.Value.Unload(true); + } + _loadedAssetBundles.Clear(); + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs.meta b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs.meta new file mode 100644 index 0000000..92fac08 --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleRecorder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b2b5e436ee882d41bf53082bf7b23a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs index c08da5b..149aa00 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs @@ -42,8 +42,9 @@ namespace YooAsset.Editor private BundleListReporterViewer _bundleListViewer; private EViewMode _viewMode; - private string _searchKeyWord; private BuildReport _buildReport; + private string _reportFilePath; + private string _searchKeyWord; public void CreateGUI() @@ -92,6 +93,10 @@ namespace YooAsset.Editor _viewModeMenu.text = EViewMode.Summary.ToString(); _summaryViewer.AttachParent(root); } + public void OnDestroy() + { + AssetBundleRecorder.UnloadAll(); + } private void ImportBtn_onClick() { @@ -99,19 +104,20 @@ namespace YooAsset.Editor if (string.IsNullOrEmpty(selectFilePath)) return; - string jsonData = FileUtility.ReadFile(selectFilePath); + _reportFilePath = selectFilePath; + string jsonData = FileUtility.ReadFile(_reportFilePath); _buildReport = BuildReport.Deserialize(jsonData); _assetListViewer.FillViewData(_buildReport, _searchKeyWord); - _bundleListViewer.FillViewData(_buildReport, _searchKeyWord); + _bundleListViewer.FillViewData(_buildReport, _reportFilePath, _searchKeyWord); _summaryViewer.FillViewData(_buildReport); } private void OnSearchKeyWordChange(ChangeEvent e) { _searchKeyWord = e.newValue; - if(_buildReport != null) + if (_buildReport != null) { _assetListViewer.FillViewData(_buildReport, _searchKeyWord); - _bundleListViewer.FillViewData(_buildReport, _searchKeyWord); + _bundleListViewer.FillViewData(_buildReport, _reportFilePath, _searchKeyWord); } } private void ViewModeMenuAction0(DropdownMenuAction action) diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/AssetListReporterViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/AssetListReporterViewer.cs index 9bda204..f189ecf 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/AssetListReporterViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/AssetListReporterViewer.cs @@ -322,7 +322,7 @@ namespace YooAsset.Editor // Size var label2 = element.Q