Unity’s Platform Dependent Compilation feature consists of some preprocessor directives that let you partition your scripts to compile and execute a section of code exclusively for one of the supported platforms.
You can run this code within the Unity Editor, so you can compile the code specifically for your target platform and test it in the Editor.
Unity がスクリプトでサポートしているプラットフォームの #define ディレクティブは以下の通りです。
Define | 機能 |
---|---|
UNITY_EDITOR | #define directive to call Unity Editor scripts from your game code. |
UNITY_EDITOR_WIN | Windows 版エディターコードのための #define ディレクティブ |
UNITY_EDITOR_OSX | Mac OS X 版エディターコードのための #define ディレクティブ |
UNITY_EDITOR_LINUX | #define directive for Editor code on Linux. |
UNITY_STANDALONE_OSX | #define directive to compile or execute code specifically for Mac OS X (including Universal, PPC and Intel architectures). |
UNITY_STANDALONE_WIN | Windows スタンドアロンアプリケーションのコードをコンパイル/実行するための #define ディレクティブ |
UNITY_STANDALONE_LINUX | Linux スタンドアロンアプリケーションのコードをコンパイル/実行するための #define ディレクティブ |
UNITY_STANDALONE | あらゆるスタンドアロンプラットフォーム(Mac OS X, Windows, Linux)のコードをコンパイル/実行するための #define ディレクティブ |
UNITY_WII | Wii コンソールのためのコードをコンパイル/実行するための #define ディレクティブ |
UNITY_IOS | iOS プラットフォームのためのコードをコンパイル/実行するための #define ディレクティブ |
UNITY_IPHONE | 非推奨。代わりに UNITY_IOS を使用してください。 |
UNITY_ANDROID | Android プラットフォームのための #define ディレクティブ |
UNITY_PS4 | PlayStation 4 のコードを実行するための #define ディレクティブ |
UNITY_XBOXONE | XBox One のコードを実行するための #define ディレクティブ |
PLATFORM_LUMIN | #define directive for the Magic Leap OS platform. |
UNITY_TIZEN | Tizen プラットフォームのための #define ディレクティブ |
UNITY_TVOS | Apple TV プラットフォームのための #define ディレクティブ |
UNITY_WSA | ユニバーサル Windows プラットフォームのための #define ディレクティブ。さらに、C# ファイルを .NET Core 向けにコンパイルし .NET スクリプティングバックエンドを使用する場合に、NETFX_CORE が定義されます。 |
UNITY_WSA_10_0 | ユニバーサル Windows プラットフォームのための #define ディレクティブ。さらに、C# ファイルを .NET Core 向けにコンパイルする場合に、WINDOWS_UWP が定義されます。 |
UNITY_WINRT | UNITY_WSA と同様 |
UNITY_WINRT_10_0 | UNITY_WSA_10_0 に相当 |
UNITY_WEBGL | WebGL のための #define ディレクティブ |
UNITY_FACEBOOK | Facebook プラットフォーム (WebGL か Windows スタンドアロン) のための #define ディレクティブ |
UNITY_FACEBOOK | Facebook プラットフォーム (WebGL か Windows スタンドアロン) のための #define ディレクティブ |
UNITY_ADS | ゲームコードから Unity Ads メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。 |
UNITY_ANALYTICS | ゲームコードから Unity Analytics メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。 |
UNITY_ASSERTIONS | アサーション制御プロセスの #define ディレクティブ |
You can also compile code selectively. The options available depend on the version of the Editor that you are working on. Given a version number X.Y.Z (for example, 2.6.0), Unity exposes three global #define directives in the following formats: UNITY_X, UNITY_X_Y and UNITY_X_Y_Z.
Unity 5.0.1 の #define ディレクティブ
Define | 機能 |
---|---|
UNITY_5 | Unity 5 リリースバージョンの #define ディレクティブです。すべての 5.X.Y リリースで使用可能。 |
UNITY_5_0 | Unity 5.0 リリースバージョンの #define ディレクティブです。すべての 5.0.Z リリースで使用可能。 |
UNITY_5_0_1 | Unity 5.0 マイナーバージョンの #define ディレクティブです。 |
Unity 5.3.4 以降、指定した部分のコードのコンパイル、または実行に必要な最も古い Unity のバージョンに基づいて、選択的にコードをコンパイルできます。前述の (X.Y.Z) と同じバージョン形式を使用して、Unity は、UNITY_X_Y_OR_NEWER の形式でグローバルな #define を示します。
以下はサポートされている #define ディレクティブです。
Define | 機能 |
---|---|
CSHARP_7_3_OR_NEWER | C# 7.3をサポートするスクリプトをビルドするときに定義されます。 |
ENABLE_MONO | Mono のスクリプティングバックエンド #define ディレクティブ |
ENABLE_IL2CPP | IL2CPP のスクリプティングバックエンド #define ディレクティブ |
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 互換性レベル向けにスクリプトをビルドするときに定義されます。 |
ENABLE_WINMD_SUPPORT | Defined when Windows Runtime support is enabled on IL2CPP. See Windows Runtime Support for more details. |
ENABLE_INPUT_SYSTEM | Defined when the Input System package is enabled in Player Settings. |
ENABLE_LEGACY_INPUT_MANAGER | Defined when the legacy Input Manager is enabled in Player Settings. |
また、 DEVELOPMENT_BUILD #define ディレクティブを使用すると、スクリプトを “Development Build” オプションを有効にしてビルドしたプレイヤーで実行しているかどうかを確認できます。
スクリプトバックエンドでコードを選択的にコンパイルすることもできます。
以下は、プリコンパイルコードの使用例です。選択したビルドターゲットのプラットフォームにもとづいてメッセージを出力します。
まず初めに、コードをテストしたいプラットフォームを選択するために File > Build Settings をクリックします。これによりターゲットプラットフォームを選択する Build Settings ウィンドウが表示されます。
プリコンパイルコードをテストしたいプラットフォームを選択して、Switch Platform をクリックし、どのプラットフォームをターゲットにするのか設定します。
スクリプトを作成し、次のコードをコピー&ペーストします。
// C#
using UnityEngine;
using System.Collections;
public class PlatformDefines : MonoBehaviour {
void Start () {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IOS
Debug.Log("Iphone");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif
}
}
コードをテストするには Play Mode をクリックします。Unity のコンソールに表示される選択したプラットフォームに基づく関連メッセージで、コードが正常に作動していることを確認してください。例えば、iOS を選択すると、コンソールに Iphone と表示されます。
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 iPhone");
# else
Debug.Log("Any other platform");
# endif
It is also possible to add to the built-in selection of #define directives by supplying your own. Open the Other Settings panel of the Player settings and navigate to the Scripting Define Symbols text box.
ここで特定のプラットフォーム用に定義したいシンボルの名前を入力し、(複数ある場合は) セミコロンで区切ります。これらのシンボルは、ビルトインのものと同様に #if
ディレクティブの条件として使用できます。
自身のカスタムのプリプロセッサーディレクティブを定義して、コンパイル時にどのコードを含むかを制御することができます。これを行うためには追加のディレクティブを含んだテキストファイルを Assets フォルダーに追加しなければなりません。ファイルの名前は使用している言語に依存し、拡張子は .rsp です。
C# (プレイヤーとエディタースクリプト) | <Project Path>/Assets/mcs.rsp |
例として、もし mcs.rsp ファイルに -define:UNITY_DEBUG
の 1行を加えると、#define ディレクティブ UNITY_DEBUG
は、エディタースクリプトを除く、C# スクリプトのグローバルの #define になります。
.rsp ファイルに変更を行うたびに、それを有効にするためには再コンパイルを行う必要があります。これを行うにはスクリプトファイル( .js または .cs )を更新または再インポートするだけです。
Note:__If you want to modify only global #define directives, use Scripting Define Symbols__ in Player settings, because this covers all the compilers. If you choose the .rsp files instead, you need to provide one file for every compiler Unity uses.
.rsp ファイルの使用法は、エディターインストールフォルダーに含まれる mcs アプリケーションの ‘Help’ で説明されています。詳細な情報を得るには、mcs -help
を実行してください。
.rsp ファイルは、以下の例のように起動するコンパイラーと一致する必要があることに注意してください。
mcs.rsp
によって使用されます。csc.rsp
によって使用されます。