☺️
【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);
}
}
Discussion