ObjectFieldの作成(Editor拡張)

ObjectFieldの作成(Editor拡張)

 EditorGUILayout.ObjectFieldやEditorGUI.ObjectFieldはGUIStyleを設定できないため、これらのコントロールは見た目の変更ができません。そこで、GUIStyleを自由に変更できるObjectFieldを作成しました。

Script

 作成したscriptは以下の通りです。

ボタンなし

 ボタンがない場合のオブジェクトフィールドのScriptです。

ボタンあり

 ボタンがある場合のオブジェクトフィールドのScriptです。

EditorGUIUtility.ObjectContentにより、オブジェクトの名前とそのオブジェクトの型に応じたアイコンを有するGUIContentを取得することができます。取得したGUIContentはObjectFIeldを表示する際に使用します。

コントロール用のIDとオブジェクトピッカー用のIDを取得します。

ObjectSelectorUpdatedはオブジェクトピッカーで選択されたオブジェクトが変更された際に呼び出されます。また、EditorGUIUtility.GetObjectPickerControlIDにより開かれているオブジェクトピッカーのIDが取得できます。これらを用いてこのコントロールで開かれたオブジェクトピッカーで選択されたオブジェクトに変更があったかを判定することができます。これらの条件が満たされた場合にEditorGUIUtility.GetObjectPickerObjectによってオブジェクトピッカーで選択されたオブジェクトを取得します。

ドラック&ドロップ

ドラック&ドロップが操作されているときの処理です。

ドラック

 EventType.DragUpdatedはドラック&ドロップで操作が更新された時、EventType.DragPerformはドラック&ドロップの操作を実行したときに呼ばれます。ドラックに関する処理はこれらのイベントが発生しているときに行います。

ドロップ

 ドロップが実行されるとEventType.DragExitedが呼ばれます。コントロール内へドロップが実行された時、コントロールへオブジェクトを格納します。

マウスクリック

 左クリックされた際の処理です。ラベルやオブジェクトフィールドの見た目を変更、ボタンクリック時にオブジェクトピッカーを開く及びオブジェクトをProjectビュー内でハイライト表示を行います。

コントロールの描画

 コントロールの描画はGUIStyle.Drawを用いて行います。GUIStyle.DrawはRepaint時にのみ実行します。

実行結果

 作成したObjectFIeldを実行するScriptは以下の通りです。

上記Scriptを実行すると以下のように動作します。オブジェクトピッカーやドラック&ドロップによりコントロールへオブジェクトを格納できていることが分かります。

参考サイト

エディター拡張入門:第19章 GUI を自作する