XLua框架搭建——lua 消息分发

消息分发对于模块解耦是一个很好的方案,前面的博客中介绍过如何在c#中写一个消息分发,以及消息分发的原理,有需要的可以去看原来的文章游戏脚本事件分发,同时在前面的lua后期接入笔记里也说过利用c#的消息分发来实现lua端的消息分发,见文章项目后期Lua接入笔记06–按钮事件监听及消息分发,但这是后期的时候,lua的使用不多,性能上的考虑也比较少,问题不是很大,现在搭建框架,需要大量使用lua,那么lua端就需要一套自己的消息分发机制。

知道了c#的消息分发原理,我们自然可以写出lua端的消息分发,无非就是存储函数,然后调用时遍历所有函数进行调用,由于lua的特性,即函数调用时,如果需要使用实例,我们需要将self作为函数的第一个参数传递过去,就是我们常见的语法糖a.method(self) == a:method(),所以我们在注册消息时需要将实例存储下来

function Event:AddEventListener(eventType,ins,listenerFun)
 table.insert(tmp,ins);

第一个参数作为事件类型,为了能更好的与c#端交互,一般使用字符串,第二个是实例,第三个是对应的函数,然后构建一个table,将这些数据插入到table中,这里要注意的是如果项目中会用到多线程,这里一定要考虑到线程安全机制,构建临时table来进行存储
对应的我们还有移除函数

function Event:RemoveEventListener(eventType,ins,listenerFun)
table.removeItem(list,ins);

然后是消息分发

function Event:DispatchEvent(eventType,...)

第一个是事件类型,第二个是参数,由于lua不支持函数的重载,当然自己也可以实现相关的重载机制,这里不讨论。
在进行调用时检测ins实例是否为空,如果不为空,那么久作为第一个参数进行传递,如果为空,就直接调用函数即可。

一般来说lua的消息使用lua端的消息分发,c#的使用c#端的消息分发,有时候也会涉及到lua的消息要发到c#端,以及c#端的消息发到lua端。
对于lua端发到c#端
我们将c#对应的类添加到导出列表里进行导出,然后直接调用对应的c#函数即可。
对于c#发到lua端
我们通过luaenv的api获取到luafunction,

LuaEnv.Global.GetInPath("Event.Dispatch");

然后将参赛填入调用即可,这里可能会有一个问题,c#端的函数可能是这样的

public static void Dispatch2Lua(string eventName, params object[] e)

如果我们这样调用的话

luafunc.Call(eventName,e);

在lua端可能会出现参数只有两个的情况,我们需要自己组合一个数组来进行传递

             object[] objs = new object[e.Length + 1];
                objs[0] = eventName;
                Array.Copy(e, 0, objs, 1, e.Length);
                luafunc.Call(objs);

通过这样的操作就可以实现参数列表的形式,便于代码的编写。

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