Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        /// <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;
        }