游戏开发中,客户端、服务端之间的交互是很频繁的,尤其是逻辑玩法的实现,需要大量的交互。
如果所有的交互都按功能构建出不同的协议,这样即繁琐又不方便修改。
通过Lua,使用远程调用可以极大的方便客户端、服务器的通信。
在Lua中,通过C++告诉对方,我要调用哪个函数、传递哪些参数,来执行相关的功能。
这样就不用定义一大串协议,而只需定义一种:远程调用协议。
如果要对方执行相应的函数,需要传递以下信息:
- 函数名
- 参数
当C++获得函数名、参数后,就可以构建RPC数据包,实现远程调用了。
本文讲述如何在C++中获得Lua远程调用的函数名、参数。
例如,我想实现:
客户端登录的功能,我就可以在客户端调用位于服务端的loginreq函数。
具体的形式有如下两种:
第一种,是直接导出一个全局函数rpc,并将函数名作为第一个参数传递过去。
第二种,是导出一个全局table,以函数名作为key。
第一种实现比较简单:
直接导出全局函数,依次获取栈的值:函数名、参数列表。
第二种相对复杂一些:
导出全局table,设置metatable.__index处理table访问,Lua会将key作为第二个参数,传给__index(__index(table, key)),由此可以获得函数名。
将函数名存储到处理函数的upvalue中,以便后续使用。
完整代码如下:
test.cpp
test.lua
执行输出: