条件付きコンパイルとは?
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
}
まとめ
条件付きコンパイルについて説明しました。
これを使うことで、プラットフォームやバージョンによって違う挙動を実装することが容易になります。
特に、プラットフォームごとの微妙な違いを吸収するためや、デバッグ用のコードを本番環境から除外するために有効です。
うまく使いこなしましょう。