You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:17:57