これらのディレクティブが C# でどのように動作するかについては、Microsoft C# プリプロセッサディレクティブのページ を参照してください。
Unity にはさまざまなビルトインスクリプトシンボルがあり、スクリプトでコードの一部を選択的にコンパイルしたり除外したりできます。
例えば、Windows スタンドアロンプラットフォーム用にプレイヤーをビルドするときに設定されるビルトインのスクリプトシンボルは、UNITY_STANDALONE_WIN
です。このシンボルが定義されているかどうかは、以下の特殊なタイプの if ステートメントを使用して確認することができます。
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
if
と endif
の前にあるハッシュ (#
) 文字は、これらの文が “ディレクティブ” であり、ランタイムではなく、コンパイル時に処理されることを示しています。
したがって、上の例では、Debug 行はプロジェクトの Windows スタンドアロンビルドのコンパイルにのみ含まれます。エディターや他のターゲットビルドでコンパイルする場合は、Debug 行は完全に省略されます。* これは、通常の if ... then ... else
構造の使用とは異なり、ランタイムにコードの特定部分の 実行 を回避するだけです。完全な例については、以下を参照してください。
多くのビルトインのスクリプトシンボルがあり、これにより、プラットフォーム 、エディターバージョン 、その他 その他のシステム環境シナリオに基づいて、選択的にコードをコンパイルまたは省略することができます。これらのビルトインのスクリプトシンボルを以下に示します。
さらに、エディター UI、スクリプト、アセットファイルのいずれかを使用して、独自のスクリプトシンボルを定義することができます。これにより、任意の定義に基づいて、コードの一部のコンパイルを制御できます。詳しくは、カスタムスクリプトシンボル を参照してください。
Unity では、オーサリングやビルドの対象プラットフォームに応じて、特定のスクリプトシンボルが自動的に定義されます。これらは以下の通りです。
定義 | 機能 |
---|---|
UNITY_EDITOR | ゲームコードから Unity エディターのスクリプトを呼び出すためのスクリプトシンボル |
UNITY_EDITOR_WIN | Windows 用エディターコードのためのスクリプトシンボル |
UNITY_EDITOR_OSX | Mac OS X 用エディターコードのためのスクリプトシンボル |
UNITY_EDITOR_LINUX | Linux 用エディターコードのためのスクリプトシンボル |
UNITY_STANDALONE_OSX | Mac OS X (Univeral、PPC、Intel のアーキテクチャを含む) のコードをコンパイル/実行するための スクリプトシンボル |
UNITY_STANDALONE_WIN | Windows スタンドアロンアプリケーションのコードをコンパイル/実行するための スクリプトシンボル |
UNITY_STANDALONE_LINUX | Linux スタンドアロンアプリケーションのコードをコンパイル/実行するためのスクリプトシンボル |
UNITY_STANDALONE | あらゆるスタンドアロンプラットフォーム (Mac OS X, Windows, Linux) のコードをコンパイル/実行するためのスクリプトシンボル |
UNITY_WII | Wii コンソール用のコードをコンパイル/実行するためのスクリプトシンボル |
UNITY_IOS | iOS プラットフォーム用のコードをコンパイル/実行するためのスクリプトシンボル |
UNITY_IPHONE | 非推奨。代わりに UNITY_IOS を使用してください。 |
UNITY_ANDROID | Android プラットフォーム用のスクリプトシンボル |
UNITY_LUMIN | Magic Leap OSプラットフォーム用のスクリプトシンボルです。PLATFORM_LUMINも使えます。Luminプラットフォームはもうサポートされていません。 |
UNITY_TIZEN | Tizen プラットフォーム用のスクリプトシンボル |
UNITY_TVOS | Apple TV プラットフォーム用のスクリプトシンボル |
UNITY_WSA | ユニバーサル Windows プラットフォームのためのスクリプトシンボル。さらに、C# ファイルを .NET Core 向けにコンパイルし .NET スクリプティングバックエンドを使用する場合に、NETFX_CORE が定義されます。 |
UNITY_WSA_10_0 | ユニバーサル Windows プラットフォームのためのスクリプトシンボル。さらに、C# ファイルを .NET Core 向けにコンパイルする場合に、WINDOWS_UWP が定義されます。 |
UNITY_WEBGL | WebGL 用のスクリプトシンボル |
UNITY_FACEBOOK | Facebook プラットフォーム (WebGL か Windows スタンドアロン) のためのスクリプトシンボル |
UNITY_ANALYTICS | ゲームコードから Unity Analytics メソッドを呼び出すためのスクリプトシンボル。Unity 5.2 以降で使用可能。 |
UNITY_ASSERTIONS | アサーション制御プロセスのスクリプトシンボル |
UNITY_64 | 64 ビットプラットフォーム用のスクリプトシンボル |
Unity では、現在使用しているエディターバージョンに基づき、特定のスクリプトシンボルが自動的に定義されます。
バージョン番号 X.Y.Z (例えば 2019.4.14) の場合、Unity は 3 つのグローバルなスクリプトシンボルを以下の形式で示します。UNITY_X、 UNITY_X_Y、 UNITY_X_Y_Z
以下は Unity 2019.4.14 で公開されているスクリプトシンボルの例です。
定義 | 機能 |
---|---|
UNITY_2019 | Unity 2019 リリースバージョンのスクリプトシンボルです。すべての 2019.Y.Z リリースで公開されています。 |
UNITY_2019_4 | Unity 2019.4 メジャーバージョンのスクリプトシンボルです。すべての 2019.4.Z リリースで公開されています。 |
UNITY_2019_4_14 | Unity 2019.4.14 マイナーバージョンのスクリプトシンボル |
コードの指定の部分のコンパイルや実行に必要な Unity の最も古いバージョンに基づいて、選択的にコードをコンパイルできます。前述の (X.Y.Z) と同じバージョン形式を使用して、Unity は、UNITY_X_Y_OR_NEWER の形式でグローバルな #define を示します。
その他、Unity が定義するスクリプトシンボルは以下の通りです。
定義 | 機能 |
---|---|
CSHARP_7_3_OR_NEWER | C# 7.3をサポートするスクリプトをビルドするときに定義されます。 |
ENABLE_MONO | Mono のスクリプティングバックエンド #define ディレクティブ |
ENABLE_IL2CPP | IL2CPP のスクリプティングバックエンド #define ディレクティブ |
ENABLE_MONO | 対象のビルド・プラットフォームがVRをサポートしている場合に定義される。VRが現在有効であることや、VRをサポートするために必要なプラグインやパッケージがインストールされていることを意味するものではない。 |
NET_2_0 | Mono と IL2CPP の .NET 2.0 API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NET_2_0_SUBSET | Mono と IL2CPP の .NET 2.0 Subset API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NET_LEGACY | Mono と IL2CPP の .NET 2.0 か NET 2.0 Subset API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NET_4_6 | Mono と IL2CPP の .NET 4.x API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NET_STANDARD_2_0 | Mono と IL2CPP の .NET Standard 2.0 API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NET_STANDARD_2_1 | Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NET_STANDARD | Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NETSTANDARD2_1 | Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
NETSTANDARD | Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
ENABLE_WINMD_SUPPORT | Windows Runtime のサポートが IL2CPP で使用可能なときに定義されます。詳しくは Windows Runtime Support を参照してください。 |
ENABLE_INPUT_SYSTEM | Player Settings で Input System パッケージが有効になっている場合に定義されます。 |
ENABLE_LEGACY_INPUT_MANAGER | Player Settings で古い Input Manager が有効になっている場合に定義されます。 |
UNITY_SERVER | Build Settings で Server Build 設定が有効になっている場合に定義されます。 |
DEVELOPMENT_BUILD | “Development Build” オプションを有効にしてビルドされたプレイヤーでスクリプトが実行されている場合に定義されます。 |
以下は、プリコンパイルコードの使用例です。選択したビルドターゲットのプラットフォームにもとづいてメッセージを出力します。
まず初めに、コードをテストしたいプラットフォームを選択するために File > Build Settings をクリックします。これによりターゲットプラットフォームを選択する Build Settings ウィンドウが表示されます。
プリコンパイルコードをテストしたいプラットフォームを選択して、Switch Platform をクリックし、どのプラットフォームをターゲットにするのか設定します。
スクリプトを作成し、次のコードをコピーアンドペーストします。
using UnityEngine;
using System.Collections;
public class PlatformDefines : MonoBehaviour {
void Start () {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IOS
Debug.Log("iOS");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Standalone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
}
}
コードをテストするには Play Mode をクリックします。Unity のコンソールに表示される選択したプラットフォームに基づく関連メッセージで、コードが正常に作動していることを確認してください。例えば、iOS を選択すると、コンソールに “Unity iOS” と表示されます。
C# では、よりクリーンでエラーを起こしにくい、関数の除去方法である CONDITIONAL
属性を使用することができます。詳細は、 ConditionalAttribute Class を参照してください。一般的な Unity のコールバック (例えば、Start(), Update(), LateUpdate(), FixedUpdate(), Awake()) は、エンジンから直接呼び出されているため、また、パフォーマンス上の理由からも、この属性の影響を受けません。
基本的な #if
コンパイラーディレクティブに加えて、C#で多経路テストを使用することもできます。
# if UNITY_EDITOR
Debug.Log("Unity Editor");
# elif UNITY_IOS
Debug.Log("Unity iOS");
# else
Debug.Log("Any other platform");
# endif