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

> An overview of how and when to use conditional compilation in your Unity scripts.

Unity は C# 言語での **ディレクティブ** の使用をサポートしているため、特定の **スクリプトシンボル** が定義されているどうかに応じて、コードを選択的にコンパイルに入れるか、コンパイルから除外することができます。C# でのこれらのディレクティブの動作の詳細は、[C# プリプロセッサーディレクティブ](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives) に関する Microsoft のドキュメントを参照してください。

Unity には、コードのセクションを選択的にコンパイルに入れるか、コンパイルから除外することができるように、スクリプトで使用できるさまざまな定義済みシンボルがあります。例えば、Windows スタンドアロンプラットフォームのプロジェクトビルドで定義されるシンボルは `UNITY_STANDALONE_WIN` です。このシンボルが定義されているかどうかは、以下の特殊なタイプの `if` ステートメントで確認することができます。

```
#if UNITY_STANDALONE_WIN

  Debug.Log("Standalone Windows");

#endif
```

`#if` と `#endif` の前にあるハッシュ (`#`) 文字は、これらの文がディレクティブであり、ランタイムではなくコンパイルプロセスで処理されることを示しています。上記の例の Debug 行は、プロジェクトの Windows スタンドアロンビルドのコンパイルにのみ含まれます。Unity エディターや他のターゲットビルドでコンパイルする場合は、この Debug 行は完全に省略されます。これは、ランタイムにコードの特定セクションの実行をバイパスするだけの可能性がある通常の [if ステートメント](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements) の使用とは異なります。

`#elif` と `#else` のディレクティブを使用して、複数の条件を確認できます。

```
#if UNITY_EDITOR

    Debug.Log("Unity Editor");

#elif UNITY_IOS

    Debug.Log("Unity iOS");

#else

    Debug.Log("Any other platform");

#endif
```

選択した [プラットフォーム](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/symbol-reference.md#Platform)、[エディターのバージョン](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/symbol-reference.md#Editor)、[その他](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/symbol-reference.md#Other) のシステム環境シナリオに基づいて、コードを選択的にコンパイルしたり省略したりすることができる定義済みシンボルがいくつかあります。Unity の定義済みシンボルの完全なリストについては、[Unity スクリプトシンボルのリファレンス](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/symbol-reference.md) を参照してください。

エディター、スクリプト、またはアセットファイルを使用して、独自のスクリプトシンボルを定義することもできます。詳細は、[カスタムスクリプトシンボル](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/custom-scripting-symbols.md) を参照してください。

**注意\*\*\*\*スクリプトシンボル** は、定義シンボル、プリプロセッサー定義、または単純に定義と呼ばれることもあります。

## ディレクティブの代替手段##alternatives-to-directives

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

### `Conditional` 属性##conditional-attribute

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

### Assembly Definition 制限##assembly-definition-constraints

高レベルの条件付きコンパイルにお勧めする方法は、関連する [Assembly Definition ファイル](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files.md) を持つアセンブリにスクリプトを整理することです。条件付きで入れるまたは除外するコードがアセンブリ内にある場合は、Assembly Definition で [Define Constraints](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files.md#define-symbols) を設定できます。例えば、特定のバージョンのパッケージがプロジェクトに存在する場合にのみコードをコンパイルするように設定できます。

### 条件付き実行##conditional-execution

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

```lang-csharp
if (IntPtr.Size == 4)
{
    // 32 bit code
}
else
{
    // 64-bit code
}
```

## 追加リソース##additional-resources

* [Unity でスクリプトを作成して使用する方法](/engine/6000.0/manual/scripting/get-started/creating-scripts.md)
* [Unity スクリプトシンボルのリファレンス](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/symbol-reference.md)
* [条件付きコンパイル済みコードをテストする](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/test.md)
* [カスタム製スクリプトシンボル](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/custom-scripting-symbols.md)
