using System.Collections.Generic;
using System.Linq;
using UnityEditor;
namespace XGame.Editor.Build.AssetBundles
{
public class AssetBundleCollector
{
private BundleContext _context;
private ShaderBundleCollector _shaderCollector;
private AtlasBundleCollector _atlasCollector;
private PackerBundleCollector _packerCollector;
private DepBundleCollector _depCollector;
private SceneBundleCollector _sceneCollector;
public AssetBundleCollector(BundleContext context, ShaderBundleCollector shaderCollector, AtlasBundleCollector atlasCollector, PackerBundleCollector packerCollector, DepBundleCollector depCollector, SceneBundleCollector sceneCollector)
{
_context = context;
_shaderCollector = shaderCollector;
_atlasCollector = atlasCollector;
_packerCollector = packerCollector;
_depCollector = depCollector;
_sceneCollector = sceneCollector;
}
///
/// 收集AssetBundle信息
///
///
///
public void CollectBundleBuilds(bool recursive)
{
//string root = PathDefine.ResAddressablePath;
//Debug.Log($"CollectBundleBuilds Path: {root}");
//List assetBundleBuilds = new List();
//List bundleNames = new List();
#region packer
//var assetBundleBuilds = new Dictionary();
//var filePaths = new List();
// 先把BuildSetting中的Scene的path加到filePaths中,在之后的收集中过滤掉
int sceneCount = EditorBuildSettings.scenes.Length;
for (int i = 0; i < sceneCount; i++)
_context.bundleAssetPaths.Add(EditorBuildSettings.scenes[i].path);
_shaderCollector.Collect();
if (_atlasCollector.Collect() && _packerCollector.Collect())
{
_atlasCollector.ToBundleBuilds();
var waittingAssetMap = new Dictionary();
foreach (var waittingFile in _context.waittingAssetPaths)
{
if (_context.bundleAssetPaths.Contains(waittingFile))
{
continue;
}
var directoryPath = waittingFile.Substring(0, waittingFile.LastIndexOf('/'));
waittingAssetMap.Add(waittingFile, directoryPath);
}
// 按文件夹名字分组
var groups = waittingAssetMap.GroupBy((a) => a.Value);
var assetPaths = new HashSet();
foreach(var group in groups)
{
var dirPath = group.Key;
foreach (var item in group)
{
assetPaths.Add(item.Key);
}
_context.AddAddressableBundle(_context.ToArrayBySort(assetPaths), AssetDatabase.AssetPathToGUID(dirPath));
assetPaths.Clear();
}
if (_context.waittingAssetPaths.Count > 0)
{
BuildLog.Error($"waittingAssetPaths 没有全部处理. 剩余数量:{_context.waittingAssetPaths.Count}");
foreach (var waittingFile in _context.waittingAssetPaths)
{
BuildLog.Error($"waittingAssetPath:{waittingFile}");
}
}
//var assetRoots = FileUtil.GetProductAssetsRoots();
//foreach (var root in assetRoots)
//{
// FileUtil.FindFiles(root, (files) =>
// {
// if (_context.bundleAssetPaths != null && _context.bundleAssetPaths.Count > 0)
// {
// //过滤已设置bundle的资源,此处待优化
// files = files.Where((file) => !_context.bundleAssetPaths.Contains(file)).ToArray();
// }
// if (files.Length > 0)
// _context.bundleBuildMap.TryAdd(_context.CreateBundleBuild(files));
// });
//}
if (recursive)
_depCollector.Collect();
}
#endregion
}
#region Scene Bundle
public bool CollectSceneBundles()
{
return _sceneCollector.Collect();
}
//public Dictionary SceneBundleBuildMap => _sceneCollector.bundleBuildMap;
//public bool MergeSceneBundles()
//{
// return _context.bundleBuildMap.TryAddRange(_sceneCollector.bundleBuildMap);
//}
#endregion
}
}