☺️

【Unity】ScriptingDefineSymbolsをカジュアルに管理する

に公開

環境: Unity 6000.0.51f1

ビルドモードの定義

BuildMode.cs
public enum BuildMode
{
    Product, // 本番
    Debug, // 開発
}

シンボル管理ソース

DefineSymbolManager.cs
using System;
using System.Linq;
using UnityEditor;
using UnityEditor.Build;

public static class DefineSymbolManager
{
    // シンボルデータ
    private sealed class DefineSymbol
    {
        public readonly string Name;
        public readonly Predicate<Config> Condition;

        public DefineSymbol(string name, Predicate<Config> condition)
        {
            Name = name;
            Condition = condition;
        }
    }

    // 環境設定データ
    private readonly struct Config
    {
        public readonly BuildTargetGroup Target;
        public readonly BuildMode Mode;
        public readonly bool IsEditor;

        public Config(BuildTargetGroup target, BuildMode mode, bool isEditor)
        {
            Target = target;
            Mode = mode;
            IsEditor = isEditor;
        }
    }

    // シンボル定義
    private static readonly DefineSymbol[] AllSymbols =
    {
        // ラムダ式で有効/無効を制御する
        new ("PRODUCT_MODE", config => config.Mode is BuildMode.Product),
        new ("DEBUG_MODE", config => config.Mode is BuildMode.Debug),
        new ("MOBILE_PLATFORM", config => config.Target is BuildTargetGroup.Android or BuildTargetGroup.iOS),
        // エディタなら本番用でもデバッグメニュー有りみたいなことも
        new ("ENABLE_DEBUG_MENU", config => config.Mode is BuildMode.Debug || config.IsEditor),
        // 常に有効なシンボル
        new ("ALWAYS_TRUE", _ => true),
    };

    // 対象とするプラットフォーム
    private static readonly BuildTargetGroup[] TargetGroups =
    {
        BuildTargetGroup.Standalone,
        BuildTargetGroup.Android,
        BuildTargetGroup.iOS,
    };

    // 設定に応じたシンボル一覧を取得
    private static string[] GetSymbols(Config config)
    {
        return AllSymbols
            .Where(symbol => symbol.Condition(config))
            .Select(symbol => symbol.Name)
            .ToArray();
    }

    // モードに応じたシンボル定義に更新
    public static void SetSymbols(BuildMode mode, bool isEditor)
    {
        foreach (var target in TargetGroups)
        {
            PlayerSettings.SetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(target), GetSymbols(new Config(target, mode, isEditor)));
        }
    }

    // 上部メニューから各モードのシンボル定義に切り替えできるようにする
    [MenuItem("Tools/DefineSymbols/Product")]
    public static void SetProductMode()
    {
        SetSymbols(BuildMode.Product, isEditor: false);
    }

    [MenuItem("Tools/DefineSymbols/Product(Editor)")]
    public static void SetProductModeForEditor()
    {
        SetSymbols(BuildMode.Product, isEditor: true);
    }

    [MenuItem("Tools/DefineSymbols/Debug")]
    public static void SetDebugMode()
    {
        SetSymbols(BuildMode.Debug, isEditor: false);
    }

    [MenuItem("Tools/DefineSymbols/Debug(Editor)")]
    public static void SetDebugModeForEditor()
    {
        SetSymbols(BuildMode.Debug, isEditor: true);
    }
}

Unity上部のメニューから切り替えできます

Discussion