Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8899

【Unity(C#)】UniRxを使ったラジオボタンの実装方法

$
0
0

ラジオボタンとは

ラジオボタンとは、項目の選択に用いられる部品のひとつで、
複数項目から1つだけ取捨選択させる部品のことである。

ラジオボタンは中が空白になった小さな円形をしており、
チェックを入れると円形の中が黒い丸で埋まる。選択肢のうちの他のラジオボタンを選択すると、
先にチェックしたラジオボタンのチェックは外れる。

引用元:ラジオボタンとは何? Weblio辞書

こんな感じのボタンです。

ToggleUp.gif

On Value Changedに登録した処理が重複してしまう

全てのToggleのOn Value Changedに対してチェックマークが付いた時 (isOn)を想定した処理を登録すると、
参考記事のように処理が重複してしまいます。

なぜこのような現象が起きるかというと、下記参考リンク内にもありますが、
On Value Changedはトグルの状態が変わった時のコールバックだからです。
つまり、チェックマークが外れた時 (isOn)にもコールバックされてしまいます。

【参考リンク】:Unity uGUIのToggle “On Value Cahnged (Boolean)” で切り替え時の処理が重複する

今回はUniRxを使って別のトグルを選択した際に、必ず1フレームのみ実行される実装を行います。
下記Gif画像のような状態です。

Toggle.gif

コード

usingSystem.Linq;usingUnityEngine;usingUnityEngine.UI;usingUniRx;/// <summary>/// 選択中のトグルを取得/// </summary>publicclassRadioButtonObserver:MonoBehaviour{publicToggleGrouptoggleGroup;publicstaticReadOnlyReactiveProperty<string>selectedToggleName{get;privateset;}voidStart(){selectedToggleName=toggleGroup.ObserveEveryValueChanged(selectToggle=>toggleGroup.ActiveToggles().FirstOrDefault()).Select(tgl=>tgl.GetComponent<Toggle>().name).ToReadOnlyReactiveProperty();//selectedLabelが変化した瞬間を検知するselectedToggleName.Subscribe(x=>Debug.Log("Changed:"+x));}}

ObserveEveryValueChanged

下記参考リンクにもあるように、
指定したインスタンスオブジェクトが前フレームと現在のフレームで変化したかどうかを検知できるようです。

【参考リンク】:【UniRx】ObserveEveryValueChangedでフレーム間での値の変動を監視する

デモ

選択したトグルに応じてアニメーションが遷移します。
ToggleDemo.gif

参考にさせて頂いたリンク

UniRxのシンプルなサンプル その2(WhereとSelect)
UnityのuGUIでラジオボタンを実装、選ばれたLabelを取得


Viewing all articles
Browse latest Browse all 8899

Trending Articles