using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace XGame.Editor.Build.AssetBundles
{
public class PackerBundleCollector
{
private BundleContext _context;
private AtlasBundleCollector _atlasCollector;
public PackerBundleCollector(BundleContext context, AtlasBundleCollector atlasCollector)
{
_context = context;
_atlasCollector = atlasCollector;
}
///
/// 根据设置的分包规则收集AssetBundle信息
///
///
/// bundle信息集合
/// 收集到的bundle所包含的资源路径集合,只收集ResAddressable目录
///
public bool Collect()
{
//var tempFilePaths = new List();
var packerManifest = ABPackerInfoManifest.Load();
if (packerManifest == null)
{
return true;
}
var packerInfos = packerManifest.PackerInfos;
packerInfos.Sort();
for (int i = 0; i < packerInfos.Count; i++)
{
var info = packerInfos[i];
var assetPath = info.AssetPath;
if (!_context.IsValidPath(assetPath))
{
BuildLog.Warn($"ABPackerInfo invalid.{info}");
continue;
}
//Debug.Log($"Packer index:{i} {info} full: {System.IO.Path.GetFullPath(assetPath)}");
if (info.packerType == ABPackerType.SingleAsset)
{
//var langFlag = AddressableHelper.GetLanguageFlagByAssetPath(assetPath);
if (info.IsFile)
{
AddSingleBundle(assetPath, info.GUID);
}
else
{
var guids = AssetDatabase.FindAssets("", new string[] { assetPath });
foreach (var guid in guids)
{
AddSingleBundle(AssetDatabase.GUIDToAssetPath(guid), guid);
}
}
}
else if (info.packerType == ABPackerType.AllDirectories)
{
AddAllDirectoriesBundle(assetPath, info.GUID);
}
}
//filePaths.AddRange(tempFilePaths);
return true;
}
private void AddSingleBundle(string assetPath, string guid)
{
if (_context.waittingAssetPaths.Contains(assetPath) && _context.bundleAssetPaths.Contains(assetPath) == false && _atlasCollector.IsAtlasAssetPath(assetPath) == false)
{ // 配置了单体,但是是图集的也忽略
_context.AddAddressableBundle(new string[] { assetPath }, guid);
//var bundleName = $"single_{System.IO.Path.GetFileNameWithoutExtension(assetPath)}_{info.GUID.Substring(0, 8)}".ToLower();
//if (langFlag != Framework.i18n.LanguageType.NONE)
//{
// bundleName = $"{langFlag.ToString().ToLower()}/{bundleName}";
//}
//_context.bundleBuildMap.TryAdd(_context.CreateBundleBuild(new string[] { assetPath }, bundleName.ToLower()));
}
}
private HashSet _tempAssetPaths = new HashSet();
private void AddAllDirectoriesBundle(string directoryPath, string directoryGuid)
{
var guids = AssetDatabase.FindAssets("", new string[] { directoryPath });
foreach (var fileGuid in guids)
{
var filePath = AssetDatabase.GUIDToAssetPath(fileGuid);
if (_context.waittingAssetPaths.Contains(filePath) && _context.bundleAssetPaths.Contains(filePath) == false && _tempAssetPaths.Contains(filePath) == false)
{
if (_atlasCollector.IsAtlasAssetPath(filePath))
{
_tempAssetPaths.UnionWith(_atlasCollector.PopAtlasAssetPaths(filePath));
}
else
{
_tempAssetPaths.Add(filePath);
}
}
}
if (_tempAssetPaths.Count > 0)
{
_context.AddAddressableBundle(_context.ToArrayBySort(_tempAssetPaths), directoryGuid);
_tempAssetPaths.Clear();
}
else
{
BuildLog.Warn($"Packer config invalid.Path:{directoryPath} GUID:{directoryGuid}");
}
}
}
}