使用自定义委托来调用lua脚本中的多返回值函数和长参数类型的函数。
先看代码,依旧是上篇文章中所贴的脚本。新增调用两个函数testfunc
using system;
using baseframework;
using luainterface;
using unityengine;
using unityengine.events;
using object = system.object;
namespace calllua
{
public class callluaentrance:monobehaviour
{
// 委托
public delegate int customcallfunc(int a, out int b, out int c, out string d, out bool e);
public delegate void customcallparams(int a, params object[] objects);
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);
// 新增内容
//----------------------------多返回值函数----------------------------------------------------
//001直接获取 执行结果 传统方式
luafunction = callluamanager.instance().luastate.getfunction("testfunc2");
luafunction.beginpcall();
luafunction.push(566);
luafunction.pcall();
int res1 = (int)luafunction.checknumber();
int res2 = (int)luafunction.checknumber();
int res3 = (int)luafunction.checknumber();
string res4 = luafunction.checkstring();
bool res5 = luafunction.checkboolean();
debug.log("多返回值函数数值结果--->" res1 "," res2 "," res3 "," res4 "," res5);
//002使用委托方式调用函数
customcallfunc customcallfunc = luafunction.todelegate();
int b2, b3;
string s2;
bool bl;
//注意 res接收第一个返回值 其它都按照out 变量赋值出
int res0 = customcallfunc(788, out b2, out b3, out s2, out bl);
debug.log("多返回值函数数值结果--->" res0 "," b2 "," b3 "," "," s2 "," bl);
//--------------------------------------------长参数函数调用--------------------------------
luafunction = callluamanager.instance().luastate.getfunction("testfunc3");
customcallparams customcallparams = luafunction.todelegate();
customcallparams(1, 2, "tony", true, 666.66);
//也可以直接调用 call用来调用void 类型函数
luafunction.call(56,false,88.88f,"chang");
luafunction.call(98,365,false,88.88f,"chang");//不给泛型也可以!
callluamanager.instance().dispose();
}
}
}
注意!在tolua中使用自定义委托时候,需要在seting脚本中添加自定义委托,之后再重新generate一下。
要调用的main.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 testfunc2(e)
print("多返回值函数执行")
return e,e 100,e 200,"yes!",true
end
--变长参数函数
function testfunc3(a,...)
print("变长参数函数---")
print(a)
args = {...}
for k,v in pairs(args) do
print(k,v)
end
end
function onapplicationquit()
end
好了,现在自定义的lua解析管理器已经完善对lua中全局变量的访问修改和添加、以及多种函数类型的调用。
先到这里了,接下来要接着完善管理器的功能,敬请期待!