Unityでアプリ開発をしている時にハマった問題に関する対処法のメモ。
iOS向けの実装と、Android向けの実装、Unityエディター向けの実装をそれぞれ実装した後、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