エディタ拡張機能の入ったアセットを使ったプロジェクトを実機向けにビルドしようとしたらエラーが出た話
何について書いた記事なのか?
Unityで作成したゲームを実機向けにビルドした時にだけシンボルが見つからずにエラーになる現象の対応方法について書きました。
TL;DR
エディタ拡張関連のスクリプトはAssets/Editorフォルダに配置しましょう。
どんな問題が起きたか
それまでUnity Editor上のPlayボタンで実行させながら開発中のゲーム。Build Settingから Android向けのビルドに切り替えて.apkにビルドしようとすると以下のようなエラーが出た。
The type or namespace name 'InitializeOnLoadAttribute' could not be found
とのこと。
エラーが出ている場所はAsset Storeのセールで購入したModern UI Pack。
メッセージの内容としてはよく見かけるものだが、それゆえに対応方法がぱっと思いつかない。Visual Studioで見るとなんのエラーも出ていない。Windows向けのビルドであれば問題なくビルドできたのに。
調査
エラーメッセージで検索したところ、似たエラーメッセージで困っているという質問と回答が見つかった。
The type or namespace name `UnityEditor' could not be found - Unity Answers
ベストアンサーではUnityのWikiの「アセットフォルダ内の特別な名前のフォルダ」という項目を見よ、と言っている。
Special Folder Names in your Assets Folder
Assetsフォルダ直下に置かれたEditorという名前のフォルダは特別扱いされ、Unityエディタからしか使われなくなると書かれている。
問題の解決
Assets/Modern UI Pack/Editor フォルダを(Sceneではなく)Projectのヒエラルキー上にドラッグアンドドロップして移動する。
Assets直下にEditorフォルダが移動した
Please uncheck 'Scripts Only Build' and build again と言われるので、チェックを外してもう一度やってみる。
無事インストールできた。
問題の原因
Modern UI Packはエディタ上でコントロールパネルを表示して設定を行うことができたり、Unityのメニューからそのコントロールパネルを開いたりできるようになっている。おそらくこれを実現するためのUnityエディタ拡張スクリプトが、Android向けのビルドでは依存性が解決できずにエラーになっていたに違いない。なお、後から検証したところ、AndroidアプリではなくWindows用のスタンドアローンアプリケーションとしてビルドした時にも同じ原因でエラーが発生した。
結論
エディタ拡張機能を含むアセットをインポートした場合、アセット内にEditorというフォルダがあったらAssets/Editorにあることを確認すること。
環境
Windows 10
Unity 2019.4.14f1 Personal
Discussion