原理:bundle的依赖关系构建一个二维的矩阵图,如果对角线相互依赖(用1标记)则表示循环依赖。
cs
using PlasticGui;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class DependProfiler
{
[MenuItem("Tools/CircleBundleDepend")]
static void Depend() {
string path = Application.streamingAssetsPath +"/StreamingAssets";
AssetBundleManifest manifest = BundleGroupEditor.ParseManifest(path);
var bundles = manifest.GetAllAssetBundles();
//bundle的依赖矩阵,如果对角值为1表示循环依赖
string[,] bundleMatrix = new string[bundles.Length+1, bundles.Length+1];
//添加表头
for (int i = 1; i < bundleMatrix.GetLength(0); i++)
{
var bundle = bundles[i-1];
bundleMatrix[i, 0] = bundle;
for(int j=1; j< bundleMatrix.GetLength(1); j++)
{
bundleMatrix[i, j] = "0";
}
bundleMatrix[0, i] = bundle;
}
//判定依赖关系
for (int i = 1; i < bundleMatrix.GetLength(0); i++)
{
var bundle = bundleMatrix[i, 0];
var depends = manifest.GetAllDependencies(bundle);
if (depends.Length > 0)
{
for (int j = 0; j < depends.Length; j++) {
var depend = depends[j];
for(int k=1; k< bundleMatrix.GetLength(1); k++)
{
if (bundleMatrix[0,k].Equals(depend))
{
bundleMatrix[i, k] = "1";
break;
}
}
}
}
}
for(int i = 0;i < bundleMatrix.GetLength(0); i++)
{
for(int j = 0;j < bundleMatrix.GetLength(1); j++) {
if (bundleMatrix[i,j]=="1" && bundleMatrix[j, i] == "1")
{
Debug.LogError(string.Format("{0} - {1}", bundleMatrix[i, 0], bundleMatrix[0, j]));
}
}
}
//判定是否循环依赖
Debug.Log("---------结束--------");
}
}
下载资源以后编辑器运行即可看到如下的依赖关系