public static void PrintToExcel(string outputPath) { EditorUtility.DisplayProgressBar("AssetBundle报告", "正在写入 Excel 文件...", 0.85f); var newFile = new FileInfo(outputPath); if (newFile.Exists) { newFile.Delete(); } using (var package = new ExcelPackage(newFile)) { AssetBundleFilesReporter.CreateWorksheet(package.Workbook.Worksheets); AssetBundleDetailsReporter.CreateWorksheet(package.Workbook.Worksheets); AssetBundleResReporter.CreateWorksheet(package.Workbook.Worksheets); AssetBundleFilesReporter.FillWorksheet(package.Workbook.Worksheets[1]); AssetBundleDetailsReporter.FillWorksheet(package.Workbook.Worksheets[2]); AssetBundleResReporter.FillWorksheet(package.Workbook.Worksheets[3]); AssetBundlePropertyReporter.CreateAndFillWorksheet(package.Workbook.Worksheets, AssetFileInfoType.mesh); AssetBundlePropertyReporter.CreateAndFillWorksheet(package.Workbook.Worksheets, AssetFileInfoType.texture2D); AssetBundlePropertyReporter.CreateAndFillWorksheet(package.Workbook.Worksheets, AssetFileInfoType.material); AssetBundlePropertyReporter.CreateAndFillWorksheet(package.Workbook.Worksheets, AssetFileInfoType.animationClip); AssetBundlePropertyReporter.CreateAndFillWorksheet(package.Workbook.Worksheets, AssetFileInfoType.audioClip); package.Save(); } AssetBundleFilesAnalyze.Clear(); EditorUtility.ClearProgressBar(); }
private IEnumerator AnalyzeBundleScene(Scene scene) { yield return(new WaitForEndOfFrame()); Scene defaultScene = SceneManager.GetActiveScene(); SceneManager.SetActiveScene(scene); BundleSceneInfo info = m_BundleSceneInfos.Peek(); if (info.sceneName != scene.name) { Debug.LogError("What's scene? " + scene.path); yield break; } AssetBundleFilesAnalyze.AnalyzeObjectReference(info.fileInfo, RenderSettings.skybox); GameObject[] gos = scene.GetRootGameObjects(); foreach (var go in gos) { AssetBundleFilesAnalyze.AnalyzeObjectComponent(info.fileInfo, go); } AssetBundleFilesAnalyze.AnalyzeObjectsCompleted(info.fileInfo); SceneManager.SetActiveScene(defaultScene); info.ab.Unload(true); info.ab = null; SceneManager.UnloadScene(scene); }
/// <summary> /// 分析打印 AssetBundle /// </summary> /// <param name="assetBundlePath">AssetBundle 文件所在文件夹路径</param> /// <param name="outputPath">Excel 报告文件保存路径</param> /// <param name="completedCallback">分析打印完毕后的回调</param> public static void AnalyzePrint(string assetBundlePath, string outputPath, UnityAction completedCallback = null) { AssetBundleFilesAnalyze.analyzeCompletedCallback = () => { PrintToExcel(outputPath); completedCallback?.Invoke(); }; EditorUtility.DisplayProgressBar("AssetBundle报告", "正在分析 AssetBundle 文件...", 0.35f); if (!AssetBundleFilesAnalyze.Analyze(assetBundlePath)) { EditorUtility.ClearProgressBar(); } }
private void LoadNextBundleScene() { if (m_BundleSceneInfos.Count <= 0) { SceneManager.sceneLoaded -= SceneManagerOnSceneLoaded; SceneManager.sceneUnloaded -= SceneManagerOnSceneUnloaded; if (AssetBundleFilesAnalyze.analyzeCompletedCallback != null) { AssetBundleFilesAnalyze.analyzeCompletedCallback(); } return; } // 释放一下内存,以免爆掉 Resources.UnloadUnusedAssets(); GC.Collect(); BundleSceneInfo info = m_BundleSceneInfos.Peek(); info.ab = AssetBundle.LoadFromFile(info.fileInfo.path); SceneManager.LoadScene(info.sceneName, LoadSceneMode.Additive); }
public static void ObjectAddToFileInfo(Object obj, SerializedObject serializedObject, AssetBundleFileInfo info) { if (obj == null) { return; } string name2 = obj.name; string type = obj.GetType().ToString(); if (type.StartsWith("UnityEngine.", System.StringComparison.Ordinal)) { type = type.Substring(12); // 如果是内置的组件,就不当作是资源 if (obj as Component) { return; } } else if (string.Equals(type, "UnityEditor.Animations.AnimatorController", System.StringComparison.Ordinal)) { type = "AnimatorController"; } else if (string.Equals(type, "UnityEditorInternal.AnimatorController", System.StringComparison.Ordinal)) { type = "AnimatorController"; } else if (string.Equals(type == "UnityEditor.MonoScript", System.StringComparison.Ordinal)) { MonoScript ms = obj as MonoScript; string type2 = ms.GetClass().ToString(); if (type2.StartsWith("UnityEngine.", System.StringComparison.Ordinal)) { // 内置的脚本对象也不显示出来 return; } // 外部的组件脚本,保留下来 type = "MonoScript"; } else { // 外部的组件脚本,走上面的MonoScript if (obj as Component) { return; } // 外部的序列化对象,已经被脚本给分析完毕了,不需要再添加进来 if (obj as ScriptableObject) { return; } Debug.LogError("What's this? " + type); return; } // 内建的资源排除掉 string assetPath = AssetDatabase.GetAssetPath(obj); if (!string.IsNullOrEmpty(assetPath)) { return; } long guid; if (info.isScene) { // 场景的话,没法根据PathID来确定唯一性,那么就认为每个场景用到的资源都不一样 guid = (info.name + name2 + type).GetHashCode(); } else { SerializedProperty pathIdProp = serializedObject.FindProperty("m_LocalIdentfierInFile"); #if UNITY_5 || UNITY_5_3_OR_NEWER guid = pathIdProp.longValue; #else guid = pathIdProp.intValue; #endif } if (info.IsAssetContain(guid)) { return; } AssetFileInfo info2 = AssetBundleFilesAnalyze.GetAssetFileInfo(guid); info2.name = name2; info2.type = type; info2.includedBundles.Add(info); if (info2.detailHyperLink == null) { // 初次创建对象时链接为空 info2.detailHyperLink = new OfficeOpenXml.ExcelHyperLink(System.String.Empty, info2.name); info2.propertys = AnalyzeObject(obj, serializedObject, info.rootPath, info.name); } info.assets.Add(info2); }
private static void FillAssetDepends(AssetBundleFileInfo info, ExcelWorksheet ws, ref int startRow) { if (info.allDepends == null && info.beDepends == null) { return; } if (info.allDepends != null && info.beDepends != null && info.allDepends.Length == 0 && info.beDepends.Length == 0) { return; } int rowAdd = 0; int titleRow = ++startRow; if (info.allDepends != null && info.allDepends.Length != 0) { ws.Cells[titleRow, 3].Value = "它依赖哪些AssetBundle文件? (" + info.allDepends.Length + ")"; SetRangeStyle(ws.Cells[titleRow, 3, titleRow, 4]); int dependRow = titleRow; foreach (var depend in info.allDepends) { if (string.IsNullOrEmpty(depend)) { continue; } dependRow++; var dependInfo = AssetBundleFilesAnalyze.GetAssetBundleFileInfo(depend); ws.Cells[dependRow, 3].Value = dependInfo.name; ws.Cells[dependRow, 3].Hyperlink = dependInfo.detailHyperLink; ws.Cells[dependRow, 3, dependRow, 4].Merge = true; } rowAdd = dependRow - titleRow; } if (info.beDepends != null && info.beDepends.Length != 0) { ws.Cells[titleRow, 1].Value = "哪些AssetBundle文件依赖它? (" + info.beDepends.Length + ")"; SetRangeStyle(ws.Cells[titleRow, 1, titleRow, 2]); int dependRow = titleRow; foreach (var depend in info.beDepends) { dependRow++; var dependInfo = AssetBundleFilesAnalyze.GetAssetBundleFileInfo(depend); ws.Cells[dependRow, 1].Value = dependInfo.name; ws.Cells[dependRow, 1].Hyperlink = dependInfo.detailHyperLink; ws.Cells[dependRow, 1, dependRow, 2].Merge = true; } int rowAdd2 = dependRow - titleRow; if (rowAdd2 > rowAdd) { rowAdd = rowAdd2; } } startRow += rowAdd; }