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

原创 2018年04月17日 20:45:11

消息分发对于模块解耦是一个很好的方案,前面的博客中介绍过如何在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<LuaFunction>("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);

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

版权声明:本文为博主原创文章,欢迎转载,但请注明原作者,谢谢。 https://blog.csdn.net/suifcd/article/details/79980526

XLua框架搭建——编辑器选择

xlua开源代码地址:https://github.com/Tencent/xLua 新项目准备使用xlua来进行游戏开发,我进行这方面的技术研究及框架搭建。项目选择这套主要是因为对c#的热修复功能...
  • suifcd
  • suifcd
  • 2018-03-29 19:28:11
  • 43

[Unity XLua]热更新XLua入门(二)-俄罗斯方块实例篇

前言在xLua没出来之前,开源的lua框架基本都是以界面用Lua开发为主,核心战斗用C#开发,但xLua出来之后主推C#开发,Lua用作HotFix,这里我展示的第一个例子就是基于界面的经典2D小游戏...
  • s10141303
  • s10141303
  • 2017-01-22 01:23:04
  • 11896

xLua增加第三方lua库lpack

因为网络通讯使用自定义协议,需要用到luasocket和lpack库,但xLua默认只集成了luasocket库,所以需要自己增加lpack库下载xLua C源码:https://github.com...
  • mirahs
  • mirahs
  • 2017-07-29 18:39:19
  • 1259

腾讯开源手游热更新方案Xlua尝鲜(四)——Lua调用C#

new C#对象 你在C#这样new一个对象: var newGameObj = new UnityEngine.GameObject(); 对应到Lua是这样: local newGameO...
  • u013824131
  • u013824131
  • 2017-01-10 20:14:31
  • 3108

腾讯开源手游热更新方案Xlua尝鲜(三)——C#访问Lua

C#访问Lua 这里指的是C#主动发起对Lua数据结构的访问。 一、获取一个全局基本数据类型 访问LuaEnv.Global就可以了,上面有个模版Get方法,可指定返回的类型。 luaenv....
  • u013824131
  • u013824131
  • 2017-01-10 20:11:39
  • 2456

Xlua入门案例一

安装 1、在https://github.com/Tencent/xLua下载zip 2、复制asset目录到工程目录下 如何调用lua语言 新建虚拟机,然后调用DoString即可。 XL...
  • u011480667
  • u011480667
  • 2017-11-12 08:43:44
  • 633

xLua学习(一)

xLua作为企鹅这个大厂开源出来的unity热更新技术,从面世就受到了广泛的关注,他的“开发使用C#,运行使用C#,有bug了下发Lua补丁替代”让我很感兴趣。非常适合比如已经开发大半使用C#开发的项...
  • qq_36386954
  • qq_36386954
  • 2017-03-21 17:19:54
  • 973

腾讯开源手游热更新方案Xlua尝鲜(二)——执行Lua字符串和Lua文件加载

Lua文件加载 一、执行字符串 最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法 比如: using UnityEngine; using XLua; pu...
  • u013824131
  • u013824131
  • 2017-01-09 10:07:53
  • 3328

[Unity XLua]热更新XLua入门(一)-基础篇

Aladdin_XLua前言前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议,也受到广大开发者的热捧,然后我当然也抱着好奇的心去学习学习。后面也会将扩展之后的工程放在git上...
  • s10141303
  • s10141303
  • 2017-01-14 12:26:03
  • 37237

xLua - 第三方扩展的添加和编译

说明: 添加第三方扩展,就是在xLua原有的c源码库中添加新的静态库供lua环境使用,所以,请确保你已有Unity和xLua基础。 在xLua的官方文档上有rapidjson的添加流程,这里只是把个人...
  • xmousez
  • xmousez
  • 2017-03-30 17:50:00
  • 3512
收藏助手
不良信息举报
您举报文章:XLua框架搭建——lua 消息分发
举报原因:
原因补充:

(最多只允许输入30个字)