[Unityエディター拡張] ポップアップ(セレクトボックス)の設置

ヨメレバCSS
オリジナルCSS

項目の選択(単数)

複数の項目から選択するセレクトボックスを設置するにはPopupを使います。

これも、ポップアップという名前だけれど見た感じセレクトボックス。

EditorGUILayoutSample obj = target as EditorGUILayoutSample;
obj.selectedIndex = EditorGUILayout.Popup (obj.selectedIndex, new string[]{"zero", "one", "two", "three"});

これで、

2_7_popup

こういう感じの。

戻り値が選択したインデックスになっていて、それは第2引数の配列のインデックスと対応しています。

配列ではなくEnumから選択するときは、EnumPopupを使います。

こういうEnumを用意して、

public enum SampleEnum
{
	ONE, 
	TWO, 
	THREE, 
};

その変数を指定してやると、自動的にリストアップしてくれます。

EditorGUILayoutSample obj = target as EditorGUILayoutSample;
obj.selectedEnum = (EditorGUILayoutSample.SampleEnum)EditorGUILayout.EnumPopup ("select enum", obj.selectedEnum);

こんな感じで。

2_7_enumpopup

項目の選択(複数)

複数選択をするときは、MaskFieldを使います。

これはちょっと変則的で、戻り値がチェックされた配列インデックスのマスク値になります。

EditorGUILayoutSample obj = target as EditorGUILayoutSample;
obj.selectedMask = EditorGUILayout.MaskField (obj.selectedMask, new string[]{"zero", "one", "two", "three"});

とすると、

2_7_maskfield

というように、複数チェックをつけられるボックスになります。

Nothingは何もなし、Everythingはすべて選択になります。

戻り値はNothingが0、Everythingは-1です。

それ以外は順にビット値の二進数が振られており、zeroが1、oneが10、twoが100…となって、戻り値はチェックされた項目のORになります。

注意点は全部チェックしたらすべてのビットが1になっているようで、その後に一部のチェックを外してもint型としてはマイナス値のまま(符号ビットがオンのまま)のよう。外すときはXORしかしていないようですね。

なので、MaskFieldで選択するときは、その結果を数値として判定せず、ちゃんとビット演算でANDを取らないとバグるということになりそう。

EnumPopupと同様に、Enumを指定できるEnumMaskFieldもあります。

EditorGUILayoutSample obj = target as EditorGUILayoutSample;
obj.selectedEnum = (EditorGUILayoutSample.SampleEnum)EditorGUILayout.EnumMaskField ("select enum", obj.selectedEnum);

こうで、

2_7_enummaskfield

こう。

この戻りもMaskField同様のビット演算の結果になります。

ややこしいのは、EnumMaskFieldの戻りは型としてはEnumなのですが、実際にはこのビット演算の結果になるので、Enum値としては間違った状態になるところです。

例えば

public enum SampleEnum
{
	ONE = 1, 
	TWO = 2, 
	THREE = 3, 
};

というように数値を定義して、ONEとTREEEをチェックしたとき、戻り値は「5」になります。001と100のOR値ですね。

これを使用するときには特に注意して、定義と判定をする必要がありそうです。

またEnumMaskFieldと同じ効果のEnumMaskPopupというメソッドもありましたが、どこにも情報がないのでおそらくもう使われていないものなのでしょう。

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)