213 lines
5.1 KiB
C#
213 lines
5.1 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
|
||
namespace YooAsset.Editor
|
||
{
|
||
public class BuildAssetInfo
|
||
{
|
||
private bool _isAddAssetTags = false;
|
||
private readonly HashSet<string> _referenceBundleNames = new HashSet<string>();
|
||
|
||
/// <summary>
|
||
/// 收集器类型
|
||
/// </summary>
|
||
public ECollectorType CollectorType { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 资源包完整名称
|
||
/// </summary>
|
||
public string BundleName { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 可寻址地址
|
||
/// </summary>
|
||
public string Address { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 资源路径
|
||
/// </summary>
|
||
public string AssetPath { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 资源GUID
|
||
/// </summary>
|
||
public string AssetGUID { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 是否为原生资源
|
||
/// </summary>
|
||
public bool IsRawAsset { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 是否为着色器资源
|
||
/// </summary>
|
||
public bool IsShaderAsset { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 资源的分类标签
|
||
/// </summary>
|
||
public readonly List<string> AssetTags = new List<string>();
|
||
|
||
/// <summary>
|
||
/// 资源包的分类标签
|
||
/// </summary>
|
||
public readonly List<string> BundleTags = new List<string>();
|
||
|
||
/// <summary>
|
||
/// 依赖的所有资源
|
||
/// 注意:包括零依赖资源和冗余资源(资源包名无效)
|
||
/// </summary>
|
||
public List<BuildAssetInfo> AllDependAssetInfos { private set; get; }
|
||
|
||
|
||
public BuildAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, bool isRawAsset)
|
||
{
|
||
CollectorType = collectorType;
|
||
BundleName = bundleName;
|
||
Address = address;
|
||
AssetPath = assetPath;
|
||
IsRawAsset = isRawAsset;
|
||
|
||
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
||
System.Type assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
|
||
IsShaderAsset = true;
|
||
else
|
||
IsShaderAsset = false;
|
||
}
|
||
public BuildAssetInfo(string assetPath)
|
||
{
|
||
CollectorType = ECollectorType.None;
|
||
Address = string.Empty;
|
||
AssetPath = assetPath;
|
||
IsRawAsset = false;
|
||
|
||
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
||
System.Type assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
|
||
IsShaderAsset = true;
|
||
else
|
||
IsShaderAsset = false;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 设置所有依赖的资源
|
||
/// </summary>
|
||
public void SetAllDependAssetInfos(List<BuildAssetInfo> dependAssetInfos)
|
||
{
|
||
if (AllDependAssetInfos != null)
|
||
throw new System.Exception("Should never get here !");
|
||
|
||
AllDependAssetInfos = dependAssetInfos;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加资源的分类标签
|
||
/// 说明:原始定义的资源分类标签
|
||
/// </summary>
|
||
public void AddAssetTags(List<string> tags)
|
||
{
|
||
if (_isAddAssetTags)
|
||
throw new Exception("Should never get here !");
|
||
_isAddAssetTags = true;
|
||
|
||
foreach (var tag in tags)
|
||
{
|
||
if (AssetTags.Contains(tag) == false)
|
||
{
|
||
AssetTags.Add(tag);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加资源包的分类标签
|
||
/// 说明:传染算法统计到的分类标签
|
||
/// </summary>
|
||
public void AddBundleTags(List<string> tags)
|
||
{
|
||
foreach (var tag in tags)
|
||
{
|
||
if (BundleTags.Contains(tag) == false)
|
||
{
|
||
BundleTags.Add(tag);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 资源包名是否存在
|
||
/// </summary>
|
||
public bool HasBundleName()
|
||
{
|
||
if (string.IsNullOrEmpty(BundleName))
|
||
return false;
|
||
else
|
||
return true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加关联的资源包名称
|
||
/// </summary>
|
||
public void AddReferenceBundleName(string bundleName)
|
||
{
|
||
if (string.IsNullOrEmpty(bundleName))
|
||
throw new Exception("Should never get here !");
|
||
|
||
if (_referenceBundleNames.Contains(bundleName) == false)
|
||
_referenceBundleNames.Add(bundleName);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算共享资源包的完整包名
|
||
/// </summary>
|
||
public void CalculateShareBundleName(ISharedPackRule sharedPackRule, bool uniqueBundleName, string packageName, string shadersBundleName)
|
||
{
|
||
if (CollectorType != ECollectorType.None)
|
||
return;
|
||
|
||
if (IsRawAsset)
|
||
throw new Exception("Should never get here !");
|
||
|
||
if (IsShaderAsset)
|
||
{
|
||
BundleName = shadersBundleName;
|
||
}
|
||
else
|
||
{
|
||
if (_referenceBundleNames.Count > 1)
|
||
{
|
||
PackRuleResult packRuleResult = sharedPackRule.GetPackRuleResult(AssetPath);
|
||
BundleName = packRuleResult.GetShareBundleName(packageName, uniqueBundleName);
|
||
}
|
||
else
|
||
{
|
||
// 注意:被引用次数小于1的资源不需要设置资源包名称
|
||
BundleName = string.Empty;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断是否为冗余资源
|
||
/// </summary>
|
||
public bool IsRedundancyAsset()
|
||
{
|
||
if (HasBundleName())
|
||
return false;
|
||
|
||
return _referenceBundleNames.Count > 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取关联资源包的数量
|
||
/// </summary>
|
||
public int GetReferenceBundleCount()
|
||
{
|
||
return _referenceBundleNames.Count;
|
||
}
|
||
}
|
||
} |