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_WINif#if UNITY_STANDALONE_WIN Debug.Log("Standalone Windows");#endif
#if#endif##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# の 属性を使用すると、さらにクリーンに、エラーが発生しにくい方法で、関数をストリッピングできます。詳細は、ConditionalAttribute クラス を参照してください。、、、、 など、一般的な Unity のコールバックはこの属性の影響を受けません。一般的なコールバックは、エンジンから直接呼び出されているため、またパフォーマンス上の理由からも、属性によって考慮されることがないからです。
ConditionalStart()Update()LateUpdate()FixedUpdate()Awake()Assembly Definition 制限
高レベルの条件付きコンパイルにお勧めする方法は、関連する Assembly Definition ファイル を持つアセンブリにスクリプトを整理することです。条件付きで入れるまたは除外するコードがアセンブリ内にある場合は、Assembly Definition で Define Constraints を設定できます。例えば、特定のバージョンのパッケージがプロジェクトに存在する場合にのみコードをコンパイルするように設定できます。
条件付き実行
条件付きコンパイルの代わりに、標準 ステートメントを使用して、コンパイル済みコードを条件付きで実行できます。例えば、Unity の スクリプトシンボルは、64 ビットアーキテクチャでは信頼性の低いテストであるため、代わりに以下を実行します。
ifUNITY_64if (IntPtr.Size == 4){ // 32 bit code}else{ // 64-bit code}