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);
    }
}
相关推荐
我是唐青枫1 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
unicrom_深圳市由你创科技2 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
昵称暂无13 小时前
.NET 高级开发 | i18n 原理、实现一个 i18n 框架
javascript·c#·.net
疯狂成瘾者3 小时前
Chroma向量数据库
开发语言·数据库·c#
我是唐青枫3 小时前
C#.NET Monitor 与 Mutex 深入解析:进程内同步、跨进程互斥与使用边界
开发语言·c#·.net
ou.cs3 小时前
c# 信号量和锁的区别
开发语言·c#
yugi9878384 小时前
C# 串口下载烧写BIN文件工具
开发语言·c#
RReality4 小时前
【Unity Shader URP】序列帧动画(Sprite Sheet)实战教程
unity·游戏引擎
mxwin4 小时前
Unity URP 多线程渲染:理解 Shader 变体对加载时间的影响
unity·游戏引擎·shader
"菠萝"5 小时前
C#知识学习-021(文字关键字)
开发语言·学习·c#