Unityの プラットフォーム依存コンパイル 機能は、いくつかのプリプロセッサーディレクティブで構成されており、スクリプトを分割して、サポートされているプラットフォームの 1 つのために専用にコードのセクションをコンパイルして実行することができます。
さらに、コードをエディター内で実行することができるので、コードをモバイル/コンソール特有にコンパイルしたうえでエディターでテストすることができます。
Unity がスクリプトでサポートしているプラットフォームの #define ディレクティブは以下の通りです。
Define | 機能 |
---|---|
UNITY_EDITOR | ゲームコードから Unity エディターのスクリプトを呼び出すための #define ディレクティブ |
UNITY_EDITOR_WIN | Windows 版エディターコードのための #define ディレクティブ |
UNITY_EDITOR_OSX | Mac OS X 版エディターコードのための #define ディレクティブ |
UNITY_EDITOR_LINUX | Linux 用エディターコードのための #define ディレクティブ |
UNITY_STANDALONE_OSX | Mac OS X (Univeral、PPC、Intel のアーキテクチャを含む) のコードをコンパイル/実行するための #define ディレクティブ |
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 ディレクティブ |
UNITY_LUMIN | #Magic Leap OS プラットフォーム用の #define ディレクティブ。 PLATFORM_LUMIN も使用できます。 |
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_ANALYTICS | ゲームコードから Unity Analytics メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。 |
UNITY_ASSERTIONS | アサーション制御プロセスの #define ディレクティブ |
UNITY_64 | 64 ビットプラットフォーム用の #define ディレクティブ |
選択的にコードをコンパイルできるようになりました。使用できるオプションは、使用しているエディターバージョンによります。バージョン番号 X.Y.Z (例えば 2.6.0) の場合、Unity は 3つのグローバルな #define ディレクティブを以下の形式で示します。UNITY_X, UNITY_X_Y, 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 | 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 #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
ビルトインのセレクションに自身のカスタム #define ディレクティブを追加することもできます。 Player 設定の Other Settings パネルで、 Scripting Define Symbols テキストボックスを開きます。
ここで特定プラットフォームで定義したいシンボルの名前を入力し、(複数ある場合は) セミコロンで区切ります。これらのシンボルは、ビルトインのものと同様に #if
ディレクティブの条件として使用できます。
自身のカスタムのプリプロセッサーディレクティブを定義して、コンパイル時にどのコードを含むかを制御することができます。これを行うためには追加のディレクティブを含んだテキストファイルを Assets フォルダーに追加しなければなりません。ファイルの名前は使用している言語に依存し、拡張子は .rsp です。
C# (プレイヤーとエディタースクリプト) | <Project Path>/Assets/mcs.rsp |
例として、もし mcs.rsp ファイルに -define:UNITY_DEBUG
の 1行を加えると、#define ディレクティブ UNITY_DEBUG
は、エディタースクリプトを除く、C# スクリプトのグローバルの #define になります。
.rsp ファイルに変更を行うたびに、それを有効にするためには再コンパイルを行う必要があります。これを行うにはスクリプトファイル( .js または .cs )を更新または再インポートするだけです。
ノート: グローバル #define ディレクティブのみを修正したい場合、Player 設定の Scripting Define Symbols を使用します。なぜなら、これがすべてのコンパイラーをカバーするからです。もし代わりに .rsp ファイルを選択すると、Unity が使用するコンパイラーごとに 1 つのファイルを提供する必要があります。
.rsp ファイルの使用法は、エディターインストールフォルダーに含まれる mcs アプリケーションの ‘Help’ で説明されています。詳細な情報を得るには、mcs -help
を実行してください。
.rsp ファイルは、以下の例のように起動するコンパイラーと一致する必要があることに注意してください。
mcs.rsp
によって使用されます。csc.rsp
によって使用されます。