白轻易

博客园 首页 新随笔 联系 订阅 管理

看到很多人依然还是通过最原始的方法给button绑定事件并处理,这种通过Find往子集一个个的查找,获取到后再绑定事件这种操作很费事,有些人则是对查找对象写了个方法自动往子集遍历更方便获取对象,但还是要一个个绑定。所以看到这里给大家说个简单的方式,要说的这种方式其实也很简单能够看到MVC的核心思想的影子。

先来讲解下思路再看代码,这样如果思路清晰了,不看代码你也知道我想怎么做。

思路是 将在初始化时获取到所有Button然后进行统一绑定到一个处理方法,在这个方法里处理一系列的工作,根据button的Name就可知道当前被点击的是哪个button,从而进行处理。

所以在初始化的时候获取并绑定button这个工作可以写在一个基类里,这样继承后的类就只需要关注事件的处理。而绑定事件的所有Button我们都不需要一个个查找获取到后再绑定事件了。

表达能力有限,写下代码应该能了解我想说的。

1.写一个基类,用于对子集下所有Button进行绑定事件

using UnityEngine;
using UnityEngine.UI;
public class AbsButton : MonoBehaviour
{

    protected Button[] BtnArr;
    protected virtual void Awake()
    {
//获取子集下所有Button的集合
        BtnArr = transform.GetComponentsInChildren<Button>(true);

//将所有Button的点击事件绑定到HandlerNotification方法上
        for (int i = 0; i < BtnArr.Length; i++)
        {
            Transform TARGET = BtnArr[i].transform;

            BtnArr[i].onClick.AddListener(() => { HandlerNotification(TARGET); });
        }
    }

    public virtual void HandlerNotification(Transform target)
    {

    }

}

至此已经可以看到这个对象下子集中的所有button我们都不用一个个查找了,而且也都绑定了点击事件。下一步我们就只需要写一个类继承他,然后再其中专注于事件的处理。且Button只负责发送自身Tranform并不需要知道其他的。

2.写一个处理类,并继承AbsButton 通过HandlerNotification处理Butoon事件

public class PageHandler : AbsButton
{
  public override void HandlerNotification(Transform target)
    {
        switch (target.name)
        {
            //通过不同的名称可以知道当前点击了哪个button然后就可以对其进行处理.

            case "Btn_NextModel":
                print("Test");
                target.gameObject.SetActive(false);
                break;
            case "Btn_SayHello":
                print("Hello"+target);
                break;
        }
        //(别忘了父级里还有个Button集合,这个运用起来还是很方便的,比如我对一个button点击后会显示当前选择标记,其他的button就需要隐藏当前选择标记)
    }

}    

这样处理起来是不是简单又简洁。比如有一个父级下有很多button要处理,我们只需写一个处理类脚本挂在父级上就可以处理所有事件了。

即使要处理的Button很多这个处理类要写的内容很多,但是这种逻辑条理清晰的处理方式依然是好的方式。

好的,希望都能跳过繁琐的原始方式,让自己更轻松些。

再提一个,HandlerNotification这个方法要灵活使用,比如添加一个过滤条件使符合过滤条件的button都被过滤掉不处理。

posted on 2019-02-02 11:08  whiteeasy  阅读(3006)  评论(0编辑  收藏  举报