【Unity】ビルド設定を ScriptableObject で管理してみた(複数バージョンのビルド切り替えがラクに)

Unity

前回の記事で、WebGLビルドを楽にするためにメニューから一発でビルドできるような仕組み作りにチャレンジしてみました。

他にも何か良い手段がないかな?と考えてみたところ、
非エンジニアの方や極力コードを触らずに設定を変更したい等であれば、ScriptableObjectを使うのもアリなんじゃないかと思って試してみることにしました。

ScriptableObjectを使ったビルド設定管理

どういうことなの?って話ですが、簡単にまとめると、ハードコーディングしてた設定部分をScriptableObjectとして外出しにして、処理は共通処理で済ませちゃおうということです。

もちろん共通処理の部分や設定ファイルとかはコードを書く必要がありますが、設定の追加や修正は別ファイルになっている、というだけで気持ち的に違ったりするのかな?と思ったり…
(私個人としてはコードに直接設定を書いていくことに抵抗が全く無い派閥の人間なので、そういう方もいるんじゃ無いかな?という妄想の元書いております)

とりあえずこういうメリットがあるはず!多分、おそらく、きっと…

  • スクリプトの中に直接書かなくてOK
  • 必要な設定を複数作って、切り替えるだけ
  • 非エンジニアの方、デザイナー、企画でも扱える(かも)

ということで早速実装を進めてみましょう。

① ビルド設定用の ScriptableObject を作成

まずは BuildConfig という名前の ScriptableObject を作ります。

using UnityEngine;

[CreateAssetMenu(fileName = "BuildConfig", menuName = "Build/BuildConfig")]
public class BuildConfig : ScriptableObject
{
    public string productName;
    public string bundleVersion;
    public int defaultWidth = 800;
    public int defaultHeight = 600;
    public string[] scenePaths;
    public string outputFolder;
}

このオブジェクトに必要な設定をまとめて保存しておけます。

② 設定ファイルを読み込んでビルドするスクリプトを用意

次に、ScriptableObject を読み込んでビルドを行うエディタスクリプトを作成します。

using UnityEditor;
using UnityEngine;
using System.IO;

public class BuildRunner
{
    [MenuItem("Build/WebGL/Build With Config")]
    public static void BuildFromConfig()
    {
        var config = Resources.Load<BuildConfig>("BuildConfig/WebGLDemo"); // ファイル名に応じて変更

        if (config == null)
        {
            Debug.LogError("BuildConfig が見つかりません。Resources/BuildConfig/ に配置してください。");
            return;
        }

        // 現在の設定を退避
        var prevProductName = PlayerSettings.productName;
        var prevVersion = PlayerSettings.bundleVersion;
        var prevWidth = PlayerSettings.defaultWebScreenWidth;
        var prevHeight = PlayerSettings.defaultWebScreenHeight;

        try
        {
            PlayerSettings.productName = config.productName;
            PlayerSettings.bundleVersion = config.bundleVersion;
            PlayerSettings.defaultWebScreenWidth = config.defaultWidth;
            PlayerSettings.defaultWebScreenHeight = config.defaultHeight;

            EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.WebGL, BuildTarget.WebGL);

            string buildPath = Path.Combine("Build/WebGL", config.outputFolder);
            Directory.CreateDirectory(buildPath);

            var report = BuildPipeline.BuildPlayer(
                config.scenePaths,
                buildPath,
                BuildTarget.WebGL,
                BuildOptions.None
            );

            if (report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
            {
                Debug.Log($"ビルド成功: {buildPath}");
            }
            else
            {
                Debug.LogError("ビルドに失敗しました。");
            }
        }
        finally
        {
            // 設定を戻す
            PlayerSettings.productName = prevProductName;
            PlayerSettings.bundleVersion = prevVersion;
            PlayerSettings.defaultWebScreenWidth = prevWidth;
            PlayerSettings.defaultWebScreenHeight = prevHeight;
        }
    }
}

③ 設定ファイル(ScriptableObject)を作る

  1. Assets/Resources/BuildConfig/ フォルダを作成
  2. 右クリック > Create > Build > BuildConfig
  3. 例:以下のように設定を入れる
productName: WebGL Demo Version
bundleVersion: 0.9.0
scenePaths:
  - Assets/Scenes/Demo.unity
outputFolder: DemoBuild

以上です!あとはビルドスクリプトの設定を③で作ったファイルを読み込めるように修正するだけ。
必要に応じて書き換えても良いですし、ボタンを分けて設定ファイルごとに切り替えられるようにしてもOKだと思います。

メリット

前回同様、この記事も一部の人にしか刺さらない系の話かなとは思いますが、一応メリットとしてあげるとすると、

  • 複数のビルド設定をコードではなく「ファイル」として保存できる
  • 自動化・CIに組み込みやすいはず
  • プリセットとして管理できるから、設定ミスを防ぎやすい(はず?)

とまぁこんな感じでしょうか?

最後に

前回の記事同様、誰得?という記事かもしれませんが、もし同じようなビルド周りを便利にしたい勢の方がいらっしゃいましたら、ぜひ意見交換させてくださいw

コメント、改良案、どしどしお待ちしております!

コメント

タイトルとURLをコピーしました