186 lines
6.1 KiB
C#
186 lines
6.1 KiB
C#
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;
|
||
|
||
/// <summary>
|
||
/// 构建前生成时间锁
|
||
/// </summary>
|
||
/// <param name="report"></param>
|
||
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();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成时间锁文件
|
||
/// </summary>
|
||
public void GneratorTimerLock()
|
||
{
|
||
if (File.Exists(Application.dataPath + "/TimerLock.asset"))
|
||
{
|
||
string path = "Assets/TimerLock.asset";
|
||
var asset = AssetDatabase.LoadAssetAtPath<TimerLock>(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");
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除不属于当前平台的资源
|
||
/// </summary>
|
||
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);
|
||
}
|
||
|
||
|
||
} |