条件付きコンパイルとは?

Unityは1つのソースコードで、複数のプラットフォーム向けにビルドすることが出来ます。

例えば、AndroidiOS両対応のゲームを作っているケースも多いでしょう。

しかし、それぞれのプラットフォームでは扱える機能や実装の仕方が異なることがあります。

このような場合、条件付きコンパイルを利用すると、プラットフォームごとに異なるコードを書くことが出来ます。

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_EDITORUnityEditor向け
UNITY_ANDROIDAndroid向け
UNITY_IOSiOS向け
UNITY_STANDALONE_WINWindows向け

他にもあります。

プラットフォーム向けのシンボルは、ビルド時にも定義されますが、Editor上でも現在のプラットフォームに対応したシンボルが定義されます。

例えば、Andoridプラットフォームになっている場合、UNITY_ANDROIDUNITY_EDITORが有効になっています。

エディターバージョン

使用中のUnityEditorのバージョンに関連したものになります。

定義機能
UNITY_2022Unity2022系
UNITY_2021_OR_NERWERUnity2021より新しいバージョン

制作したコンポーネントが複数のUnityバージョンをサポートする必要があり、

バージョンによって仕様や挙動が変わるような場合に使用します。

その他

定義機能
CSHARP_7_3_OR_NEWERC#7.3をサポートする
ENABLE_IL2CPPIL2CPPが有効
DEVELOPMENT_BUILDビルド時に”Development Build”が有効になっている

Development Build はBuild Settingsウィンドウの以下の部分です。

Scripting Define Symbols

#define 〜 でシンボルを定義できますが、これはソースファイル内のみ有効です。

全てのソースファイル上に定義するわけにも行かないので、UnityEditor上でプロジェクト全体で有効になるシンボルを定義できます。

UnityEditorのメニューから

EditProject Settings…を選択します。

Playerを選択し、Other Settings内にあるScripting Define Symbolsから編集できます。

プラットフォーム別に設定できます。

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

RELEASEが定義されているので、以下のログは表示されなくなります。

private void Awake()
{
	#if !RELEASE
		Debug.Log("デバッグ中");
	#endif
}

まとめ

条件付きコンパイルについて説明しました。

これを使うことで、プラットフォームやバージョンによって違う挙動を実装することが容易になります。

特に、プラットフォームごとの微妙な違いを吸収するためや、デバッグ用のコードを本番環境から除外するために有効です。

うまく使いこなしましょう。

🔗関連ページ