方便我们在项目中使用lua解析方法,我们封装管理一个lua解析器,管理luastate的方法执行。
解析器脚本:
using luainterface;
namespace baseframework
{
///
/// 自定义的tolua解析器
///
public class callluamanager:singletonautomono
{
private luastate _luastate;
///
/// 供外部获取使用的属性
///
public luastate luastate
{
get
{
return _luastate;
}
}
public void init()
{
_luastate = new luastate();
_luastate.start();
//初始化委托工厂
delegatefactory.init();
}
public void require(string filename)
{
_luastate.require(filename);
}
public void dispose()
{
if(_luastate==null)
return;
_luastate.checktop();
_luastate.dispose();
_luastate = null;
}
}
}
我们开始测试使用,其主要完成对lua脚本中的全局变量的获取并赋值,lua脚本中的无参无返回值函数调用、有参有返回值函数的四种方式调用,熟悉相关的api ,可以自行运行学习
using system;
using baseframework;
using luainterface;
using unityengine;
using unityengine.events;
namespace calllua
{
public class callluaentrance:monobehaviour
{
private void start()
{
callluamanager.instance().init();
callluamanager.instance().require("main");
//获取全局变量
debug.log(callluamanager.instance().luastate["string1"]);
//无法获取lua脚本中的局部变量
callluamanager.instance().luastate["string1"] = "我被修改了!";
debug.log(callluamanager.instance().luastate["string1"]);
//可以理解luastate中存储的所有全局变量列表
//如果有则可以查看并修改
//如果没有则新建
callluamanager.instance().luastate["newglostring"] = "我是新来的,是lua全局变量";
//获取执行无参无返回值的lua函数
luafunction luafunction = callluamanager.instance().luastate.getfunction("testfunc");
luafunction.call();
luafunction.dispose();
//直接获取
luafunction = callluamanager.instance().luastate["testfunc"] as luafunction;
luafunction.call();
luafunction.dispose();
//存入委托中再使用
luafunction = callluamanager.instance().luastate.getfunction("testfunc");
unityaction action = luafunction.todelegate();
action();
//-------------------------------------------------------------------------------------------------
//有参有返回值函数获取调用 方式1
luafunction = callluamanager.instance().luastate.getfunction("testfunc1");
luafunction.beginpcall();
luafunction.push(66);
luafunction.pcall();
int res = (int)luafunction.checknumber();
debug.log("参数为" 66 " ,返回值为" res);
luafunction.endpcall();
//通过函数的invoke方法来调用 方式2
//<参数类型,返回值类型>
res = luafunction.invoke(88);
debug.log("参数为" 88 " ,返回值为" res);
//通过委托调用 方式3
func func = luafunction.todelegate>();
res = func(99);
debug.log("参数为" 99 " ,返回值为" res);
//通过解析器直接调用 方式4 和2本质上是一样的掉用方式
res = callluamanager.instance().luastate.invoke("testfunc1", 166, true);
debug.log("参数为" 166 " ,返回值为" res);
callluamanager.instance().dispose();
}
}
}
其调用的lua测试脚本------main.lua 放置在lua文件夹下
--主入口函数。从这里开始lua逻辑
function main()
print("logic start")
end
main()
--场景切换通知
function onlevelwasloaded(level)
collectgarbage("collect")
time.timesincelevelload = 0
end
--全局变量
string1 = "我是全局变量"
function testfunc()
print("无参无返回值函数调用成功!")
end
--有参数有返回值的函数
function testfunc1(a)
return a 100
end
function onapplicationquit()
end