こんなことってありませんか?
自作のツールにWebとかで使われているラジオボタンを実装したい!
そのお悩みこの記事を読んだ人は解決する手段の一つをてにいれるかもしれません。
早速実装
今回は手短に実装
以下を関数に作成するだけ
/// <summary>
/// ラジオボタン、変更したら通知を受け取れる。
/// </summary>
/// <param name="_now_select">現在選択しているもの</param>
/// <param name="_radio_name">ラジオで表示する文字列</param>
/// <param name="_notification">変更された際に通知を行うためのもの</param>
/// <param name="_layout">レイアウト</param>
/// <returns>選択しているもの</returns>
public int Radio(int _now_select,string[] _radio_name,System.Action<int> _notification,params GUILayoutOption[] _layout)
{
int _prev_select = _now_select;
bool[] _radio_prev = new bool[_radio_name.Length];
_radio_prev[_now_select] = true;
//羅列分描画を行う。
for (int _i = 0;_i < _radio_name.Length;_i++)
{
bool _result = EditorGUILayout.Toggle(_radio_name[_i], _radio_prev[_i], EditorStyles.radioButton, _layout);
//_radio_prev[_i],_radio_name[_i],null,_layout);
if(_result != _radio_prev[_i])
{
_now_select = _i;
}
}
//選択しているものが違う状態になったら通知
if(null != _notification && _now_select != _prev_select)
{
_notification(_now_select);
}
return _now_select;
}
上記を実装すると以下の感じになります。
文字列として、国名を引数として渡しています。
解説
おおよそコード通りなのですが、
UI部分にEditorGUILayout.Toggleを使っています。
通常、この場合はToggleボタンが出てしますのですが、EditorStyles.radioButton
にてラジオボタンにしています。
このEditorStylesによって、性質が似た入力のものなら、見た目を変更する事が可能です。
それに加えて、1つしか選択されていない処理をしているだけの
シンプルなコードになっています。(もうちょいスマートなやり方はある気がするが・・・)
ちなみに ToggleLeftに使用すると・・・
今回では、EditorGUILayout.Toggleを使っていますが、非常に不細工な格好になっています。
ToggleLeftを使えば行けるんじゃないか?
なんて事を考えた方もいらっしゃるかもしれません。
しかしながら、ToggleLeftを使用すると
チェックボックス+ラジオボタンという奇妙な形になってしまいます。
推測ですが、ToggleLeftでのStyleの内容には、文字を左に移動させているみたいな処理が働く設定が
設定がされており、それが影響して、左に行っていると思われます。
解決方法
なので、Radioボタンを左に行う方法としては2つかなと個人的には考えています。
1.ToggleLeftの左に移動させるパラメーターを探してそれと同じようにする。
2.Radioボタンの左にLabelをHorizontalで配置する。
1に関しては、正直な所おすすめはしない事ではありますが、方法の一つとして提示させていただきます。
(ただし必ずしもできるとはいっていない)
というのも、Styleには、触れてないパラメータも多くあり、仮に、RadioボタンとToggleLeftの値を、全部見比べるだけでもなかなか大変な上、実際にその影響のしている箇所を見つけても
ラジオが左によるとは限らないからです。
苦労の割には少し見合わないかなと思います。
2に関しては、手軽に調整等を行えるので、関数だけ作ってしまえば、
非常に導入が簡単になるのかなと思います。(たぶん)