こんにちは、Unityエンジニアのオオバです。
iOSやAndroid、PC向けと1つのソースコードで複数のプラットフォーム向けプロダクトを開発していると、Unityエディタでは正常なのにビルド時にコンパイルエラーが起きることがあります。
理由は明確で、各プラットフォーム向けの固有コードがコンパイルエラーを起こしているためです。
Unityが複数プラットフォームに対応しているとはいえ、Unityが提供しない機能はどうしてもプラットフォーム固有の処理を実装しなければなりません。
対応プラットフォームが増えれば増えるほど、こういった特殊処理は増加しています。Unityエディタ上でサクッと各プラットフォームの状態を確認できたら良いのですができません。
しかもビルド後に気づくエラーは修正に時間がかかります。気持ちとしては実機テスト満々でビルドしたのにエラーで失敗しているとテンションも下がってしまいますよね。
できればビルド前にエラーを潰しておきたいところ。
そこで本記事では各プラットフォームのビルドエラーを事前に確認する方法を紹介します。ビルドエラーに困っている方はぜひ最後まで読んでみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
そもそもなぜUnityエディタでは正常でビルドエラーが起きるのか?
そもそもなぜUnityエディタでは正常でビルドエラーが起きるのでしょうか。理由は各プラットフォーム固有のコードがコンパイルエラーを起こしているためです。
次のコードを見てみましょう。
void Start()
{
#if UNITY_ANDROID
Hoge();
#endif
}
Android環境でのみHogeメソッドを実行するコード です。UnityエディタのビルドターゲットがiOS向けだった場合、Hogeは呼ばれません。つまり、このHogeが宣言されていない場合、コンパイルエラーになるということです。
しかしビルドターゲットがiOS向けやPC向けのUnityエディタで作業していた場合は、コンパイルエラーにならないためミスに気づきづらいです。
結局ビルドして初めてエラーに気づくということになるのです。
プラットフォーム固有コードの書き方
ではプラットフォーム固有のコードはどのように書くのでしょうか。記法を知ることで事前にミスに気づきやすくなります。
具体的には #if プラットフォーム名 で始まり #endif で終わります。
以下のようなコードです。
#if UNITY_IOS
// iOS向け固有コード
#elif UNITY_ANDROID
// Android向け固有コード
#else
// iOS、Android以外向けコード
#endif
この #if 〜 #endif はプリプロセッサディレクティブと呼ばれ、条件付きコンパイルするための仕組みです。
UNITY_IOS や UNITY_ANDROID といったシンボルを指定することでプラットフォーム固有のコードを記述できるのです。
プラットフォーム向けシンボルは数多く用意されています。よく使うシンボルは以下。
| シンボル | プラットフォーム |
|---|---|
| UNITY_EDITOR | Unityエディタ |
| UNITY_IOS | iOS |
| UNITY_ANDROID | Android |
| UNITY_EDITOR_WIN | Windows |
| UNITY_EDITOR_OSX | MacOS |
| UNITY_WEBGL | WebGL |
他にも多く定義されています。詳しくはこちらのUnity公式マニュアルを参考にしてみてください。
→ Unity公式マニュアル
各プラットフォーム向けにコンパイルしてエラーをあぶり出す
ここからが本題。ではどのようにしてビルド前に各プラットフォームのコンパイルを行うのでしょうか。
実はUnity側が機能として用意してくれています。具体的には以下のコードです。
var option = new ScriptCompilationSettings
{
target = BuildTarget.Android,
group = BuildTargetGroup.Android
};
PlayerBuildInterface.CompilePlayerScripts(option, "Temp/CompileResult");
PlayerBuildInterface.CompilePlayerScripts に対してプラットフォーム情報を渡すとビルドせずともコンパイルを実行してくれます。
コンパイルエラーがあればConsoleウィンドウにエラーが表示され、成功ならば何も出力されません。
ただし、このままだと使いづらいので、簡単なツールを作ってみました。
UnityPlatformCompileCheckerを使う
ビルド前のエラーチェックをしやすくするため、UnityPlatformCompileChecker というツールを作ってみました。このツールはUnityのメニューから簡単に呼び出し、各プラットフォームごとのコンパイルを実行できます。
メニューTools -> CompileChecker から各プラットフォームを選択します。
もしコンパイルに失敗したらConsoleウィンドウに以下のような感じでエラーが表示されます。
成功した場合は次のように「SUCCESS」と出力されます。
プラットフォーム固有のコードを追加、修正した場合はビルド前にメニューからプラットフォーム向けにコンパイルしてエラーがないかチェックすると開発効率が向上すると思います。
UnityPlatformCompileCheckerのインストール方法
もしUnityPlatformCompileCheckerを試したい方は、Unity Package Managerから簡単にインストール可能です。
メニューWindow -> Package Manager からPackage Managerウィンドウを開きます。

「+」ボタンから「Install package from git URL...」を選択してください。

入力フォームに https://github.com/baobao/UnityPlatformCompileChecker.git?path=Assets/UnityPlatformCompileChecker を入力して「Install」ボタンをクリックします。
しばらくするとインストールは完了します。
使い方は前述の通り、メニューTools -> CompileChecker から各プラットフォームを選択してみてください。
ソースコードはGitHubにアップロード済みです。興味ある方はチェックしてみてください。
→ UnityPlatformCompileChecker | GitHub
まとめ
本記事ではUnityエディタ上は正常なのにアプリビルドするとエラーが起きる状況を改善する方法を解説しました。
PlayerBuildInterface.CompilePlayerScripts でビルド前にエラーを検知することで、開発効率は向上します。
またビルド前のエラー検知に自作の「UnityPlatformCompileChecker」も紹介させていただきました。お手軽にインストールできて、サクッと実行できるので興味ある方は試してみてください。
→ UnityPlatformCompileChecker | GitHub

筆者のXをフォローしよう
Unityオブジェクトの描画順の制御って難しいですよね。
この度、Unityの描画順を体系的に学べる「Unity描画順の教科書」を執筆しました。
Unityの描画順を基礎から学びたい方はぜひ確認してみてください!
→ Unity描画順の教科書
最後まで読んでいただきありがとうございました!
すばらしいゲーム開発ライフをお過ごしください。
- Unity6000.0.51f1
















