Unity中IPreprocessBuildWithReport.OnPreprocessBuild执行报错求助
解决Unity构建前生成version.txt的时机问题
我完全懂你遇到的这个坑——修改Android的bundleVersionCode后第一次构建,明明version.txt已经更新了,但Unity偏要报错;可要是不改动版本号再构建一次就一切正常。这问题的核心确实和AssetDatabase.Refresh()在OnPreprocessBuild()里的执行时机有关,我来给你几个靠谱的解决方案:
方案1:强制同步刷新资源
默认的AssetDatabase.Refresh()是异步执行的,这意味着构建流程可能在资源刷新完成前就开始读取Resources文件夹的内容,导致新旧文件状态冲突。我们可以通过添加同步导入参数,让刷新操作完全完成后再进入构建环节:
using UnityEditor; using UnityEditor.Build; using UnityEditor.Build.Reporting; using System.IO; using UnityEngine; public class VersionPreprocessor : IPreprocessBuildWithReport { // 设置回调优先级为最早,确保比其他构建前置脚本先执行 public int callbackOrder => -100; public void OnPreprocessBuild(BuildReport report) { string resourcesPath = Path.Combine(Application.dataPath, "Resources"); // 确保Resources文件夹存在,避免文件写入失败 if (!Directory.Exists(resourcesPath)) { Directory.CreateDirectory(resourcesPath); } string versionFilePath = Path.Combine(resourcesPath, "version.txt"); // 写入最新的bundleVersionCode File.WriteAllText(versionFilePath, PlayerSettings.Android.bundleVersionCode.ToString()); // 强制同步刷新资源,确保Unity完全处理文件变更 AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); } }
方案2:实时监测版本号变化(从根源避免时机问题)
既然在构建回调里处理容易踩时机坑,我们可以提前一步:在编辑器运行时实时监测bundleVersionCode的变化,一旦修改就立即更新文件,等到构建时文件已经是最新状态了:
using UnityEditor; using UnityEngine; using System.IO; [InitializeOnLoad] public static class VersionAutoUpdater { private static int _lastVersionCode; static VersionAutoUpdater() { _lastVersionCode = PlayerSettings.Android.bundleVersionCode; // 编辑器每帧更新时检查版本号变化 EditorApplication.update += CheckForVersionChanges; } private static void CheckForVersionChanges() { if (PlayerSettings.Android.bundleVersionCode != _lastVersionCode) { _lastVersionCode = PlayerSettings.Android.bundleVersionCode; UpdateVersionFile(); } } private static void UpdateVersionFile() { string resourcesPath = Path.Combine(Application.dataPath, "Resources"); if (!Directory.Exists(resourcesPath)) { Directory.CreateDirectory(resourcesPath); } string versionFilePath = Path.Combine(resourcesPath, "version.txt"); File.WriteAllText(versionFilePath, _lastVersionCode.ToString()); AssetDatabase.Refresh(); } }
额外注意事项
- 确保
version.txt没有被Unity的.asset文件规则误识别,可以在文件头部添加注释避免意外。 - 如果使用版本控制(如Git),可以把
version.txt加入忽略列表,避免不必要的提交记录。 - 若仍存在问题,可以尝试清理Unity的Library文件夹,重新导入资源后再测试构建。
内容的提问来源于stack exchange,提问作者Nika Kasradze
相关产品推荐
相关产品推荐

