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);
    }
}
相关推荐
咸鱼永不翻身15 小时前
Lua脚本事件检查工具
unity·lua·工具
njsgcs16 小时前
solidworks自动标注折弯4 无向图 c#
开发语言·c#·solidworks
leo__52016 小时前
单载波中继系统资源分配算法MATLAB仿真程序
算法·matlab·unity
我是唐青枫17 小时前
C#.NET ThreadLocal 深入解析:线程独享数据、性能收益与实战边界
c#·.net
努力长头发的程序猿18 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin18 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
小贺儿开发18 小时前
Unity3D 智能云端数字标牌系统
unity·阿里云·人机交互·视频·oss·广告·互动
JQLvopkk18 小时前
C# 工业级上位机:交互实战
开发语言·c#·交互
魔士于安18 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
魔士于安19 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型