こんにちは、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_IOSUNITY_ANDROID といったシンボルを指定することでプラットフォーム固有のコードを記述できるのです。

    プラットフォーム向けシンボルは数多く用意されています。よく使うシンボルは以下。

    シンボルプラットフォーム
    UNITY_EDITORUnityエディタ
    UNITY_IOSiOS
    UNITY_ANDROIDAndroid
    UNITY_EDITOR_WINWindows
    UNITY_EDITOR_OSXMacOS
    UNITY_WEBGLWebGL

    他にも多く定義されています。詳しくはこちらのUnity公式マニュアルを参考にしてみてください。
    Unity公式マニュアル

    各プラットフォーム向けにコンパイルしてエラーをあぶり出す

    ここからが本題。ではどのようにしてビルド前に各プラットフォームのコンパイルを行うのでしょうか。

    実はUnity側が機能として用意してくれています。具体的には以下のコードです。

    var option = new ScriptCompilationSettings  
    {
        target = BuildTarget.Android,  
        group = BuildTargetGroup.Android  
    };  
    PlayerBuildInterface.CompilePlayerScripts(option, "Temp/CompileResult");  
    

    PlayerBuildInterface.CompilePlayerScripts に対してプラットフォーム情報を渡すとビルドせずともコンパイルを実行してくれます。

    コンパイルエラーがあればConsoleウィンドウにエラーが表示され、成功ならば何も出力されません。

    ただし、このままだと使いづらいので、簡単なツールを作ってみました。

    UnityPlatformCompileCheckerを使う

    ビルド前のエラーチェックをしやすくするため、UnityPlatformCompileChecker というツールを作ってみました。このツールはUnityのメニューから簡単に呼び出し、各プラットフォームごとのコンパイルを実行できます。

    【Unity】アプリビルドエラーを事前に検知する方法_0

    メニューTools -> CompileChecker から各プラットフォームを選択します。

    もしコンパイルに失敗したらConsoleウィンドウに以下のような感じでエラーが表示されます。
    【Unity】アプリビルドエラーを事前に検知する方法_1

    成功した場合は次のように「SUCCESS」と出力されます。
    【Unity】アプリビルドエラーを事前に検知する方法_2

    プラットフォーム固有のコードを追加、修正した場合はビルド前にメニューからプラットフォーム向けにコンパイルしてエラーがないかチェックすると開発効率が向上すると思います。

    UnityPlatformCompileCheckerのインストール方法

    もしUnityPlatformCompileCheckerを試したい方は、Unity Package Managerから簡単にインストール可能です。

    【Unity】アプリビルドエラーを事前に検知する方法_3

    メニューWindow -> Package Manager からPackage Managerウィンドウを開きます。

    【Unity】アプリビルドエラーを事前に検知する方法_4
    「+」ボタンから「Install package from git URL...」を選択してください。

    【Unity】アプリビルドエラーを事前に検知する方法_5
    入力フォームに https://github.com/baobao/UnityPlatformCompileChecker.git?path=Assets/UnityPlatformCompileChecker を入力して「Install」ボタンをクリックします。

    しばらくするとインストールは完了します。

    使い方は前述の通り、メニューTools -> CompileChecker から各プラットフォームを選択してみてください。

    【Unity】アプリビルドエラーを事前に検知する方法_6

    ソースコードはGitHubにアップロード済みです。興味ある方はチェックしてみてください。

    UnityPlatformCompileChecker | GitHub

    まとめ

    本記事ではUnityエディタ上は正常なのにアプリビルドするとエラーが起きる状況を改善する方法を解説しました。

    PlayerBuildInterface.CompilePlayerScripts でビルド前にエラーを検知することで、開発効率は向上します。

    またビルド前のエラー検知に自作の「UnityPlatformCompileChecker」も紹介させていただきました。お手軽にインストールできて、サクッと実行できるので興味ある方は試してみてください。

    UnityPlatformCompileChecker | GitHub

    Unityオブジェクトの描画順の制御って難しいですよね。
    この度、Unityの描画順を体系的に学べる「Unity描画順の教科書」を執筆しました。

    Unityの描画順を基礎から学びたい方はぜひ確認してみてください!
    Unity描画順の教科書

    最後まで読んでいただきありがとうございました!
    すばらしいゲーム開発ライフをお過ごしください。

    オススメ記事
    検証環境