これはゲーム開発エンジン Unity に関する記事です。
この記事では、ビルドしたときに “PropertyDrawer” could not be found と書かれたエラーが出た場合の対処法を書きます。
PropertyDrawer が何か?については重要ではないので、この記事では割愛します。
興味がある方のために公式ドキュメントのリンクを貼っておきます。
PropertyDrawer は UnityEngine 名前空間の中にありますが、エディタ拡張で使う機能です。
PropertyDrawer は GUIDrawer を継承していて、GUIDrawer は UnityEditor 名前空間の中にあります。
GUIDrawer と PropertyDrawer の関係は以下の通り。
↑ 親
UnityEngine.PropertyDrawer
親が UnityEditor の中にあるので、子の PropertyDrawer も親と同じ場所(UnityEditor)に置いとけよ!…と思うのですが、なぜか UnityEngine の中にあります。
謎です。
エディタ拡張の機能(UnityEditorを継承しているもの全て)はビルド時に取り除かれてから、ビルドのためのコンパイルが行われます。
そのため、ビルド時に PropertyDrawer を使っているスクリプトがあると、PropertyDrawer はビルド対象から取り除かれているため、PropertyDrawer が見つからず、コンパイラがエラーを吐くという流れになります。
これは意図してそういう設計になっているので、バグではありません。
ビルドできるようにするには、ビルド時に PropertyDrawer を参照しないよう設定を行う必要があります。
2通りの解決方法が用意されています。
- 方法1 #if UNITY_EDITOR ~ #endif で挟む。
- 方法2 スクリプトを Assets/Editor フォルダに置く。
例
using UnityEngine; #if UNITY_EDITOR public class SampleDrawer : PropertyDrawer { } #endif
#if UNITY_EDITOR ~ #endif で挟まれたコードは、ビルドされません。
なので、PropertyDrawer を参照している部分を挟んでやれば、ビルドが通るようになります。
Assets フォルダの直下に Editor フォルダを新規作成し、その中に PropertyDrawer や UnityEditor を参照しているスクリプトを移動します。
Assets フォルダ直下の Editor フォルダでないと認識してくれません。
このフォルダに入っているスクリプトはビルドされません。
いちいちスクリプトに #if UNITY_EDITOR と書くのは面倒なので、基本的に Editor フォルダを使う形で対応することになると思います。
「【Unity】ビルド時にPropertyDrawerが見つからないエラーが出るのはバグじゃない」への1件のフィードバック