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 { public int callbackOrder => 0; 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); // 生成时间锁 GneratorTimerLock(); } /// /// 生成时间锁文件 /// 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); } }