您的位置:首页 > 编程语言 > Lua

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

2017-03-30 20:31 603 查看
按钮事件监听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<LuaFunction>> luaEventTable = new Dictionary<int, List<LuaFunction>>();


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

static public void LuaAddListener(int eventType, LuaFunction lf)
{
if (luaEventTable.ContainsKey(eventType))
{
luaEventTable[eventType].Add(lf);
}
else
{
List<LuaFunction> list = new List<LuaFunction>();
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<LuaFunction > 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 项目 后期 接入 unity