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);
}
}