using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;
namespace YooAsset.Editor
{
[Serializable]
public class AssetBundleCollectorPackage
{
///
/// 包裹名称
///
public string PackageName = string.Empty;
///
/// 包裹描述
///
public string PackageDesc = string.Empty;
///
/// 启用可寻址资源定位
///
public bool EnableAddressable = false;
///
/// 资源定位地址大小写不敏感
///
public bool LocationToLower = false;
///
/// 包含资源GUID数据
///
public bool IncludeAssetGUID = false;
///
/// 自动收集所有着色器(所有着色器存储在一个资源包内)
///
public bool AutoCollectShaders = true;
///
/// 资源忽略规则名
///
public string IgnoreRuleName = nameof(NormalIgnoreRule);
///
/// 分组列表
///
public List Groups = new List();
///
/// 检测配置错误
///
public void CheckConfigError()
{
if (string.IsNullOrEmpty(IgnoreRuleName))
{
throw new Exception($"{nameof(IgnoreRuleName)} is null or empty !");
}
else
{
if (AssetBundleCollectorSettingData.HasIgnoreRuleName(IgnoreRuleName) == false)
throw new Exception($"Invalid {nameof(IIgnoreRule)} class type : {IgnoreRuleName} in package : {PackageName}");
}
foreach (var group in Groups)
{
group.CheckConfigError();
}
}
///
/// 修复配置错误
///
public bool FixConfigError()
{
bool isFixed = false;
if (string.IsNullOrEmpty(IgnoreRuleName))
{
Debug.LogWarning($"Set the {nameof(IgnoreRuleName)} to {nameof(NormalIgnoreRule)}");
IgnoreRuleName = nameof(NormalIgnoreRule);
isFixed = true;
}
foreach (var group in Groups)
{
if (group.FixConfigError())
{
isFixed = true;
}
}
return isFixed;
}
///
/// 获取打包收集的资源文件
///
public List GetAllCollectAssets(CollectCommand command)
{
Dictionary result = new Dictionary(10000);
// 收集打包资源
foreach (var group in Groups)
{
var temper = group.GetAllCollectAssets(command);
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}");
}
}
// 检测可寻址地址是否重复
if (command.EnableAddressable)
{
var addressTemper = new Dictionary();
foreach (var collectInfoPair in result)
{
if (collectInfoPair.Value.CollectorType == ECollectorType.MainAssetCollector)
{
string address = collectInfoPair.Value.Address;
string assetPath = collectInfoPair.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} \nAssetPath:\n {existed}\n {assetPath}");
}
}
}
// 返回列表
return result.Values.ToList();
}
///
/// 获取所有的资源标签
///
public List GetAllTags()
{
HashSet result = new HashSet();
foreach (var group in Groups)
{
List groupTags = EditorTools.StringToStringList(group.AssetTags, ';');
foreach (var tag in groupTags)
{
if (result.Contains(tag) == false)
result.Add(tag);
}
foreach (var collector in group.Collectors)
{
List collectorTags = EditorTools.StringToStringList(collector.AssetTags, ';');
foreach (var tag in collectorTags)
{
if (result.Contains(tag) == false)
result.Add(tag);
}
}
}
return result.ToList();
}
}
}