NGUI学习笔记 - 通过UIEventlistener和UIbutton来学习NGUI的消息机制

先来看UIEventlistener脚本,以鼠标点击消息为例;

首先定义一个委托类型,

    public delegate void VoidDelegate (GameObject go);

接着定义这个委托类型的变量onClick,用于存储响应点击事件的方法

    public VoidDelegate onClick;

定义事件响应有有函数OnClick,有消息传来时,首先判断委托是否为空,及判断是否有响应方法,如果有,就开始给委托中的方法们传参(gameobject一般都为附着的物体本身,这个应该不难理解),接着一个个地执行

    void OnClick ()                 { if (onClick != null) onClick(gameObject); }

使用时,通过Get()函数获取要监听的物体,函数会自动为其添加UIEventlistener脚本,这样该物体就能监听UIEventlistener中定义的事件了

    static public UIEventListener Get (GameObject go)
    {
        UIEventListener listener = go.GetComponent<UIEventListener>();
        if (listener == null) listener = go.AddComponent<UIEventListener>();
        return listener;
    }

eg:

    GameObject button = GameObject.Find("Button");
    UIEventListener.Get(button).onClick = ButtonClick;

    void ButtonClick(GameObject button)
    {
        Debug.Log("GameObject " + button.name);
    }

因为在UIButton中为鼠标点击响应事件添加方法的原理和在UIEventlistener中为鼠标点击事件添加响应方法的原理相同,接下来就通过UIbutton进一步说明NGUI的消息机制

1,UIbutton中定义了一个委托代理类型的列表onClick,来存储多个响应的方法,

    public List<EventDelegate> onClick = new List<EventDelegate>();

2,UIButtonEditor在unity编辑器中绘制了编辑界面供使用者添加方法,代码如下:

NGUIEditorTools.DrawEvents("On Click", button,button.onClick, false);

编辑界面如图:
编辑界面

既然委托本身就可以存储多个方法,为什么还要将每个方法放入不同的委托,再将委托放入列表?笔者认为这和在编辑器中的绘制有关,编辑器中每添加一个方法,列表的长度就加一

3,鼠标点击时,UICamera发出OnClick消息,UIbutton中的OnClick函数默认调用委托onClick中的方法

    public virtual void OnClick ()
    {
        if (current == null && isEnabled)
        {
            current = this;
            EventDelegate.Execute(onClick);
            current = null;
        }
    }

EventDelegate中的Execute函数执行onClick中的方法

    static public void Execute (List<EventDelegate> list)
    {
        if (list != null)
        {
            for (int i = 0; i < list.Count; )
            {
                EventDelegate del = list[i];

                if (del != null)
                {
                    del.Execute();

                    if (i >= list.Count) break;
                    if (list[i] != del) continue;

                    if (del.oneShot)
                    {
                        list.RemoveAt(i);
                        continue;
                    }
                }
                ++i;
            }
        }

当然,也可以直接在OnClick()中添加响应方法,这里就不详细说了哈,有兴趣的可以去试试~~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值