using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEditor; namespace YooAsset.Editor { [Serializable] public class AssetBundleCollectorGroup { /// /// 分组名称 /// public string GroupName = string.Empty; /// /// 分组描述 /// public string GroupDesc = string.Empty; /// /// 资源分类标签 /// public string AssetTags = string.Empty; /// /// 分组激活规则 /// public string ActiveRuleName = nameof(EnableGroup); /// /// 分组的收集器列表 /// public List Collectors = new List(); /// /// 检测配置错误 /// public void CheckConfigError() { if (AssetBundleCollectorSettingData.HasActiveRuleName(ActiveRuleName) == false) throw new Exception($"Invalid {nameof(IActiveRule)} class type : {ActiveRuleName} in group : {GroupName}"); // 检测分组是否激活 IActiveRule activeRule = AssetBundleCollectorSettingData.GetActiveRuleInstance(ActiveRuleName); if (activeRule.IsActiveGroup() == false) return; foreach (var collector in Collectors) { collector.CheckConfigError(); } } /// /// 修复配置错误 /// public bool FixConfigError() { bool isFixed = false; foreach (var collector in Collectors) { if (collector.FixConfigError()) { isFixed = true; } } return isFixed; } /// /// 获取打包收集的资源文件 /// public List GetAllCollectAssets(CollectCommand command) { Dictionary result = new Dictionary(10000); // 检测分组是否激活 IActiveRule activeRule = AssetBundleCollectorSettingData.GetActiveRuleInstance(ActiveRuleName); if (activeRule.IsActiveGroup() == false) { return new List(); } // 收集打包资源 foreach (var collector in Collectors) { var temper = collector.GetAllCollectAssets(command, this); foreach (var collectAsset in temper) { if (result.ContainsKey(collectAsset.AssetInfo.AssetPath) == false) result.Add(collectAsset.AssetInfo.AssetPath, collectAsset); else throw new Exception($"The collecting asset file is existed : {collectAsset.AssetInfo.AssetPath} in group : {GroupName}"); } } // 检测可寻址地址是否重复 if (command.EnableAddressable) { var addressTemper = new Dictionary(); foreach (var collectAssetPair in result) { if (collectAssetPair.Value.CollectorType == ECollectorType.MainAssetCollector) { string address = collectAssetPair.Value.Address; string assetPath = collectAssetPair.Value.AssetInfo.AssetPath; if (string.IsNullOrEmpty(address)) continue; if (addressTemper.TryGetValue(address, out var existed) == false) addressTemper.Add(address, assetPath); else throw new Exception($"The address is existed : {address} in group : {GroupName} \nAssetPath:\n {existed}\n {assetPath}"); } } } // 返回列表 return result.Values.ToList(); } } }