public static void BuildRelation(StaticABSettings abSetting) { AssetCustomProcesses.Init(); AssetNodeCollector.Clear(); manualSettings = abSetting.Settings; s_specialAB = new Dictionary <string, BundleUnloadStrategy>(); foreach (var setting in manualSettings) { Debug.LogWarning($"Setting Path : {setting.Path}"); var settingFiles = Directory.GetFiles(setting.Path, "*", SearchOption.AllDirectories); foreach (var filePath in settingFiles) { if (Array.IndexOf(IgnoreExtensions, Path.GetExtension(filePath)) >= 0 || filePath.Contains(".svn")) { continue; } var abName = string.Empty; var directoryName = Path.GetDirectoryName(filePath) ?? ""; switch (setting.Op) { case StaticABSetting.Operation.ALL_IN_ONE: abName = FormatPath(setting.Path); break; case StaticABSetting.Operation.STAY_RESOURCES: break; case StaticABSetting.Operation.EACH_FOLDER_ONE: abName = FormatPath(directoryName); break; case StaticABSetting.Operation.EACH_A_AB: abName = FormatPath(Path.Combine(directoryName, Path.GetFileNameWithoutExtension(filePath))); break; default: throw new ArgumentOutOfRangeException(); } var s = Array.Find(setting.UnloadStrategies, strategy => strategy.BundleName == abName); var node = AssetNode.GetOrCreate(filePath, abName); // 同名资源处理 if (!s_specialAB.ContainsKey(node.AssetName)) { s_specialAB.Add(node.AssetName, s?.UnloadStrategy ?? BundleUnloadStrategy.Normal); } if (Path.GetExtension(node.AssetPath) == ".spriteatlas") { var dependencies = AssetDatabase.GetDependencies(node.AssetPath); foreach (var dependency in dependencies) { var depNode = AssetNode.GetOrCreate(dependency, abName); if (Equals(depNode, node)) { continue; } if (s_specialAB.ContainsKey(depNode.AssetName)) { Debug.LogError($"one sprite in multi atlas : {depNode.AssetName}"); continue; } s_specialAB.Add(depNode.AssetName, s?.UnloadStrategy ?? BundleUnloadStrategy.Normal); } node.ForceAddToResourcesNode(); } } } var resourcesFiles = Directory.GetFiles("Assets/Resources", "*", SearchOption.AllDirectories); List <string> filteredFiles = new List <string>(resourcesFiles.Length); filteredFiles.AddRange(resourcesFiles.Where(file => !file.Contains(".svn") && Array.IndexOf(IgnoreExtensions, Path.GetExtension(file)) == -1)); resourcesFiles = filteredFiles.ToArray(); var otherFiles = new string[abSetting.ExtraDependencyAssets.Length]; for (var i = 0; i < abSetting.ExtraDependencyAssets.Length; i++) { var asset = abSetting.ExtraDependencyAssets[i]; var path = AssetDatabase.GetAssetPath(asset); otherFiles[i] = path; } foreach (var sceneAsset in abSetting.Scenes) { if (!sceneAsset) { Debug.LogError($"Scene asset is null"); continue; } var scenePath = AssetDatabase.GetAssetPath(sceneAsset); var sceneAbName = scenePath.Substring(0, scenePath.Length - 6).ToLower(); var sceneNode = AssetNode.GetOrCreate(scenePath, sceneAbName); sceneNode.ForceAddToResourcesNode(); var dependencies = AssetDatabase.GetDependencies(scenePath, false); foreach (var dependency in dependencies) { if (Array.IndexOf(IgnoreExtensions, Path.GetExtension(dependency)) >= 0) { continue; } if (!dependency.StartsWith("assets", true, CultureInfo.InvariantCulture)) { Debug.LogWarning($"{scenePath} Depend asset : {dependency} is not under Assets folder"); continue; } AssetNode.GetOrCreate(dependency, sceneAbName + "_scene"); } } resourcesFiles = resourcesFiles.Concat(otherFiles).ToArray(); EditorUtility.DisplayProgressBar("Process resources asset", "", 0); RelationProcess(resourcesFiles); AssetCustomProcesses.PostProcess(); ExportResourcesPackageConf(); }