これらのディレクティブが 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_SERVER | Scripting symbol for compiling/executing code for a dedicated server (Mac OS X, Windows or Linux). |
UNITY_WII | Wii コンソール用のコードをコンパイル/実行するためのスクリプトシンボル |
UNITY_IOS | iOS プラットフォーム用のコードをコンパイル/実行するためのスクリプトシンボル |
UNITY_IPHONE | 非推奨。代わりに UNITY_IOS を使用してください。 |
UNITY_ANDROID | Android プラットフォーム用のスクリプトシンボル |
UNITY_LUMIN | Scripting symbol for the Magic Leap OS platform. You can also use PLATFORM_LUMIN. Note that the Lumin platform is no longer supported. |
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_VR | Defined when the target build platform supports VR. Does not imply that VR is currently enabled or that the necessary plug-ins and packages needed to support VR are installed. |
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 | Defined when your script is running in a player which was built with the Development Build option enabled. This define only reflects whether the development build checkbox was selected at the time of the build. To determine whether your script is running in the development build, use Debug.isDebugBuild. __DEVELOPMENT\_BUILD__ is not sufficient to determine whether you’re currently running in a development build as many platforms allow you to change between development and non-development build without rebuilding the project. On some platforms, Unity does not support switching between development and non-development builds in the Editor and requires switching after the build. For example, you can build for Windows with the Create Visual Studio solution option which means that you have to select whether you want a development or non-development build in Visual Studio. Switching in Visual Studio will not recompile your scripts and thus will not reevaluate scripting defines. Another example is switching from the final game build to a development build by swapping UnityPlayer.dll in the game build with one from a development build which is useful for debugging live game builds. |
以下は、プリコンパイルコードの使用例です。選択したビルドターゲットのプラットフォームにもとづいてメッセージを出力します。
まず初めに、コードをテストしたいプラットフォームを選択するために 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("Unity iOS");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Standalone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
}
}
To test the code, click Play Mode. Confirm that the code works by checking for the relevant messages in the Unity console, depending on which platform you selected - for example, if you choose iOS, the messages “Unity Editor” and “Unity iOS” are set to appear in the console.
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