へっぽこ日記

Unity関係のつぶやきまとめ。マイコンとかもいじります。

Unityのボタンの機能をUniRxで拡張してみる

はじめに

今回はUnityのボタンの機能をUniRxで拡張してみる記事です。

前回の記事に引き続き、ボタンの機能を拡張していきますが、UniRxDotweenを使うので、事前にImportしておくことをお勧めします。

 

サンプルプロジェクト

github.com

 

 

前回のコードをUniRx方式に変換する

前回の物をUniRxを使ってリアクティブ方式にしてみます。理由としては、色々あるのですが、ひとつは処理負荷がUniRxを使った方式の方がすくないことです。また、MVRPパターンにも応用でき、拡張性にも優れています。

変化はそこまで感じられませんがInterfaceを実装するのではなく、Start関数で一度だけ呼ぶリアクティブ方式になりました。

 

Selectableでキー移動に対応する

標準としてあるSelectableコンポーネントを併用して、機能を拡張してみます(ナビゲーション機能の実装が面倒くさいので...)。

  

 

これでUIをパッドやキー、マウスカーソルの対応と、アニメーションをつけたのでフィートバックを得ることが出来ました。
 

長押し判定と連打防止機能を追加してみる

メインのお話です。UniRxで長押し判定などの機能を実装してみます。UniRxには様々なオペレータ(LINQでのWhereとかSelectとか)があるため、イベント処理を簡潔に書けることが多いです。

 

長押し判定

キーは、「SelectMany」と「TakeUntil」です。「SelectMany」で指定した時間後にメッセージを流して、「TakeUntil」でボタンを離すまでメッセージを流します(指定したIObservableがメッセージを流すとキャンセル処理される)。

  

 

連打防止

ここでのポイントは「ThrottleFirst」というオペレータです。このオペレータはメッセージが来てから、指定した時間経つまでメッセージを通さない機能があります。この機能でボタンが押されても一定時間なにも起きないようにしています。

  

 

たった数行で実装できてしまいました。UniRxは非常に強力ですね。

おわりに

ボタンはシーン遷移などで使われることが多いですが、シーン自体が重いと瞬時に読み込めず、ボタン連打で処理落ちということもあり得るので、とても重要です。また、UniRxはイベント周りでかなり便利なので、使っていることをお勧めします。

 

是非、読者登録をしていただくと助かります!