Webgl打包后删除StreamingAssets文件夹下多余资源

csharp 复制代码
该脚本使用环境:
删除StreamingAssets文件夹下多余文件:
例如:当前项目可打包多个岗位的webgl包,但Build当前岗位webgl包中不需要包含其他岗位中的ab和video
相关资源,则需要在打包完成后自动删除无用资源

(int)gameEntry.MEnumProcessType:表示当前岗位的枚举类型
csharp 复制代码
using System.IO;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;

public class WebGLBuildProcessor: IPostprocessBuildWithReport, IPreprocessBuildWithReport
{

    public static void OnPostprocessBuild(BuildReport report)
    {
        // 检查是否是 WebGL 平台
        if (report.summary.platform != BuildTarget.WebGL)
        {
            Debug.LogWarning("This processor is designed for WebGL platform only");
            return;
        }

        Debug.Log("WebGL build processor started");

        // 从EditorPrefs获取processType
        int processType = EditorPrefs.GetInt(EDITOR_PREF_KEY, -1);
        // 获取后删除
        EditorPrefs.DeleteKey(EDITOR_PREF_KEY);


        Debug.Log($"Process type: {processType}");

        // 删除对应条件的文件
        DeleteSpecificFiles(report, processType);

        // 删除Video文件夹中不符合条件的文件夹
        CleanVideoFolders(report, processType);

        Debug.Log("WebGL build processor completed");
    }

    private static int GetProcessTypeFromScene()
    {
        // 查找场景中的GameEntry对象
        GameEntry gameEntry = Object.FindObjectOfType<GameEntry>();

        if (gameEntry != null)
        {
            Debug.Log($"Found GameEntry with process type: {gameEntry.MEnumProcessType}");
            return (int)gameEntry.MEnumProcessType;
        }

        Debug.LogWarning("未找到GameEntry对象");
        return -1; // 表示未找到
    }


    private static void DeleteSpecificFiles(BuildReport report, int processType)
    {
        try
        {
            // 将processType转换为字符串
            string processTypeStr = processType.ToString();

            // WebGL构建的特殊路径处理
            string rootPath = Path.Combine(
                report.summary.outputPath
            );

            Debug.Log($"Searching in: {rootPath}");

            // 获取所有文件
            string[] allFiles = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);

            int deletedCount = 0;
            int keptCount = 0;

            foreach (string file in allFiles)
            {
                string fileName = Path.GetFileName(file);
                if (fileName.Contains($"anli_"))
                {
                    if (fileName.Contains($"anli_{processTypeStr}"))
                    {
                        // 保留包含正确processType的文件
                        keptCount++;
                        Debug.Log($"Keeping file: {file}");
                    }
                    else
                    {
                        // 删除不包含正确processType的文件
                        File.Delete(file);
                        Debug.Log($"Deleted file: {file}");
                        deletedCount++;
                    }
                }
            }
            Debug.Log($"共删除了 {deletedCount} 个文件,保留了 {keptCount} 个文件");
        }
        catch (System.Exception e)
        {
            Debug.LogError($"删除文件时出错: {e.Message}");
        }
    }

    private static void CleanVideoFolders(BuildReport report, int processType)
    {
        // WebGL构建的特殊路径处理
        string videoFolderPath = Path.Combine(
            report.summary.outputPath,
            "StreamingAssets",
            "Video"
        );

        Debug.Log($"Checking video folder: {videoFolderPath}");

        if (!Directory.Exists(videoFolderPath))
        {
            Debug.LogWarning($"Video文件夹不存在: {videoFolderPath}");
            return;
        }

        // 获取所有文件夹
        string[] folders = Directory.GetDirectories(videoFolderPath);

        int deletedCount = 0;
        int keptCount = 0;

        foreach (string folder in folders)
        {
            string folderName = Path.GetFileName(folder);

            // 如果文件夹名等于processType的字符串表示,则保留
            if (folderName == processType.ToString())
            {
                keptCount++;
                Debug.Log($"Keeping folder: {folder}");
            }
            else
            {
                // 删除其他文件夹
                Directory.Delete(folder, true);
                Debug.Log($"Deleted folder: {folder}");
                deletedCount++;
            }
        }

        Debug.Log($"共删除了 {deletedCount} 个文件夹,保留了 {keptCount} 个文件夹");
    }

    public int callbackOrder { get; }

    private static string EDITOR_PREF_KEY = "WebGLBuildProcessor_ProcessType";

    public void OnPreprocessBuild(BuildReport report)
    {
        // 只在WebGL平台预处理
        if (report.summary.platform != BuildTarget.WebGL)
            return;

        Debug.Log("WebGL build preprocessor started");

        // 从当前场景中获取processType
        int processType = GetProcessTypeFromScene();

        // 保存到EditorPrefs
        EditorPrefs.SetInt(EDITOR_PREF_KEY, processType);

        Debug.Log($"Saved process type: {processType} to EditorPrefs");
    }

    void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport report)
    {
        OnPostprocessBuild(report);
    }
}
相关推荐
无风听海18 小时前
C# 中对象相等性判断的全面解析
开发语言·c#
寻星探路18 小时前
【Python 全栈测开之路】Python 基础语法精讲(三):函数、容器类型与文件处理
java·开发语言·c++·人工智能·python·ai·c#
寻星探路19 小时前
【Python 全栈测开之路】Python 进阶:库的使用与第三方生态(标准库+Pip+实战)
java·开发语言·c++·python·ai·c#·pip
kylezhao20191 天前
C#winform数据绑定
c#
爱吃西红柿鸡蛋面1 天前
JsonHelper使用
c#
故事不长丨1 天前
C#线程编程全解析:从基础应用到高级实践
c#·线程·多线程·thread·线程同步·异步编程·线程锁
xiaowu0802 天前
C#调用 C++ DLL 加载地址方式选择
开发语言·c++·c#
在路上看风景2 天前
1.2 Unity资源分类
unity·游戏引擎
one named slash2 天前
BMFont在Unity中生成艺术字
unity·游戏引擎
码农学院2 天前
使用腾讯翻译文本
服务器·数据库·c#