littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

Unity でビルド時に自動でバージョンに日付を付与する

Unity でビルド時に自動でバージョンに日付を付与するEditor拡張

PlayerSettings.bundleVersion が0.1の時 ビルド時に 0.1.yyyymmddに変更します。

ビルド完了時、もしくはエラー発生時に PlayerSettings.bundleVersion を元に戻します。

Magic Leapの場合は PlayerSettings.Lumin.versionName も合わせて更新している。

#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;

public class BuildVersionWithDate : IPreprocessBuildWithReport, IPostprocessBuildWithReport
{
    public static string date = DateTime.Now.ToString("yyyyMMdd");
    private string baseVersion;
    private string baseLuminVersionName;
    private BuildTarget baseTarget;
    /// ビルド前処理
    public void OnPreprocessBuild(BuildReport _report)
    {
        Application.logMessageReceived += OnBuildError;
        baseVersion = PlayerSettings.bundleVersion;
        //バージョンに日付を付与する
        PlayerSettings.bundleVersion = $"{baseVersion}.{date}";
        baseTarget = _report.summary.platform;

        //MagicLeapはLumin.versionNameも更新
        if (baseTarget == BuildTarget.Lumin)
        {
            baseLuminVersionName = PlayerSettings.Lumin.versionName;
            PlayerSettings.Lumin.versionName = PlayerSettings.bundleVersion;
        }
    }

    /// ビルド後処理
    public void OnPostprocessBuild(BuildReport _report)
    {
        Restore();
    }


    private void OnBuildError(string condition, string stackTrace, LogType type)
    {
        if (type == LogType.Error)
        {
            Restore();
        }
    }

    //Rollback
    private void Restore()
    {
        Application.logMessageReceived -= OnBuildError;

        //バージョンを元に戻す
        PlayerSettings.bundleVersion = baseVersion;

        if (baseTarget == BuildTarget.Lumin)
        {
            PlayerSettings.Lumin.versionName = baseLuminVersionName;
        }

        AssetDatabase.SaveAssets();
    }

    // 開発モードか?
    private bool isDevelopment(BuildReport report)
    {
        return (report.summary.options & BuildOptions.Development) != 0;
    }

    ///  実行順
    ///  MagicLeapにおいて、versionNameを動的に設定するために
    ///  MagicLeapManifestBuildProcessorより先に実行したいため-1を設定する
    public int callbackOrder { get { return -1; } }

}

#endif