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 で Define Constraints を設定できます。例えば、特定のバージョンのパッケージがプロジェクトに存在する場合にのみコードをコンパイルするように設定できます。
条件付きコンパイルの代わりに、標準 if ステートメントを使用して、コンパイル済みコードを条件付きで実行できます。例えば、Unity の UNITY_64 スクリプトシンボルは、64 ビットアーキテクチャでは信頼性の低いテストであるため、代わりに以下を実行します。
if (IntPtr.Size == 4)
{
// 32 bit code
}
else
{
// 64-bit code
}