using XGame.Editor.Asset;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
using XGame.Framework.i18n;
namespace XGame.Editor.Build.AssetBundles
{
public class BundleContextBuilder
{
private BundleContext _context;
public BundleContext Product => _context;
public bool Build()
{
if (!CreatContext())
{
return false;
}
CollectProductAssets();
CollectTextures();
CollectBundleGroupNames();
return true;
}
private bool CreatContext()
{
//可寻址资源清单
var assetInfoManifest = AddressableHelper.LoadAssetManifest();
if (assetInfoManifest == null)
{
Debug.LogError("Can't find AddressableAssetInfoManifest.");
return false;
}
var assetInfoMap = assetInfoManifest.GetAssetInfoMapWithGUID();
_context = new BundleContext(assetInfoMap);
return true;
}
private void CollectProductAssets()
{
var productAssetsRoots = Asset.FileUtil.GetProductAssetsRoots();
var assetGuids = AssetDatabase.FindAssets("", productAssetsRoots);
foreach (var guid in assetGuids)
{
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
if (Directory.Exists(assetPath))
{
//_context.directoriesMap.Add(assetPath, guid);
continue;
}
else if (Asset.FileUtil.IsFileIgnore(assetPath))
{
continue;
}
_context.waittingAssetPaths.Add(assetPath);
}
_context.assetsRoots = productAssetsRoots;
}
private void CollectTextures()
{
var guids = AssetDatabase.FindAssets("t:Texture", new string[] { PathDefine.ResAddressableRelative, PathDefine.I18nAssetsRelative, PathDefine.ResStaticRelative });
foreach (var guid in guids)
{
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
if (string.IsNullOrEmpty(assetPath))
{
continue;
}
_context.allTexturePaths.Add(assetPath);
}
}
///
/// 收集Assetbundle分组的GroupName
///
///
///
///
private void CollectBundleGroupNames()
{
var packerManifest = ABPackerInfoManifest.Load();
if (packerManifest == null)
{
return;
}
_context.bundleNameMode = packerManifest.bundleNameMode;
_context.isMergeShader = packerManifest.isMergeShader;
if (packerManifest.GroupInfos == null || packerManifest.GroupInfos.Count < 1)
{
return;
}
var groupNameMap = _context.groupNameMap;
var directories = new HashSet();
foreach (var groupInfo in packerManifest.GroupInfos)
{
var groupName = groupInfo.groupName;
if (string.IsNullOrEmpty(groupName) || Asset.FileUtil.HasChinese(groupName))
{
Debug.LogWarning($"[XBuild]AssetbundleGroup 名字为空或者包含中文字符. ID:{groupInfo.GroupId}");
continue;
}
if (LanguageUtils.IsLanguage(groupName))
{
Debug.LogWarning($"[XBuild]AssetbundleGroup 名字不能为多语言枚举. GroupName:{groupName}");
continue;
}
groupName = groupName.ToLower();
foreach (var guid in groupInfo.guidList)
{
if (string.IsNullOrEmpty(guid))
{
continue;
}
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
if (!assetPath.StartsWith(PathDefine.ResAddressableRelative))
{
Debug.LogWarning($"[XBuild]AssetbundleGroup 路径错误. GroupName:{groupName} assetPath:{assetPath}");
continue;
}
if (Directory.Exists(assetPath))
{
directories.Add(assetPath);
////是文件夹
//var filePaths = FileUtil.FindFiles(assetPath);
//foreach (var filePath in filePaths)
//{
// AddGroupItem(filePath, groupName, groupNameMap);
//}
continue;
}
AddGroupItem(assetPath, groupName, groupNameMap);
}
if (directories.Count > 0)
{
AddGroupItem(directories.ToArray(), groupName, groupNameMap);
directories.Clear();
}
}
Debug.Log($"CollectBundleGroupNames Count:{groupNameMap.Count}");
}
private void AddGroupItem(string[] directories, string groupName, Dictionary groupNameMap)
{
var guids = AssetDatabase.FindAssets("", directories);
foreach (var guid in guids)
{
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
//if (Directory.Exists(assetPath) || FileUtil.IsFileIgnore(assetPath))
//{
// continue;
//}
AddGroupItem(assetPath, groupName, groupNameMap);
}
}
private void AddGroupItem(string assetPath, string groupName, Dictionary groupNameMap)
{
if (!_context.waittingAssetPaths.Contains(assetPath))
{
return;
}
//if (!_context.TryGetAddressableNameByPath(assetPath, out var addressableName))
//{
// return;
//}
if (groupNameMap.ContainsKey(assetPath))
{
// 先到先得
return;
}
//Debug.Log($"[XBuild]AddGroupItem addressableName:{addressableName} groupName:{groupName}");
groupNameMap.Add(assetPath, groupName);
}
}
}