ドキュメント

Unity Engine

Unity Engine

Unity での条件付きコンパイル

An overview of how and when to use conditional compilation in your Unity scripts.
読み終わるまでの所要時間 7 分最終更新 1ヶ月前

Unity は C# 言語での ディレクティブ の使用をサポートしているため、特定の スクリプトシンボル が定義されているどうかに応じて、コードを選択的にコンパイルに入れるか、コンパイルから除外することができます。C# でのこれらのディレクティブの動作の詳細は、C# プリプロセッサーディレクティブ に関する Microsoft のドキュメントを参照してください。
Unity には、コードのセクションを選択的にコンパイルに入れるか、コンパイルから除外することができるように、スクリプトで使用できるさまざまな定義済みシンボルがあります。例えば、Windows スタンドアロンプラットフォームのプロジェクトビルドで定義されるシンボルは
UNITY_STANDALONE_WIN
です。このシンボルが定義されているかどうかは、以下の特殊なタイプの
if
ステートメントで確認することができます。
#if UNITY_STANDALONE_WIN Debug.Log("Standalone Windows");#endif
#if
と
#endif
の前にあるハッシュ (
#
) 文字は、これらの文がディレクティブであり、ランタイムではなくコンパイルプロセスで処理されることを示しています。上記の例の Debug 行は、プロジェクトの Windows スタンドアロンビルドのコンパイルにのみ含まれます。Unity エディターや他のターゲットビルドでコンパイルする場合は、この Debug 行は完全に省略されます。これは、ランタイムにコードの特定セクションの実行をバイパスするだけの可能性がある通常の if ステートメント の使用とは異なります。
#elif
と
#else
のディレクティブを使用して、複数の条件を確認できます。
#if UNITY_EDITOR Debug.Log("Unity Editor");#elif UNITY_IOS Debug.Log("Unity iOS");#else Debug.Log("Any other platform");#endif
選択した プラットフォーム、エディターのバージョン、その他 のシステム環境シナリオに基づいて、コードを選択的にコンパイルしたり省略したりすることができる定義済みシンボルがいくつかあります。Unity の定義済みシンボルの完全なリストについては、Unity スクリプトシンボルのリファレンス を参照してください。
エディター、スクリプト、またはアセットファイルを使用して、独自のスクリプトシンボルを定義することもできます。詳細は、カスタムスクリプトシンボル を参照してください。
注意****スクリプトシンボル は、定義シンボル、プリプロセッサー定義、または単純に定義と呼ばれることもあります。

ディレクティブの代替手段

コードを条件付きで入れたり除外したりする最も適切で確実な方法は、必ずしもプリプロセッサーディレクティブであるとは限りません。以下はその代替手段です。

Conditional 属性

C# の
Conditional
属性を使用すると、さらにクリーンに、エラーが発生しにくい方法で、関数をストリッピングできます。詳細は、ConditionalAttribute クラス を参照してください。
Start()
、
Update()
、
LateUpdate()
、
FixedUpdate()
、
Awake()
など、一般的な Unity のコールバックはこの属性の影響を受けません。一般的なコールバックは、エンジンから直接呼び出されているため、またパフォーマンス上の理由からも、属性によって考慮されることがないからです。

Assembly Definition 制限

高レベルの条件付きコンパイルにお勧めする方法は、関連する Assembly Definition ファイル を持つアセンブリにスクリプトを整理することです。条件付きで入れるまたは除外するコードがアセンブリ内にある場合は、Assembly Definition で Define Constraints を設定できます。例えば、特定のバージョンのパッケージがプロジェクトに存在する場合にのみコードをコンパイルするように設定できます。

条件付き実行

条件付きコンパイルの代わりに、標準
if
ステートメントを使用して、コンパイル済みコードを条件付きで実行できます。例えば、Unity の
UNITY_64
スクリプトシンボルは、64 ビットアーキテクチャでは信頼性の低いテストであるため、代わりに以下を実行します。
if (IntPtr.Size == 4){ // 32 bit code}else{ // 64-bit code}

追加リソース