【Unity】Player SettingsのScriptingDefineSymbolsをスクリプトから取得・設定する方法 - はなちるのマイノート (2024)

2024-06-03

Unity C#

はじめに

今回はPlayerSettingsScriptingDefineSymbolsをスクリプトから取得・設定する方法について紹介をしたいと思います。

【Unity】Player SettingsのScriptingDefineSymbolsをスクリプトから取得・設定する方法 - はなちるのマイノート (2)

一応補足ではありますが、スクリプトからでなければProjectSettings/Player/OtherSettings/Script Compilationから設定可能になります。

  • はじめに
  • 取得方法
  • 設定方法
  • 補足

取得方法

PlayerSettings.GetScriptingDefineSymbolsForGroupメソッドを利用することで、ScriptingDefineSymbolsを取得できます。

public static string GetScriptingDefineSymbolsForGroup (BuildTargetGroup targetGroup);

指定したビルドターゲットグループのスクリプトコンパイル用ユーザー指定シンボルを取得します。

docs.unity3d.com

// サンプルコードpublic void Start(){ var symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone); // SAMPLE_SYMBOL_1;SAMPLE_SYMBOL_2 // NOTE: 複数ある場合は「;」で連結されます Debug.Log(symbols);}

設定方法

PlayerSettings.SetScriptingDefineSymbolsForGroupを用いることでScriptingDefineSymbolsを設定できます。

public static void SetScriptingDefineSymbolsForGroup (BuildTargetGroup targetGroup, string defines);public static void SetScriptingDefineSymbolsForGroup (BuildTargetGroup targetGroup, string[] defines);

指定したビルドターゲットグループのスクリプトコンパイル用ユーザー指定シンボルを設定します。

The second argument, defines, is a string of preprocessor values. The values that this string contains is located in "Scripting Define Symbols". This can be located in the Configuration section of the PlayerSettings.

docs.unity3d.com

// サンプルコードpublic void Start(){ // NOTE: stringかstring[]の2種類のパターンがあり、stringの場合は「;」で区切るように記述する string[] symbols = { "SAMPLE_SYMBOL_1", "SAMPLE_SYMBOL_2", "SAMPLE_SYMBOL_3", "SAMPLE_SYMBOL_4" }; // string symbols = "SAMPLE_SYMBOL_1;SAMPLE_SYMBOL_2;SAMPLE_SYMBOL_3;SAMPLE_SYMBOL_4"; PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, symbols); var result = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone); // "SAMPLE_SYMBOL_1;SAMPLE_SYMBOL_2;SAMPLE_SYMBOL_3;SAMPLE_SYMBOL_4" Debug.Log(result);}

補足

またUnity2022くらいから?(ちゃんと調べてないので嘘の可能性大)、ForGroupが付いていないメソッドも用意されたようです。

public static string GetScriptingDefineSymbols (Build.NamedBuildTarget buildTarget);public static void SetScriptingDefineSymbols (Build.NamedBuildTarget buildTarget, string defines);public static void SetScriptingDefineSymbols (Build.NamedBuildTarget buildTarget, string[] defines);

引数がBuild.NamedBuildTargetに変更されていますね。以下が内部実装になります。

