cefsharp点击事件select_UniRx 精讲 2019:12.实现“点击按钮之后,锁住其他按钮”功能...

4aec22ced1bf8d01686f8aff266833d4.png

标题有一点啰嗦,但是这个需求我们经常会遇到。

我们一般的实现是加上一个事件的遮罩层,或者创建一个 bool 变量来进行标记。

而使用 UniRx 则会简单得多。

代码如下:

public class TestPanel : XXXPanel
{
    [SerializeField] Button mButtonA;
    [SerializeField] Button mButtonB;
    [SerializeField] Button mButtonC;

    void Start()
    {
        var buttonAStream = mButtonA.OnClickAsObservable();
        var buttonBStream = mButtonB.OnClickAsObservable();
        var buttonCStream = mButtonC.OnClickAsObservable();

        Observable.Merge(
                    buttonAStream,
                    buttonBStream,
                    buttonCStream)
                .First()
                .Subscribe(_ => 
                {
                    // any button clicked
                });
    }
}

使用 Merge 将三个按钮的事件流合并,并通过 First 只处理第一次点击事件。

这样标题所说的功能就完成了。

但是还有一点问题,就是当处理按钮事件的时候要知道是哪个按钮被点击了。
很简单,使用 Select 操作符就好了。

Select 是什么意思呢?

就是选择。

Select 本身是 Linq 的操作符。
一般是传入一个索引 i/index 然后根据索引返回具体的值。
对于一个 List,什么叫做 Select 呢?

看代码就懂了,如下:

var testNumbers = new List<int>(){ 1,2,3}
var selectedValue = testNumbers[2];

其中 testNumbers[2] 就是一个选择操作。

Select 的操作符会在第二章进行详细解释。
先用下边的图,试着理解一下就好。

ed70633d9660e6a4ece1be6bc0e9dba0.png

这里我们只要了解,使用 Select 操作符后,它返回的是一个值就好了,值的类型根据它返回的值的类型决定,也就是说是一个泛型的。

使用 Select 之后的代码如下:

public class TestPanel : XXXPanel
{
    [SerializeField] Button mButtonA;
    [SerializeField] Button mButtonB;
    [SerializeField] Button mButtonC;

    void Start()
    {
        var buttonAStream = mButtonA.OnClickAsObservable().Select(_=>"A");
        var buttonBStream = mButtonB.OnClickAsObservable().Select(_=>"B");
        var buttonCStream = mButtonC.OnClickAsObservable().Select(_=>"C";

        Observable.Merge(
                    buttonAStream,
                    buttonBStream,
                    buttonCStream)
                .First()
                .Subscribe(buttonId => 
                {
                    if (buttonId == "A")
                    {   
                        // Button A Clicked
                    }
                    else if (buttonId == "B")
                    {
                        // Button B Clicked
                    }
                    else if (buttonId == "C")
                    {
                        // Button C Clicked
                    }
                });
    }
}

这样,标题所说的功能,完美实现了。

第一章的内容就结束了。
Merge 属于处理多个流的操作符,除此之外还有更多的类似的,比如 Zip 等等。学习完它们之后可以实现非常复杂的逻辑,比如 Coroutine 的支持,可以实现按顺序执行多个 Coroutine ,也支持等待所有 Coroutine 执行完成这种复杂的操作。

这些内容我们在第二章中进行学习。

知识地图

acd645ab4147a4bcce0dd0d547b2bd53.png

更多内容
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
QQ 交流群:623597263
付费版专栏地址(需注册): http://master.liangxiegame.com/zhuanlan
订阅付费版本专栏将获得如下权益

  • 更好的阅读体验
  • 阅读进度
  • 目录、大纲
  • 无广告
  • 移动端适配
  • 在评论区可以与作者和其
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值