private void ApplyRule(BuildRule rule) { var path = rule.searchPath; var patterns = rule.searchPattern.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var searchOption = rule.searchOption; var searchDir = rule.searchDirOnly; var assetBundleName = rule.assetBundleName; int startIndex = path.LastIndexOf('/') + 1; var suffix = searchDir ? "_x" : ""; foreach (var item in patterns) { string[] files = searchDir ? Directory.GetDirectories(path, item, searchOption) : Directory.GetFiles(path, item, searchOption); foreach (string file in files) { if (!searchDir && Directory.Exists(file)) { continue; } var asset = file.Replace("\\", "/"); if (string.IsNullOrEmpty(assetBundleName)) { string assetName = Path.GetFileNameWithoutExtension(asset); string directoryName = Path.GetDirectoryName(asset); string str = directoryName.Substring(startIndex); asset2bundles[asset] = (str + "/" + assetName).Replace("\\", "/").ToLower() + suffix; // 防止目录名称和 ab 名称冲突 } else { asset2bundles[asset] = assetBundleName; } } } }
private void CollectAssets() { for (int i = 0, max = rules.Length; i < max; i++) { BuildRule rule = rules[i]; if (EditorUtility.DisplayCancelableProgressBar(string.Format("收集资源{0}/{1}", i, max), rule.searchPath, i / (float)max)) { break; } ApplyRule(rule); } var list = new List <RuleAsset>(); foreach (var item in _asset2Bundles) { list.Add(new RuleAsset { path = item.Key, bundle = item.Value }); } list.Sort((a, b) => string.Compare(a.path, b.path, StringComparison.Ordinal)); ruleAssets = list.ToArray(); }
private static void AddRulesForSelection(BuildRules rules, string searchPattern) { var isDir = rules.searchPatternDir.Equals(searchPattern); foreach (var item in Selection.objects) { var path = AssetDatabase.GetAssetPath(item); var rule = new BuildRule { searchPath = path, searchPattern = searchPattern, nameBy = isDir ? NameBy.Directory : NameBy.Path }; ArrayUtility.Add(ref rules.rules, rule); } EditorUtility.SetDirty(rules); AssetDatabase.SaveAssets(); }
private static void AddRulesForSelection(BuildRules rules, string searchPattern) { var isDir = rules.searchPatternDir.Equals(searchPattern); foreach (var item in Selection.objects) { var path = AssetDatabase.GetAssetPath(item); var rule = new BuildRule(); rule.searchPath = path; rule.searchPattern = searchPattern; rule.searchOption = SearchOption.AllDirectories; rule.unshared = false; rule.searchDirOnly = isDir; ArrayUtility.Add <BuildRule>(ref rules.rules, rule); } EditorUtility.SetDirty(rules); AssetDatabase.SaveAssets(); Selection.activeObject = rules; EditorUtility.FocusProjectWindow(); }
private void ApplyRule(BuildRule rule) { var assets = rule.GetAssets(); switch (rule.nameBy) { case NameBy.Explicit: { foreach (var asset in assets) { _asset2Bundles[asset] = RuledAssetBundleName(rule.assetBundleName); } break; } case NameBy.Path: { foreach (var asset in assets) { _asset2Bundles[asset] = RuledAssetBundleName(asset); } break; } case NameBy.Directory: { foreach (var asset in assets) { _asset2Bundles[asset] = RuledAssetBundleName(Path.GetDirectoryName(asset)); } break; } case NameBy.TopDirectory: { var startIndex = rule.searchPath.Length; foreach (var asset in assets) { var dir = Path.GetDirectoryName(asset); if (!string.IsNullOrEmpty(dir)) { if (!dir.Equals(rule.searchPath)) { var pos = dir.IndexOf("/", startIndex + 1, StringComparison.Ordinal); if (pos != -1) { dir = dir.Substring(0, pos); } } } _asset2Bundles[asset] = RuledAssetBundleName(dir); } break; } default: throw new ArgumentOutOfRangeException(); } }
public Dictionary <string, string> Apply() { tracker.Clear(); duplicated.Clear(); conflicted.Clear(); asset2bundles.Clear(); for (int i = 0, max = rules.Length; i < max; i++) { BuildRule rule = rules[i]; if (EditorUtility.DisplayCancelableProgressBar(string.Format("执行规则{0}/{1}", i, max), rule.searchPath, i / (float)max)) { break; } if (rule.unshared) { if (!unshared.Contains(rule.searchPath)) { unshared.Add(rule.searchPath); } } ApplyRule(rule); } { int i = 0, max = asset2bundles.Count; foreach (var item in asset2bundles) { string bundle = item.Value; if (EditorUtility.DisplayCancelableProgressBar(string.Format("设置包名{0}/{1}", i, max), bundle, i / (float)max)) { break; } var ai = AssetImporter.GetAtPath(item.Key); if (ai != null && !bundle.Equals(ai.assetBundleName)) { ai.assetBundleName = bundle; } i++; } } EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(); AssetDatabase.RemoveUnusedAssetBundleNames(); string[] bundles = AssetDatabase.GetAllAssetBundleNames(); for (int i = 0, max = bundles.Length; i < max; i++) { string bundle = bundles[i]; if (EditorUtility.DisplayCancelableProgressBar(string.Format("分析依赖{0}/{1}", i, max), bundle, i / (float)max)) { break; } string[] assetPaths = AssetDatabase.GetAssetPathsFromAssetBundle(bundle); if (Array.Exists(assetPaths, IsScene) && !Array.TrueForAll(assetPaths, IsScene)) { conflicted.Add(bundle, assetPaths); } string[] dependencies = AssetDatabase.GetDependencies(assetPaths, true); foreach (string asset in dependencies) { if (ValidateAsset(asset) && !unshared.Exists((s) => asset.Contains(s))) { Track(asset, bundle); } } } { int i = 0, max = conflicted.Count; foreach (var item in conflicted) { if (EditorUtility.DisplayCancelableProgressBar(string.Format("解决冲突{0}/{1}", i, max), item.Key, i / (float)max)) { break; } string[] assets = item.Value; foreach (string asset in assets) { if (!IsScene(asset)) { duplicated.Add(asset); } } i++; } } for (int i = 0, max = duplicated.Count; i < max; i++) { string item = duplicated[i]; if (EditorUtility.DisplayCancelableProgressBar(string.Format("解决冗余{0}/{1}", i, max), item, i / (float)max)) { break; } OptimazieAsset(item); } duplicated.Clear(); EditorUtility.ClearProgressBar(); return(asset2bundles); }