ポップアップウィンドウの作成(Editor拡張)

ポップアップウィンドウの作成(Editor拡張)

 Editor拡張でポップアップウィンドウ作成する方法です。

その1

 PopupWindowContentを継承したクラスを作成し、これをPopupWindow.Showでポップアップウィンドウとして開きます。

Script

 下記Scriptでは、表示されたボタンを押すとポップアップウィンドウが開きます。このポップアップウィンドウ内に前回作成したラジオボタンを表示し、選択したボタンのインデックスを取得できるようにしています。

ラベルなし

 ポップアップウィンドウを開くためのボタンのみを表示し、ボタンが押されると、ポップアップウィンドウが開くScriptです。

下記のコードにより、ボタンを作成する際に使用するRectを取得します。

先ほど取得したRectを用いてボタンを作成します。ボタンが押された時、if文内のコードが実行されます。

以下のコードで、作成するポップアップウィンドウの大きさと位置を計算しています。

switch文によってポップアップウィンドウが表示される位置を変更しています。

先程計算したポップアップウィンドウのサイズと表示位置からRectを作成し、さらに、ポップアップウィンドウのインスタンスを作成します。これらを用いてPopupWindow.Showでポップアップウィンドウを開きます。

ラベルあり

 ラベルを表示するために以下に示す部分が変更されています。それ以外の部分はラベルなしの場合と同様です。

ポップアップウィンドウ部分

これより記述するコードがポップアップウィンドウを描画するためのコードとなります。GetWindowSize()でポップアップウィンドウの大きさを決めています。

そして、ポップアップウィンドウで表示したい内容はOnGUI()へ記述します。CustomEditorGUILayout.RadioButton()によってラジオボタンを作成し、m_callback?.Invoke(m_selected)を実行することで、選択されているラジオボタンのインデックスを取得しています。

実行結果

 以上のScriptを用いてポップアップウィンドウを作成するScriptは以下の通りです。コールバック関数はインデックスを取得するだけの処理となっています。

以下の画像より、問題なく動作していることが分かります。

その2

 その1ではコールバック関数を用いて、ラジオボタンのインデックスを取得していました。その2では、インデックスをメソッドの返り値として受け取れるようにしました。

Script

 作成したScriptは以下の通りです。ウィンドウの大きさの計算やボタンの作成部分はその1のScriptと同様です。

ラベルなし

 ポップアップウィンドウを開くためのボタンのみを表示し、ボタンが押されると、ポップアップウィンドウが開くScriptです。

コールバック関数を用いないでインデックスを管理するためにPopUpInfoを作成しました。

ポップアップウィンドウを開いた際、PopUpInfoのインスタンスを作成します。その際、PopUpInfoのinstanceへインスタンスを渡します。instanceはstaticなので、最後に開いたポップアップウィンドウのPopUpInfoのインスタンスが保存されます。そのため、最後にポップアップウィンドウを開いたコントロールのみGetSelectedValueによって変更されたインデックスを取得することができます。また、SetSelectedValueによりPopUpInfoへインデックスを渡します。

ラベルあり

 ラベルを表示するためにコードが追加されていますが、その1と同様なので説明は割愛します。

実行結果

 以上のScriptを用いてポップアップウィンドウを作成するScriptは以下の通りです。

以下の画像より、問題なく動作していることが分かります。

参考ページ

Unity|DOCUMENTATION:PopupWindow

GitHub:Unity-Technologies/UnityCsReference

LIGHT11:【Unity】【エディタ拡張】テキスト入力用ポップアップを実装する