using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.U2D; using UnityEngine.U2D; namespace XGame.Editor.Build.AssetBundles { public class AtlasBundleCollector { private class AtlasInfo { public string key; public string[] assetPaths; } private BundleContext _context; /// /// key: sprite的assetPath /// value:AtlasInfos /// private Dictionary _atlasInfoMap; public AtlasBundleCollector(BundleContext context) { _context = context; _atlasInfoMap = new Dictionary(); } public bool Collect() { var directories = Asset.FileUtil.GetAtlasRoots(); var assetPaths = new HashSet(); var registedPaths = new HashSet(); //图集的alpha texture信息 //var atlasAlphaMap = AtlasHelper.GetAtlasAlphaTextureMap(); var guids = AssetDatabase.FindAssets("t:SpriteAtlas", directories); foreach (var guid in guids) { var atlasPath = AssetDatabase.GUIDToAssetPath(guid); var atlas = AssetDatabase.LoadAssetAtPath(atlasPath); //Debug.Log($"atlasPath:{atlasPath} name:{atlas.name}", atlas); var objs = atlas.GetPackables(); foreach (var obj in objs) { var assetPath = AssetDatabase.GetAssetPath(obj); if (Directory.Exists(assetPath)) { //是文件夹 var temps = Asset.FileUtil.FindFiles(assetPath, Asset.FileUtil.texturePatterns, SearchOption.TopDirectoryOnly); foreach (var temp in temps) { if (!registedPaths.Contains(temp) && !assetPaths.Contains(temp)) { registedPaths.Add(temp); assetPaths.Add(temp); } } } else if (!registedPaths.Contains(assetPath) && !assetPaths.Contains(assetPath)) { // 贴图 registedPaths.Add(assetPath); assetPaths.Add(assetPath); } } //if (!_context.filePaths.Contains(atlasPath) && !assetPaths.Contains(atlasPath)) //{ // // SpriteAtlas文件,sbp打包依赖该文件过滤贴图的原始文件,因此该文件也需要参与打包 // assetPaths.Add(atlasPath); // _context.filePaths.Add(atlasPath); //} //alpha texture也打包进图集 //if (atlasAlphaMap.TryGetValue(atlas.name, out var alphaTextureGUIDs)) //{ // foreach (var alphaGUID in alphaTextureGUIDs) // { // var alphaAssetPath = AssetDatabase.GUIDToAssetPath(alphaGUID); // Debug.Log($"Atals Alpha Texture Path:{alphaAssetPath}", AssetDatabase.LoadMainAssetAtPath(alphaAssetPath)); // if (!_context.filePaths.Contains(alphaAssetPath) && !assetPaths.Contains(alphaAssetPath)) // { // assetPaths.Add(alphaAssetPath); // _context.filePaths.Add(alphaAssetPath); // } // } //} if (assetPaths.Count > 0) { var assetNames = _context.ToArrayBySort(assetPaths); assetPaths.Clear(); if (atlasPath.Contains(_context.ResStaticDir)) { _context.AddRawAssetBundle(assetNames, guid, false); } else { // 允许Addressable的图集合并打在同一个ab里 var info = new AtlasInfo() { key = guid, assetPaths = assetNames }; foreach (var assetPath in assetNames) { _atlasInfoMap.Add(assetPath, info); } // TODO //_context.bundleBuildMap.TryAdd(_context.CreateBundleBuild(assetNames)); } } } return true; } public bool IsAtlasAssetPath(string assetPath) { return _atlasInfoMap.ContainsKey(assetPath); } public string[] PopAtlasAssetPaths(string assetPath) { var info = _atlasInfoMap[assetPath]; foreach (var path in info.assetPaths) { _atlasInfoMap.Remove(path); } return info.assetPaths; } /// /// 处理剩余的Addressable的图集 /// public void ToBundleBuilds() { var values = _atlasInfoMap.Values.Distinct(); foreach (var info in values) { _context.AddAddressableBundle(info.assetPaths, info.key); } _atlasInfoMap.Clear(); } } }