项目后期Lua接入笔记06--按钮事件监听及消息分发

按钮事件监听NGUI一般常用的是UIEvenetListener,使用方法一般如下

UIEventListener.Get(gameObject).onClick = BtnClick;

在Lua代码中使用方式也差不多

UIEventListener.Get(gameObject).onClick = this.BtnClick;

对于消息分发,Lua里面有一个Event实现了类似的功能,但是我们的需求不只是lua内部分发,还涉及到其他未改成lua的脚本,所以我们使用自己游戏框架内的消息机制, 基础原理可以参看以前的文章
那么在Lua中使用,该怎么使用,这里需要进行一些修改。
定义一个字典,存储当前的lua回调

static public Dictionary<int, List> luaEventTable = new Dictionary<int, List>();

然后再写一份对于lua调用的消息机制

static public void LuaAddListener(int eventType, LuaFunction lf)
    {
        if (luaEventTable.ContainsKey(eventType))
        {
            luaEventTable[eventType].Add(lf);
        }
        else
        {
            List list = new List();
            list.Add(LuaFunction);
            luaEventTable.Add(eventType, list);
        }
    }

    static public void LuaRemoveListener(int eventType, LuaFunction lf)
    {
         if (luaEventTable.ContainsKey(eventType))
         {
             if (luaEventTable[eventType].Contains(lf))
             {
                 luaEventTable[eventType].Remove(lf);
              }
          }
    }


    static public void LuaBroadcast(int eventType, params object[] obj)
    {
        Broadcast2Lua(eventType, obj);

        Delegate d;
        if (eventTable.TryGetValue(eventType, out d))
        {
             d.DynamicInvoke(obj);
        }
    }

   static private void Broadcast2Lua(int eventType, params object[] obj)
    {
            List list = null;
            if (luaEventTable.TryGetValue(eventType, out list))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    list[j].Call(obj);
                }
            }
    }

这里主要的代码是lua发过来的信息,有多个参数,而c#里面的消息数据做了泛型约束,查看API代码发现了这个函数,正好满足我们的需求。

d.DynamicInvoke(obj);

写好后将此类wrap给lua使用,lua中调用代码如下

Messege.LuaAddListener(MessageID.LuaTest, this.Test);
Messege.LuaRemoveListener(MessageID.LuaTest, this.Test);
Messege.LuaBroadcast(MessageID.LuaTest, arg1,arg2,arg3);

你可能感兴趣的:(Lua学习)