使用lua作为游戏热更新方案时 编译tolua就变得尤为重要 如果自己想要写一些c接口也可以编译到tolua.dll中 lua中直接调用
编译tolua_runtime 有好多大佬都写了很详细的文章 这边直接引用
这是我新增加cpp代码
代码实现了一个简单的读取文件内容
LGlobal.h
#define FRAME_API extern "C" __declspec(dllexport)
#define EXTERN_API extern "C"
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include "luaconf.h"
}
```cpp
LReadFile.h
#include "LGlobal.h"
FRAME_API void InitFrame(lua_State* L);
LReadFile.cpp
#include "LGlobal.h"
#include <stdio.h>
#include <stdlib.h>
#include <vector>
static int lhh_readfile(lua_State* L)
{
const char* path = lua_tostring(L, 1);
FILE* file = fopen(path, "rb");
if (file != NULL)
{
fseek(file, 0, SEEK_END);
int fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
int bufferSize = fileSize + 1;
char* buffer = (char*)malloc(bufferSize);
if (buffer != NULL)
{
buffer[fileSize] = '\0';
if (buffer != NULL)
{
int result = fread(buffer, 1, fileSize, file);
lua_pushstring(L, (const char*)buffer);
free(buffer);
}
}
fclose(file);
}
return 1;
}
static const struct luaL_Reg l_tolua_funcs[] =
{
{ "Get", lhh_readfile},
{ NULL, NULL }
};
EXTERN_API void InitFrame(lua_State* L)
{
luaL_register(L, "lhh", l_tolua_funcs);
}
C#端调用自己逻辑的初始化接口 比如
游戏tolua使用的c语言编写 我写的例子是c++语言实现 因为是接口 肯定会用到很多c++的特性 写起来会舒服很多
游戏tolua是c语言实现 编译用的是gcc 如果用来编译c++代码 会报错 有些特性找不到 所以这块就牵扯到了c/c++混合编译
那就先将c++代码编译为.o文件 然后编译tolua的时候链接进去就可以了
这段是编译自己写的c++方法
g++ -m64 -O2 -std=c++11 -c \
L/LReadFile.cpp \
-o L/LReadFile.o \
-I./ \
-Iluajit-2.1/src \
-Iluasocket
修改后的build_win64.sh 直接编译即可
#!/bin/bash
# 64 Bit Version
mkdir -p window/x86_64
cd luajit-2.1
mingw32-make clean
mingw32-make BUILDMODE=static CC="gcc -m64 -O2" XCFLAGS=-DLUAJIT_ENABLE_GC64
cp src/libluajit.a ../window/x86_64/libluajit.a
mingw32-make clean
cd ..
g++ -m64 -O2 -std=c++11 -c \
L/LReadFile.cpp \
-o L/LReadFile.o \
-I./ \
-Iluajit-2.1/src \
-Iluasocket
gcc -m64 -O2 -std=gnu99 -shared \
L/LReadFile.o \
tolua.c \
int64.c \
uint64.c \
pb.c \
lpeg.c \
struct.c \
cjson/strbuf.c \
cjson/lua_cjson.c \
cjson/fpconv.c \
luasocket/auxiliar.c \
luasocket/buffer.c \
luasocket/except.c \
luasocket/inet.c \
luasocket/io.c \
luasocket/luasocket.c \
luasocket/mime.c \
luasocket/options.c \
luasocket/select.c \
luasocket/tcp.c \
luasocket/timeout.c \
luasocket/udp.c \
luasocket/wsocket.c \
-o Plugins/x86_64/tolua.dll \
-I./ \
-Iluajit-2.1/src \
-Iluasocket \
-lws2_32 \
-Wl,--whole-archive window/x86_64/libluajit.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++
编译完之后 tolua.dll替换掉LuaFramework里面的dll即可
写个测试脚本调用我们的Main.lua Main.cs脚本挂载到场景中 运行即可
using UnityEngine;
using System.Collections;
/// <summary>
/// </summary>
public class Main : MonoBehaviour
{
void Start()
{
LuaInterface.LuaState luaState = new LuaInterface.LuaState();
luaState.Start();
luaState.DoFile("Main.lua");
luaState.Call("Main", true);
}
}
lua中写一个方法调用上面写的c++代码
function Main()
local sStr = lhh.Get("D:\\UnityProject\\LuaFramework\\Temp.txt")
print("info: "..sStr)
end
temp文本内容
运行结果
打完收工
如果想实现一些底层库 都可以这样实现 然后注册到lua虚拟机中 代码里直接调用即可 高性能低成本
该测试项目上传到 github了 仅供参考
地址