using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
public class VirtualFPostProcess : IPostprocessBuildWithReport, IPreprocessBuildWithReport
{
public int callbackOrder => 0;
///
/// 构建前生成时间锁
///
///
public void OnPreprocessBuild(BuildReport report)
{
// 生成时间锁
GneratorTimerLock();
}
public void OnPostprocessBuild(BuildReport report)
{
string projectPath = Application.dataPath;
string dataFolderPath = Path.Combine(projectPath, "../Data");
string buildOutputPath = GetValidBuildPath(report);
if (Directory.Exists(dataFolderPath))
{
// 目标目录强制小写
string targetDataPath = Path.Combine(buildOutputPath, "Data");
CopyDirectoryWithLowerCaseNames(dataFolderPath, targetDataPath);
Debug.Log($"数据目录已复制到: {targetDataPath}");
}
else
{
Debug.LogWarning("未找到数据目录: " + dataFolderPath);
}
DeletAssetBundle(buildOutputPath);
AssetDatabase.Refresh();
}
///
/// 生成时间锁文件
///
public void GneratorTimerLock()
{
if (File.Exists(Application.dataPath + "/TimerLock.asset"))
{
string path = "Assets/TimerLock.asset";
var asset = AssetDatabase.LoadAssetAtPath(path);
if (asset != null)
{
if (string.IsNullOrEmpty(asset.time) == false)
{
//第一次获取获取系统时间
DateTime currentDateTime = DateTime.Now;
string RecordData = currentDateTime.ToString("yyyy-MM-dd HH:mm:ss");
string strMerge = asset.time + "|" + RecordData;
EncryptFileCreator.EncryptAndSaveData(strMerge, "Timer.txt");
}
}
}
}
///
/// 删除不属于当前平台的资源
///
public void DeletAssetBundle(string buildOutPutPath)
{
if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.WebGL)
{
string path = Path.Combine(buildOutPutPath, "StreamingAssets", "AssetBundles");
if (Directory.Exists(path))
{
string[] allDirectories = Directory.GetDirectories(path);
foreach (string dir in allDirectories)
{
string dirName = Path.GetFileName(dir);
if (!dirName.Equals("WebGL", StringComparison.OrdinalIgnoreCase)) // 忽略大小写
{
try
{
Directory.Delete(dir, true);
Debug.Log($"Deleted directory: {dir}");
}
catch (Exception e)
{
Debug.LogError($"Failed to delete {dir}: {e.Message}");
}
}
}
}
else
{
Debug.LogError($"Directory not found: {path}");
}
}
else if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows || EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows64)
{
string path = Path.Combine(buildOutPutPath, "VirtualFramwork_Data", "StreamingAssets", "AssetBundles");
if (Directory.Exists(path))
{
string[] allDirectories = Directory.GetDirectories(path);
foreach (string dir in allDirectories)
{
string dirName = Path.GetFileName(dir);
if (!dirName.Equals("Windows", StringComparison.OrdinalIgnoreCase)) // 忽略大小写
{
try
{
Directory.Delete(dir, true);
Debug.Log($"Deleted directory: {dir}");
}
catch (Exception e)
{
Debug.LogError($"Failed to delete {dir}: {e.Message}");
}
}
}
}
else
{
Debug.LogError($"Directory not found: {path}");
}
}
}
private string GetValidBuildPath(BuildReport report)
{
string path = report.summary.outputPath;
if (path.Contains(".exe"))
{
return Path.GetDirectoryName(path);
}
return path;
}
private void CopyDirectoryWithLowerCaseNames(string sourceDir, string targetDir)
{
// 创建小写目标目录
//var lowerTargetDir = ConvertToLowerPath(targetDir);
Directory.CreateDirectory(targetDir);
// 复制文件(带小写转换)
foreach (var file in Directory.GetFiles(sourceDir))
{
string fileName = Path.GetFileName(file);
// 暂时废弃小写转换
//string lowerName = ConvertToLowerPath(fileName);
File.Copy(file, Path.Combine(targetDir, fileName), true);
}
// 递归处理子目录(带小写转换)
foreach (var dir in Directory.GetDirectories(sourceDir))
{
string dirName = Path.GetFileName(dir);
// 暂时废弃小写转换
//string lowerDirName = ConvertToLowerPath(dirName);
CopyDirectoryWithLowerCaseNames(dir, Path.Combine(targetDir, dirName));
}
}
// 中英文混合路径转小写
private string ConvertToLowerPath(string input)
{
char[] chars = input.ToCharArray();
for (int i = 0; i < chars.Length; i++)
{
// 只处理ASCII字母字符(中文等Unicode字符保持不变)
if (chars[i] >= 'A' && chars[i] <= 'Z')
{
chars[i] = (char)(chars[i] | 0x20); // 快速转小写
}
}
return new string(chars);
}
}