設定画面なんかでよく使うチェックボックスやラジオボタンのメモ。
スクリプトで管理して値保存もする。
Checkbox(ON / OFF ボタン)
Create > toggle からトグルボタンを新規作成して中身をイジる。
- Labelを削除
- BackgroundのImageにOFFのスプライトをアタッチ
- CheckmarkのImageにONのスプライトをアタッチ
- Background、CheckmarkのPositionとSizeを同じにする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; using UnityEngine.UI; public class CTRL : MonoBehaviour { [SerializeField]Toggle toggle1,toggle2; [SerializeField]Text text; void Start(){ toggle1.isOn = PlayerPrefs.GetInt("toggle1")==1?true:false; toggle2.isOn = PlayerPrefs.GetInt("toggle2")==1?true:false; toggle1.onValueChanged.AddListener((b)=>{PlayerPrefs.SetInt("toggle1",b?1:0);}); toggle2.onValueChanged.AddListener((b)=>{PlayerPrefs.SetInt("toggle2",b?1:0);}); } void Update () { text.text = "Toggle1 " + (toggle1.isOn?"ON":"OFF") + " , Toggle2 " + (toggle2.isOn?"ON":"OFF"); } } |
PlayerPrefs には bool が保存できないので int で保存。
Radio Button(択一ボタン)
チェックボックスを並べてスクリプトで管理しても実現できるけど、数が増えるとスクリプトが長くなって面倒になる。(配列を使えば多少はマシ)
もっと簡単に普通のボタン機能を使ってラジオボタンを作ってみる。
まず空(Empty)オブジェクトの下にラジオボタングループを配置する。
中のボタンを以下のように変更する。
- ButtonのTransitionをSprite Swapに変更
- ImageにOFFのスプライトをアタッチ
- Disabled SpriteにONのスプライトをアタッチ
- Onclickに関数をアタッチ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; using UnityEngine.UI; public class CTRL : MonoBehaviour { [SerializeField] Transform btns; void Start(){ SetBtns(); } public void PushBtn(int n){ PlayerPrefs.SetInt("radio",n); SetBtns(); } void SetBtns(){ int r = PlayerPrefs.GetInt("radio"), cnt=0; foreach(Transform b in btns){ b.GetComponent<Button>().interactable = (cnt!=r); cnt++; } } } |
ボタンのほうに関数をアタッチするのでスクリプトはシンプルになる。
欠点として選択済みのボタンが押せないけど普通のラジオボタンなら問題ないはず。
追記:Radio Button その2
Toggle Groupを使った方法。
1.Checkbox と同じ要領で Toggle を複数用意する
2.どれか1つに Toggle Group コンポーネントを追加
3.全部の Toggle コンポーネントの Group に Toggle Group をアタッチ
4.Toggle Group をスクリプトで管理
1 2 3 4 5 6 7 8 9 10 11 12 |
... using System.Linq; using UnityEngine.UI; ... [SerializeField] ToggleGroup tg; void Xxx(){ Toggle tgl = tg.ActiveToggles().FirstOrDefault(); if(tgl)switch(tgl.name){ ... } } |
専用のコンポーネントだけあって全体の管理は楽だけど、変更時の動作とか初期値の設定とかすると途端にごちゃつく。
値保存を楽にするために名前を使ってみたけどコレもいまいちスマートでない…。
しかし、保存・読み込みがない一時的な択一選択をさせたいならコチラのほうが断然使いやすい。
ToggleGroup……
コメントありがとうございます。
ToggleGroupの存在に気づいてませんでした。
Toggleの1つにToggleGroupコンポーネントを追加して、全部のToggleのGroup変数にアタッチすれば簡単に択一に出来たんですね。
n番目の選択肢が選ばれたことを保存するために一手間要りそうですが、これが正攻法っぽいので今後はこっちを使ってみます。