【Unity】ビルド時にPropertyDrawerが見つからないエラーが出るのはバグじゃない

これはゲーム開発エンジン Unity に関する記事です。
この記事では、ビルドしたときに “PropertyDrawer” could not be found と書かれたエラーが出た場合の対処法を書きます。
 

PropertyDrawer が何か?については重要ではないので、この記事では割愛します。
興味がある方のために公式ドキュメントのリンクを貼っておきます。

PropertyDrawer のナゾ

PropertyDrawer は UnityEngine 名前空間の中にありますが、エディタ拡張で使う機能です。
PropertyDrawer は GUIDrawer を継承していて、GUIDrawer は UnityEditor 名前空間の中にあります。

GUIDrawer と PropertyDrawer の関係は以下の通り。

UnityEditor.GUIDrawer
↑ 親
UnityEngine.PropertyDrawer

親が UnityEditor の中にあるので、子の PropertyDrawer も親と同じ場所(UnityEditor)に置いとけよ!…と思うのですが、なぜか UnityEngine の中にあります。

謎です。

ビルド時にエラーが出た理由

エディタ拡張の機能(UnityEditorを継承しているもの全て)はビルド時に取り除かれてから、ビルドのためのコンパイルが行われます。
そのため、ビルド時に PropertyDrawer を使っているスクリプトがあると、PropertyDrawer はビルド対象から取り除かれているため、PropertyDrawer が見つからず、コンパイラがエラーを吐くという流れになります。

更に細かい説明
細かいことを言うと、ビルド時に using UnityEditor; と書かれた行でエラーが出ることはないので、ビルド時に UnityEditor 名前空間が無効になるわけではなく、UnitiEditor の中に書かれているコードが無効になる…ということが分かります。
要するに、ビルド時に UnityEditor は参照できるけど、UnityEditor の中身は参照できなくなる…ということです。

これは意図してそういう設計になっているので、バグではありません。
ビルドできるようにするには、ビルド時に PropertyDrawer を参照しないよう設定を行う必要があります。

エラーが出ないようにするには?

2通りの解決方法が用意されています。

      方法1 #if UNITY_EDITOR ~ #endif で挟む。
      方法2 スクリプトを Assets/Editor フォルダに置く。
#if UNITY_EDITOR ~ #endif で挟む。

 

using UnityEngine;
#if UNITY_EDITOR
public class SampleDrawer : PropertyDrawer
{
}
#endif

#if UNITY_EDITOR ~ #endif で挟まれたコードは、ビルドされません。
なので、PropertyDrawer を参照している部分を挟んでやれば、ビルドが通るようになります。

スクリプトを Assets/Editor フォルダに置く。

Assets フォルダの直下に Editor フォルダを新規作成し、その中に PropertyDrawer や UnityEditor を参照しているスクリプトを移動します。
Assets フォルダ直下の Editor フォルダでないと認識してくれません。
このフォルダに入っているスクリプトはビルドされません。

いちいちスクリプトに #if UNITY_EDITOR と書くのは面倒なので、基本的に Editor フォルダを使う形で対応することになると思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です