FC2ブログ
    02 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 04

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】UniRxでボタンの押下処理をやってみよう。結構簡単にかけていいですね! 

    こんにちは。
    坂内っす。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    UniRxを使ってボタンを押したときの処理を簡単に紹介。

    ButtonとImageをCanvasに配置して、ボタンを押すとImageのカラーをランダムに切り替えるような処理を書いてみた。
    まずは今までの書き方。


    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20240311 : MonoBehaviour
    {
    [SerializeField] Button btnProc;
    [SerializeField] Image imgItem;

    private void Start() {
    // ボタンが押された時の処理
    btnProc.onClick.AddListener(ChangeImageColor);
    }

    void ChangeImageColor() {
    imgItem.color = Random.ColorHSV();
    }
    }



    UniRxを使わない時は、こんな感じに書いていたと思う。
    onClickのAddListenerでやってました。


    これをUniRxで書くとこんな感じに


    using UniRx;
    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20240311 : MonoBehaviour
    {
    [SerializeField] Button btnProc;
    [SerializeField] Image imgItem;

    private void Start() {
    btnProc.OnClickAsObservable().Subscribe(_ => {
    // ボタンが押された時の処理
    ChangeImageColor();
    });
    }

    void ChangeImageColor() {
    imgItem.color = Random.ColorHSV();
    }
    }



    なんぞ文字列としては、UniRxのほうが文字数多いけど・・・・
    UniRxの利点はなんだろうか?
    色々なことができるらしい。

    とりあえず連打制御を追加してみましょう。


    using System;
    using UniRx;
    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20240311 : MonoBehaviour
    {
    [SerializeField] Button btnProc;
    [SerializeField] Image imgItem;

    private void Start() {
    btnProc.OnClickAsObservable()
    .ThrottleFirst(TimeSpan.FromMilliseconds(1000))
    .TakeUntilDestroy(this)
    .Subscribe(_ => {
    // ボタンが押された時の処理
    ChangeImageColor();
    });
    }

    void ChangeImageColor() {
    imgItem.color = UnityEngine.Random.ColorHSV();
    }
    }




    ThrottleFirstというのを追加しました。
    引数の秒以下は再押下を受け付けないという感じです。

    .ThrottleFirst(TimeSpan.FromMilliseconds(1000))
    なので、「1秒以下の連打は受け付けない」といった感じでしょうか。

    それと、「.TakeUntilDestroy(this)」もつけておきましょう。

    ボタンがDestroyされた後も購読処理が残ってしまうので、メモリリークの対応として書いておいたほうがいいらしいです。

    こんな感じでUniRxでも簡単にボタンの押下処理を書くことができます。

    カンタンな紹介でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0