327 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			327 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
using System.Collections.Generic;
 | 
						|
using System.IO;
 | 
						|
using TEngine.Editor.Resource;
 | 
						|
using UnityEditor;
 | 
						|
using UnityEditor.U2D;
 | 
						|
using UnityEngine;
 | 
						|
using UnityEngine.U2D;
 | 
						|
using YooAsset.Editor;
 | 
						|
 | 
						|
public static class BuildBundlesHelper
 | 
						|
{
 | 
						|
    private static BuildParameters GetParametersFromParams(BuildTarget buildTarget, string buildVersion)
 | 
						|
    {
 | 
						|
        BuildParameters buildParameters = new BuildParameters()
 | 
						|
        {
 | 
						|
            StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot(),
 | 
						|
            BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(),
 | 
						|
            BuildTarget = buildTarget,
 | 
						|
            BuildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline,
 | 
						|
            BuildMode = AssetBundleBuilderSettingData.Setting.BuildMode,
 | 
						|
            PackageName = AssetBundleBuilderSettingData.Setting.BuildPackage,
 | 
						|
            PackageVersion = buildVersion,
 | 
						|
            VerifyBuildingResult = true,
 | 
						|
            SharedPackRule = new ZeroRedundancySharedPackRule(),
 | 
						|
            EncryptionServices = new FileStreamEncryption(),
 | 
						|
            CompressOption = AssetBundleBuilderSettingData.Setting.CompressOption,
 | 
						|
            OutputNameStyle = AssetBundleBuilderSettingData.Setting.OutputNameStyle,
 | 
						|
            CopyBuildinFileOption = ECopyBuildinFileOption.None,
 | 
						|
            CopyBuildinFileTags = AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags,
 | 
						|
            EnableLog = false,
 | 
						|
        };
 | 
						|
 | 
						|
        if (AssetBundleBuilderSettingData.Setting.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
 | 
						|
        {
 | 
						|
            buildParameters.SBPParameters = new BuildParameters.SBPBuildParameters();
 | 
						|
            buildParameters.SBPParameters.WriteLinkXML = true;
 | 
						|
        }
 | 
						|
 | 
						|
        return buildParameters;
 | 
						|
    }
 | 
						|
 | 
						|
    [MenuItem("Tools/TestBuildBundles")]
 | 
						|
    public static void TestBuildBundles()
 | 
						|
    {
 | 
						|
        
 | 
						|
        Debug.LogWarning("MakeAtlas Start ==================");
 | 
						|
        MakeAtlas();
 | 
						|
        AssetDatabase.Refresh();
 | 
						|
        Debug.LogWarning("MakeAtlas End ==================");
 | 
						|
        
 | 
						|
        Debug.LogWarning("Create YooAsset Package Start ==========");
 | 
						|
        CreateYooAssetPackage();
 | 
						|
        AssetDatabase.Refresh();
 | 
						|
        Debug.LogWarning("Create YooAsset Package End ==========");
 | 
						|
     
 | 
						|
        Debug.LogWarning("BuildBundles Start ==================");
 | 
						|
        AssetBundleCollectorSetting setting = AssetDatabase.LoadAssetAtPath<AssetBundleCollectorSetting>("Assets/AssetBundleCollectorSetting.asset");
 | 
						|
        if (setting == null)
 | 
						|
        {
 | 
						|
            Debug.LogError("不存在的AssetBundleCollectorSetting.asset");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        var bundleBuilder = new AssetBundleBuilder();
 | 
						|
        BuildParameters buildParameters = GetParametersFromParams(BuildTarget.Android, "1.0.0");
 | 
						|
        string outputDir = $"{buildParameters.BuildOutputRoot}/{buildParameters.BuildTarget.ToString()}";
 | 
						|
        Debug.LogError($"bundle资源输出目录:{outputDir}");
 | 
						|
        if (Directory.Exists(outputDir))
 | 
						|
            Directory.Delete(outputDir, true);
 | 
						|
 | 
						|
        for (int i = 0; i < setting.Packages.Count; i++)
 | 
						|
        {
 | 
						|
            var package = setting.Packages[i];
 | 
						|
            if(package.PackageName == "DefaultPackage")
 | 
						|
                continue;
 | 
						|
 | 
						|
            buildParameters.PackageName = package.PackageName;
 | 
						|
            bundleBuilder.Run(buildParameters);
 | 
						|
        }
 | 
						|
        Debug.LogWarning("BuildBundles End ==================");
 | 
						|
    }
 | 
						|
 | 
						|
    public static void BuildBundles()
 | 
						|
    {
 | 
						|
        Debug.LogWarning("MakeAtlas Start ==================");
 | 
						|
        MakeAtlas();
 | 
						|
        AssetDatabase.Refresh();
 | 
						|
        Debug.LogWarning("MakeAtlas End ==================");
 | 
						|
        
 | 
						|
        Debug.LogWarning("Create YooAsset Package Start ==========");
 | 
						|
        CreateYooAssetPackage();
 | 
						|
        AssetDatabase.Refresh();
 | 
						|
        Debug.LogWarning("Create YooAsset Package End ==========");
 | 
						|
        
 | 
						|
        Debug.LogWarning("BuildBundles Start ==================");
 | 
						|
        AssetBundleCollectorSetting setting = AssetDatabase.LoadAssetAtPath<AssetBundleCollectorSetting>("Assets/AssetBundleCollectorSetting.asset");
 | 
						|
        if (setting == null)
 | 
						|
        {
 | 
						|
            Debug.LogError("不存在的AssetBundleCollectorSetting.asset");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        BuildParams bp = BuildParamsHelper.GetBuildParams();
 | 
						|
        bp.Description();
 | 
						|
        var bundleBuilder = new AssetBundleBuilder();
 | 
						|
        BuildParameters buildParameters = null;
 | 
						|
        if (bp.Platform == "Android")
 | 
						|
            buildParameters = GetParametersFromParams(BuildTarget.Android, bp.BuildVersion);
 | 
						|
        else if (bp.Platform == "iOS")
 | 
						|
            buildParameters = GetParametersFromParams(BuildTarget.iOS, bp.BuildVersion);
 | 
						|
        if (buildParameters == null)
 | 
						|
        {
 | 
						|
            Debug.LogError($"不支持的平台:{bp.Platform}");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        
 | 
						|
        string outputDir = $"{buildParameters.BuildOutputRoot}/{buildParameters.BuildTarget.ToString()}";
 | 
						|
        Debug.LogError($"bundle资源输出目录:{outputDir}");
 | 
						|
        if (Directory.Exists(outputDir))
 | 
						|
            Directory.Delete(outputDir, true);
 | 
						|
        
 | 
						|
        for (int i = 0; i < setting.Packages.Count; i++)
 | 
						|
        {
 | 
						|
            var package = setting.Packages[i];
 | 
						|
            if(package.PackageName == "DefaultPackage")
 | 
						|
                continue;
 | 
						|
 | 
						|
            buildParameters.PackageName = package.PackageName;
 | 
						|
            bundleBuilder.Run(buildParameters);
 | 
						|
        }
 | 
						|
        Debug.LogWarning("BuildBundles End ==================> exe");
 | 
						|
    }
 | 
						|
 | 
						|
    #region 创建图集
 | 
						|
    
 | 
						|
    private static void MakeAtlas()
 | 
						|
    {
 | 
						|
        for (int i = 0; i < (int)GamePlay.end; i++)
 | 
						|
        {
 | 
						|
            GamePlay playType = (GamePlay)i;
 | 
						|
            string dir = $"Assets/AssetRaw/UIRaw/Raw/Level/{playType.ToString()}";
 | 
						|
            if (!AssetDatabase.IsValidFolder(dir))
 | 
						|
            {
 | 
						|
                Debug.LogError($"不存在的目录:{dir}");
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            
 | 
						|
            var playTypeAllLevelDirs = AssetDatabase.GetSubFolders(dir);
 | 
						|
            foreach (var levelDir in playTypeAllLevelDirs)
 | 
						|
            {
 | 
						|
                string levelName = levelDir.Substring(levelDir.LastIndexOf('/') + 1);
 | 
						|
                MakeLevelAtlas(levelDir, levelName);
 | 
						|
                string itemDirPath = $"{levelDir}/titem";
 | 
						|
                if (!AssetDatabase.IsValidFolder(itemDirPath))
 | 
						|
                {
 | 
						|
                    Debug.LogError($"不存在的道具图:{itemDirPath}");
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
                MakeItemAtlas(itemDirPath, levelName);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static void MakeItemAtlas(string dirPath, string levelName)
 | 
						|
    {
 | 
						|
        string[] allPics = Directory.GetFiles(dirPath, "*.png", SearchOption.TopDirectoryOnly);
 | 
						|
        if (allPics.Length == 0)
 | 
						|
        {
 | 
						|
            Debug.LogError($"不存在的道具图:{dirPath}");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        
 | 
						|
        List<Sprite> sprites = new List<Sprite>();
 | 
						|
        foreach (var picPath in allPics)
 | 
						|
        {
 | 
						|
            if(picPath.EndsWith(".meta"))
 | 
						|
                continue;
 | 
						|
 | 
						|
            if (picPath.Contains("_titem_"))
 | 
						|
            {
 | 
						|
                var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(picPath);
 | 
						|
                if (sprite != null)
 | 
						|
                {
 | 
						|
                    sprites.Add(sprite);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        AtlasUtils.CreateAtlas($"{levelName}_atlasItem", sprites, dirPath);
 | 
						|
    }
 | 
						|
 | 
						|
    private static void MakeLevelAtlas(string levelDir, string levelName)
 | 
						|
    {
 | 
						|
        string[] allPics = Directory.GetFiles(levelDir, "*.png", SearchOption.TopDirectoryOnly);
 | 
						|
        if (allPics.Length == 0)
 | 
						|
        {
 | 
						|
            Debug.LogError($"不存在的关卡图:{levelDir}");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        List<Sprite> sprites = new List<Sprite>();
 | 
						|
        foreach (var picPath in allPics)
 | 
						|
        {
 | 
						|
            if(picPath.EndsWith(".meta"))
 | 
						|
                continue;
 | 
						|
 | 
						|
            if (picPath.Contains("_tfull_") || picPath.Contains("_tmask_") || picPath.Contains("_tlight_") || picPath.Contains("_tshadow_"))
 | 
						|
            {
 | 
						|
                var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(picPath);
 | 
						|
                if (sprite != null)
 | 
						|
                {
 | 
						|
                    sprites.Add(sprite);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        AtlasUtils.CreateAtlas($"{levelName}_atlasLevel", sprites, levelDir);
 | 
						|
    }
 | 
						|
    
 | 
						|
    #endregion
 | 
						|
 | 
						|
    private static void CreateYooAssetPackage()
 | 
						|
    {
 | 
						|
        AssetBundleCollectorSetting setting = AssetDatabase.LoadAssetAtPath<AssetBundleCollectorSetting>("Assets/AssetBundleCollectorSetting.asset");
 | 
						|
        if (setting == null)
 | 
						|
        {
 | 
						|
            Debug.LogError("不存在的AssetBundleCollectorSetting.asset");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        //重置配置
 | 
						|
        for (int i = 0; i < setting.Packages.Count; i++)
 | 
						|
        {
 | 
						|
            if(setting.Packages[i].PackageName == "DefaultPackage")
 | 
						|
                continue;
 | 
						|
            
 | 
						|
            setting.Packages.RemoveAt(i);
 | 
						|
            i--;
 | 
						|
        }
 | 
						|
        Debug.Log($"packge count:{setting.Packages.Count}");
 | 
						|
        
 | 
						|
        //创建关卡资源package
 | 
						|
        for (int i = 0; i < (int)GamePlay.end; i++)
 | 
						|
        {
 | 
						|
            GamePlay playType = (GamePlay)i;
 | 
						|
            string dir = $"Assets/AssetRaw/UIRaw/Raw/Level/{playType.ToString()}";
 | 
						|
            if (!AssetDatabase.IsValidFolder(dir))
 | 
						|
            {
 | 
						|
                Debug.LogError($"不存在的目录:{dir}");
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            
 | 
						|
            var playTypeAllLevelDirs = AssetDatabase.GetSubFolders(dir);
 | 
						|
            foreach (var levelDir in playTypeAllLevelDirs)
 | 
						|
            {
 | 
						|
                string levelName = levelDir.Substring(levelDir.LastIndexOf('/') + 1);
 | 
						|
                AssetBundleCollectorPackage package = new AssetBundleCollectorPackage();
 | 
						|
                package.PackageName = levelName;
 | 
						|
                package.PackageDesc = $"{levelName}关卡资源包";
 | 
						|
                package.Groups = new List<AssetBundleCollectorGroup>();
 | 
						|
                
 | 
						|
                AssetBundleCollectorGroup group = new AssetBundleCollectorGroup();
 | 
						|
                group.GroupName = "default";
 | 
						|
                group.AssetTags = levelName;
 | 
						|
                group.ActiveRuleName = "EnableGroup";
 | 
						|
                group.Collectors = new List<AssetBundleCollector>();
 | 
						|
                
 | 
						|
                AssetBundleCollector collector = new AssetBundleCollector();
 | 
						|
                collector.CollectPath = levelDir;
 | 
						|
                collector.CollectorGUID = AssetDatabase.AssetPathToGUID(collector.CollectPath);
 | 
						|
                collector.CollectorType = ECollectorType.MainAssetCollector;
 | 
						|
                collector.AddressRuleName = nameof(AddressByFileName);
 | 
						|
                collector.PackRuleName = nameof(PackCollector);
 | 
						|
                collector.FilterRuleName = nameof(CollectAll);
 | 
						|
                collector.AssetTags = levelName;
 | 
						|
                
 | 
						|
                group.Collectors.Add(collector);
 | 
						|
                package.Groups.Add(group);
 | 
						|
                
 | 
						|
                setting.Packages.Add(package);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        //创建关卡缩略图package
 | 
						|
        for (int i = 0; i < (int)GamePlay.end; i++)
 | 
						|
        {
 | 
						|
            GamePlay playType = (GamePlay)i;
 | 
						|
            string dir = $"Assets/AssetRaw/UIRaw/Raw/Thum/{playType.ToString()}";
 | 
						|
            if (!AssetDatabase.IsValidFolder(dir))
 | 
						|
            {
 | 
						|
                Debug.LogError($"不存在的目录:{dir}");
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            
 | 
						|
            var thumFiles = Directory.GetFiles(dir);
 | 
						|
            foreach (var thumFile in thumFiles)
 | 
						|
            {
 | 
						|
                if(thumFile.EndsWith(".meta"))
 | 
						|
                    continue;
 | 
						|
                
 | 
						|
                string levelName = Path.GetFileNameWithoutExtension(thumFile);
 | 
						|
                AssetBundleCollectorPackage package = new AssetBundleCollectorPackage();
 | 
						|
                package.PackageName = levelName;
 | 
						|
                package.PackageDesc = $"{levelName}缩略图资源包";
 | 
						|
                package.Groups = new List<AssetBundleCollectorGroup>();
 | 
						|
                
 | 
						|
                AssetBundleCollectorGroup group = new AssetBundleCollectorGroup();
 | 
						|
                group.GroupName = "default";
 | 
						|
                group.AssetTags = levelName;
 | 
						|
                group.ActiveRuleName = "EnableGroup";
 | 
						|
                group.Collectors = new List<AssetBundleCollector>();
 | 
						|
                
 | 
						|
                AssetBundleCollector collector = new AssetBundleCollector();
 | 
						|
                collector.CollectPath = thumFile;
 | 
						|
                collector.CollectorGUID = AssetDatabase.AssetPathToGUID(collector.CollectPath);
 | 
						|
                collector.CollectorType = ECollectorType.MainAssetCollector;
 | 
						|
                collector.AddressRuleName = nameof(AddressByFileName);
 | 
						|
                collector.PackRuleName = nameof(PackDirectory);
 | 
						|
                collector.FilterRuleName = nameof(CollectAll);
 | 
						|
                collector.AssetTags = levelName;
 | 
						|
                
 | 
						|
                group.Collectors.Add(collector);
 | 
						|
                package.Groups.Add(group);
 | 
						|
                
 | 
						|
                setting.Packages.Add(package);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        AssetDatabase.SaveAssetIfDirty(setting);
 | 
						|
    }
 | 
						|
} |