private bool CompareVariantAssetLists(AssetDependencyData add, int[] a1, int[] a2) { if ((a1 == null) != (a2 == null)) { return(false); } if (a1.Length != a2.Length) { return(false); } for (int ai = 0; ai < a1.Length; ai++) { var lower = System.IO.Path.GetFileNameWithoutExtension(add.assets[a1[ai]].name).ToLower(); bool match = false; for (int ai2 = 0; ai2 < a2.Length; ai2++) { if (lower == System.IO.Path.GetFileNameWithoutExtension(add.assets[a2[ai2]].name).ToLower()) { match = true; break; } } if (!match) { return(false); } } return(true); }
Dictionary <string, List <Issue> > FindIssues() { List <int> assetsWithDuplicates = new List <int>(); AssetDependencyData add = new AssetDependencyData(); var issues = new Dictionary <string, List <Issue> >(); issues.Add(kDuplicateAssets, new List <Issue>()); issues.Add(kMismatchedVariant, new List <Issue>()); issues.Add(kMixedScene, new List <Issue>()); for (int bi = 0; bi < add.bundles.Length; bi++) { string sceneAssetName = null; bool hasScene = false; bool hasNonScene = false; for (int ai = 0; ai < add.bundles[bi].assets.Length; ai++) { var assetIndex = add.bundles[bi].assets[ai]; if (!hasScene || !hasNonScene) { if (AssetDatabase.GetMainAssetTypeAtPath(add.assets[assetIndex].name) == typeof(SceneAsset)) { hasScene = true; sceneAssetName = add.assets[assetIndex].name; } else { hasNonScene = true; } } foreach (var d in add.assets[assetIndex].dependencies) { if (add.assets[d].bundle < 0) { if (add.assets[d].bundles == null) { add.assets[d].bundles = new HashSet <int>(); } add.assets[d].bundles.Add(bi); if (add.assets[d].bundles.Count == 2) //once there are two, there is a duplicate, no need to add after that { assetsWithDuplicates.Add(d); } } } } if (hasNonScene && hasScene) { FindOrCreateIssue(issues, kMismatchedVariant, add.bundles[bi].name).subItems.Add(sceneAssetName); } } for (int bi = 0; bi < add.bundles.Length; bi++) { int dot = add.bundles[bi].name.LastIndexOf('.'); if (dot > 0) { var baseName = add.bundles[bi].name.Substring(0, dot); for (int bi2 = bi + 1; bi2 < add.bundles.Length; bi2++) { if (bi2 == bi) { continue; } int dot2 = add.bundles[bi2].name.LastIndexOf('.'); if (dot2 <= 0) { continue; } if (!CompareVariantAssetLists(add, add.bundles[bi].assets, add.bundles[bi2].assets)) { Issue issue = FindOrCreateIssue(issues, kMismatchedVariant, baseName); if (!issue.subItems.Contains(add.bundles[bi].name)) { issue.subItems.Add(add.bundles[bi].name); } if (!issue.subItems.Contains(add.bundles[bi2].name)) { issue.subItems.Add(add.bundles[bi2].name); } } } } } foreach (var ai in assetsWithDuplicates) { var issue = FindOrCreateIssue(issues, kDuplicateAssets, add.assets[ai].name); foreach (var bi in add.assets[ai].bundles) { if (!issue.subItems.Contains(add.bundles[bi].name)) { issue.subItems.Add(add.bundles[bi].name); } } } return(issues); }