AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

【Unity】エディターではビルドできるのにiOSプロジェクトを出力しようとするとエラーが出る

https://unity3d.com/files/images/ogimg.jpg?1


Unityでアプリ開発をしている時にハマった問題に関する対処法のメモ。

iOS向けの実装と、Android向けの実装、Unityエディター向けの実装をそれぞれ実装した後、Unityエディター上で動作確認して問題なかったので、iOSプロジェクトを出力しようとしたら、下記のようなエラーが出ました。

【Unity】エディターではビルドできるのにiOSプロジェクトを出力しようとするとエラーが出る

Assets/Scripts/Capture/CaptureManager.cs(24,17): error CS0103: The name 'OnFailCapture' does not exist in the current context
Error building Player because scripts had compiler errors
Build completed with a result of 'Failed'
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
UnityEditor.BuildPlayerWindow+BuildMethodException: 2 errors
at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (UnityEditor.BuildPlayerOptions options) [0x00234] in /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPlayerWindowBuildMethods.cs:190
at UnityEditor.BuildPlayerWindow.CallBuildMethods (System.Boolean askForBuildLocation, UnityEditor.BuildOptions defaultBuildOptions) [0x0007f] in /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPlayerWindowBuildMethods.cs:96
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

さっきまで普通にビルドできていたはずなのに、いきなり結構な量のエラーが出たのでちょっと焦りました。


原因:iOS向けのコード部分でエラーが出ていた

色々調べて行った結果、iOS向けのコード部分でエラーが出ていたようです。

public void Execute()
    {
        #if UNITY_EDITOR
            Debug.Log("Unity Editor");
        #elif UNITY_IPHONE
                Debug.Log("Unity iPhone");
            OnFailCapture(); //ここでエラー
        #else
            Debug.Log("Any other platform");
        #endif
    }

Unityエディターで動作確認した際は、Unityエディター向けの条件分岐しか通ってなかったのでエラーが出てなかったようです。
(よくよくエラーログを見たら、ここでエラーが出ていたようですが、エラーが大量に出たことと、Unityエディターではビルドが通ったのでプログラム自体は問題ないだろうと思い発見に時間がかかりました。)

このような条件分岐はPlatform Dependent Compilation(プラットフォーム依存コンパイル)と呼ばれるらしいですが、

プラットフォーム依存コンパイルだと、現在設定中のプラットフォームに関するチェックしか行わないようなので、
Application.platformの方を使う方が今回のような問題は発生しにくいのかもって思いました。

参考:
qiita.com