namespace UnityEditor.Build{ /// <summary> /// <para>Build Target by name.</para> /// </summary> public readonly struct NamedBuildTarget : IEquatable<NamedBuildTarget>, IComparable<NamedBuildTarget> { private static readonly string[] k_ValidNames = new string[20] { "", nameof (Standalone), nameof (Server), "iPhone", nameof (Android), nameof (WebGL), "Windows Store Apps", nameof (PS4), nameof (XboxOne), nameof (tvOS), "Nintendo Switch", nameof (Stadia), nameof (CloudRendering), nameof (LinuxHeadlessSimulation), "Lumin", "GameCoreScarlett", "GameCoreXboxOne", "PS5", nameof (EmbeddedLinux), nameof (QNX) }; /// <summary> /// <para>Unknown.</para> /// </summary> public static readonly NamedBuildTarget Unknown = new NamedBuildTarget(""); /// <summary> /// <para>Desktop Standalone.</para> /// </summary> public static readonly NamedBuildTarget Standalone = new NamedBuildTarget(nameof (Standalone)); /// <summary> /// <para>Server.</para> /// </summary> public static readonly NamedBuildTarget Server = new NamedBuildTarget(nameof (Server)); /// <summary> /// <para>iOS.</para> /// </summary> public static readonly NamedBuildTarget iOS = new NamedBuildTarget("iPhone"); /// <summary> /// <para>Android.</para> /// </summary> public static readonly NamedBuildTarget Android = new NamedBuildTarget(nameof (Android)); /// <summary> /// <para>WebGL.</para> /// </summary> public static readonly NamedBuildTarget WebGL = new NamedBuildTarget(nameof (WebGL)); /// <summary> /// <para>Windows Store Apps.</para> /// </summary> public static readonly NamedBuildTarget WindowsStoreApps = new NamedBuildTarget("Windows Store Apps"); /// <summary> /// <para>PS4.</para> /// </summary> public static readonly NamedBuildTarget PS4 = new NamedBuildTarget(nameof (PS4)); /// <summary> /// <para>Xbox One.</para> /// </summary> public static readonly NamedBuildTarget XboxOne = new NamedBuildTarget(nameof (XboxOne)); /// <summary> /// <para>TvOS.</para> /// </summary> public static readonly NamedBuildTarget tvOS = new NamedBuildTarget(nameof (tvOS)); /// <summary> /// <para>Nintendo Switch.</para> /// </summary> public static readonly NamedBuildTarget NintendoSwitch = new NamedBuildTarget("Nintendo Switch"); /// <summary> /// <para>Stadia.</para> /// </summary> public static readonly NamedBuildTarget Stadia = new NamedBuildTarget(nameof (Stadia)); /// <summary> /// <para>LinuxHeadlessSimulation.</para> /// </summary> public static readonly NamedBuildTarget LinuxHeadlessSimulation = new NamedBuildTarget(nameof (LinuxHeadlessSimulation)); /// <summary> /// <para>CloudRendering.</para> /// </summary> [Obsolete("CloudRendering is deprecated, please use LinuxHeadlessSimulation (UnityUpgradable) -> LinuxHeadlessSimulation", false)] public static readonly NamedBuildTarget CloudRendering = NamedBuildTarget.LinuxHeadlessSimulation; /// <summary> /// <para>EmbeddedLinux.</para> /// </summary> public static readonly NamedBuildTarget EmbeddedLinux = new NamedBuildTarget(nameof (EmbeddedLinux)); /// <summary> /// <para>QNX.</para> /// </summary> public static readonly NamedBuildTarget QNX = new NamedBuildTarget(nameof (QNX)); /// <summary> /// <para>Name of the build target.</para> /// </summary> public string TargetName { get; } internal NamedBuildTarget(string targetName) => this.TargetName = ((IEnumerable<string>) NamedBuildTarget.k_ValidNames).Contains<string>(targetName) ? targetName : throw new ArgumentException("'" + targetName + "' is not a valid build target name"); /// <summary> /// <para>Returns the appropriate BuildTargetGroup that corresponds to the specified NamedBuildTarget.</para> /// </summary> /// <param name="namedBuildTarget">Named build target.</param> public BuildTargetGroup ToBuildTargetGroup() => this.TargetName == "Server" ? BuildTargetGroup.Standalone : BuildPipeline.GetBuildTargetGroupByName(this.TargetName); /// <summary> /// <para>Returns the appropriate NamedBuildTarget that corresponds to the specified BuildTargetGroup.</para> /// </summary> /// <param name="buildTargetGroup">Build target group.</param> public static NamedBuildTarget FromBuildTargetGroup(BuildTargetGroup buildTargetGroup) { switch (buildTargetGroup) { case BuildTargetGroup.Unknown: return NamedBuildTarget.Unknown; case BuildTargetGroup.Standalone: return NamedBuildTarget.Standalone; case BuildTargetGroup.iPhone: return NamedBuildTarget.iOS; case BuildTargetGroup.Android: return NamedBuildTarget.Android; case BuildTargetGroup.WebGL: return NamedBuildTarget.WebGL; case BuildTargetGroup.WSA: return NamedBuildTarget.WindowsStoreApps; case BuildTargetGroup.PS4: return NamedBuildTarget.PS4; case BuildTargetGroup.XboxOne: return NamedBuildTarget.XboxOne; case BuildTargetGroup.tvOS: return NamedBuildTarget.tvOS; case BuildTargetGroup.Switch: return NamedBuildTarget.NintendoSwitch; case BuildTargetGroup.Stadia: return NamedBuildTarget.Stadia; case BuildTargetGroup.CloudRendering: return NamedBuildTarget.LinuxHeadlessSimulation; case BuildTargetGroup.GameCoreScarlett: return new NamedBuildTarget("GameCoreScarlett"); case BuildTargetGroup.GameCoreXboxOne: return new NamedBuildTarget("GameCoreXboxOne"); case BuildTargetGroup.PS5: return new NamedBuildTarget("PS5"); case BuildTargetGroup.EmbeddedLinux: return NamedBuildTarget.EmbeddedLinux; case BuildTargetGroup.QNX: return NamedBuildTarget.QNX; default: throw new ArgumentException(string.Format("There is no a valid NamedBuildTarget for BuildTargetGroup '{0}'", (object) buildTargetGroup)); } } internal static NamedBuildTarget FromActiveSettings(BuildTarget target) { BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(target); return buildTargetGroup == BuildTargetGroup.Standalone && EditorUserBuildSettings.GetActiveSubtargetFor(target) == 1 ? NamedBuildTarget.Server : NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup); } public static bool operator ==(NamedBuildTarget lhs, NamedBuildTarget rhs) => lhs.Equals(rhs); public static bool operator !=(NamedBuildTarget lhs, NamedBuildTarget rhs) => !lhs.Equals(rhs); public override int GetHashCode() => this.TargetName.GetHashCode(); public override bool Equals(object obj) => obj != null && !(this.GetType() != obj.GetType()) && this.Equals((NamedBuildTarget) obj); public bool Equals(NamedBuildTarget other) => this.TargetName == other.TargetName; public int CompareTo(NamedBuildTarget other) => this.TargetName.CompareTo(other.TargetName); }}

単なる列挙型ではなく、構造体になっているようです。またBuildTargetGroupへの相互変換も可能なようです。

public BuildTargetGroup NamedBuildTarget.ToBuildTargetGroup()public static NamedBuildTarget NamedBuildTarget.FromBuildTargetGroup(BuildTargetGroup buildTargetGroup)
【Unity】Player SettingsのScriptingDefineSymbolsをスクリプトから取得・設定する方法 - はなちるのマイノート (2024)

References

Top Articles
Latest Posts
Article information

Author: Patricia Veum II

Last Updated:

Views: 6350

Rating: 4.3 / 5 (64 voted)

Reviews: 87% of readers found this page helpful

Author information

Name: Patricia Veum II

Birthday: 1994-12-16

Address: 2064 Little Summit, Goldieton, MS 97651-0862

Phone: +6873952696715

Job: Principal Officer

Hobby: Rafting, Cabaret, Candle making, Jigsaw puzzles, Inline skating, Magic, Graffiti

Introduction: My name is Patricia Veum II, I am a vast, combative, smiling, famous, inexpensive, zealous, sparkling person who loves writing and wants to share my knowledge and understanding with you.