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 小时前
# Three.js 进阶:如何绘制"像素大小固定"的箭头?三种方案全解析
webgl·gpu
Panzer_Jack2 天前
如何用 WebGL 去实现一个选取色彩背景图片透明化小工具 - Pick Alpha
前端·webgl
Scout-leaf3 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
烛阴3 天前
Three.js 零基础入门:手把手打造交互式 3D 几何体展示系统
javascript·webgl·three.js
用户298698530143 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
叶智辽4 天前
【ThreeJS调试技巧】那些让 Bug 无所遁形的“脏套路”
webgl·three.js
mudtools4 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的5 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21885 天前
.NET 本地Db数据库-技术方案选型
windows·c#
lindexi5 天前
dotnet DirectX 通过可等待交换链降低输入渲染延迟
c#·directx·d2d·direct2d·vortice