条件付きコンパイルとは?
Unityは1つのソースコードで、複数のプラットフォーム向けにビルドすることが出来ます。
例えば、AndroidとiOS両対応のゲームを作っているケースも多いでしょう。
しかし、それぞれのプラットフォームでは扱える機能や実装の仕方が異なることがあります。
このような場合、条件付きコンパイルを利用すると、プラットフォームごとに異なるコードを書くことが出来ます。
public class TitleScene : MonoBehaviour
{
private void Awake()
{
#if UNITY_ANDROID
Debug.Log("Androidだよ");
#endif
#if UNITY_IOS
Debug.Log("iOSだよ");
#endif
}
}
プリプロセッサ
プリプロセッサとは、コードのコンパイル前に実行される指令(ディレクティブ)を提供する機能です。
プリプロセッサディレクティブは、プログラムのソースコードに特定の条件付きコンパイルやコードの一部を無効化するために使われます。
C#では、C言語やC++のような完全なプリプロセッサはありませんが、いくつかの基本的なディレクティブが提供されています。
今回は条件付きコンパイルに関連するところだけ説明します。
#define
ソースコード中にシンボルを定義します。
C#の場合、ソースコードの先頭で行う必要があります。
以下の場合、DEBUG シンボルが有効になります。
#define DEBUG
#undef
宣言済みのシンボルを解除します。
こちらも、ソースコードの先頭で行う必要があります。
この行以降は、DBEUGシンボルが無効になります。
#undef DEBUG
#if #else #elif #endif
#if〜#endifは必ず対になります。
以下の場合、通常のif文のように「DEBUGシンボルが有効なら」という意味になり、中の処理が実行されます。
#if DEBUG
Debug.Log("デバッグが有効");
#endif
if文のelse, else ifのように#else、#elifも使用できます。
#if DEBUG
Debug.Log("デバッグが有効");
#elif RELEASE
Debug.Log("リリースが有効");
#else
Debug.Log("どちらも定義されていません");
#endif
if文同様に! で負の判定も出来ます。
#if !DEBUG
Debug.Log("デバッグが有効ではない");
#endif
ビルトインシンボル
UnityEditorは、
- プラットフォーム
- エディターバージョン
- その他
の複数のシンボルを自動的に定義しています。
主な例をいくつか紹介します。
プラットフォーム
プラットフォームに関連したものになります。
| 定義 | 機能 |
| UNITY_EDITOR | UnityEditor向け |
| UNITY_ANDROID | Android向け |
| UNITY_IOS | iOS向け |
| UNITY_STANDALONE_WIN | Windows向け |
他にもあります。
プラットフォーム向けのシンボルは、ビルド時にも定義されますが、Editor上でも現在のプラットフォームに対応したシンボルが定義されます。
例えば、Andoridプラットフォームになっている場合、UNITY_ANDROIDとUNITY_EDITORが有効になっています。
エディターバージョン
使用中のUnityEditorのバージョンに関連したものになります。
| 定義 | 機能 |
| UNITY_2022 | Unity2022系 |
| UNITY_2021_OR_NERWER | Unity2021より新しいバージョン |
制作したコンポーネントが複数のUnityバージョンをサポートする必要があり、
バージョンによって仕様や挙動が変わるような場合に使用します。
その他
| 定義 | 機能 |
| CSHARP_7_3_OR_NEWER | C#7.3をサポートする |
| ENABLE_IL2CPP | IL2CPPが有効 |
| DEVELOPMENT_BUILD | ビルド時に”Development Build”が有効になっている |
Development Build はBuild Settingsウィンドウの以下の部分です。

Scripting Define Symbols
#define 〜 でシンボルを定義できますが、これはソースファイル内のみ有効です。
全てのソースファイル上に定義するわけにも行かないので、UnityEditor上でプロジェクト全体で有効になるシンボルを定義できます。
UnityEditorのメニューから
Edit → Project Settings…を選択します。
Playerを選択し、Other Settings内にあるScripting Define Symbolsから編集できます。
プラットフォーム別に設定できます。

例えば、アプリをストアで配信する際に以下の様に変更したとします。

RELEASEが定義されているので、以下のログは表示されなくなります。
private void Awake()
{
#if !RELEASE
Debug.Log("デバッグ中");
#endif
}
まとめ
条件付きコンパイルについて説明しました。
これを使うことで、プラットフォームやバージョンによって違う挙動を実装することが容易になります。
特に、プラットフォームごとの微妙な違いを吸収するためや、デバッグ用のコードを本番環境から除外するために有効です。
うまく使いこなしましょう。