盛夏的果实 发表于 2021-7-17 21:49:52

Lua脚本怎么样调用外部脚本?

在游戏脚本开发中,我们往往会发现脚本量非常大,而且我们经常会在一些核心脚本文件中定义常用的功能函数,但是Lua脚本没有提供include关键词,那又是怎样调用外部函数的呢?如何实现脚本的Include功能?
test.lua脚本定义main函数如下:
function main(szName, num1, num2)
    print("main()", szName, num1, num2);
    local nRandMax = 10000;
    local nRand = math.random(nRandMax);
    print("nRand =", nRand)
    return 1;
end现在我想在test.lua脚本中调用另外一个test1.lua脚本文件中的GetRandMax(),通常的做法是这样的:
function main(szName, num1, num2)
    print("main()", szName, num1, num2);
    dofile("test1.lua")   --加载并编译运行脚本
    local nRandMax = GetRandMax();
    local nRand = math.random(nRandMax);
    print("nRand =", nRand)
    return 1;
end看上去是这样的,非常简单,通过dofile对test1.lua文件进行加载并编译运行,这部操作会将test1.lua文件中的函数和变量压入全局的虚拟栈中,这样就可以实现对GetRandMax()调用。但是这里有个问题:dofile函数接受的是需要引用的外部脚本的路径,如果多次调用会不胜其烦,而且效率不高。可能有人谁说,那我们直接把dofile作为全局函数执行,就像这样:
dofile("test1.lua")
dofile("test2.lua")
dofile("test3.lua")

function main(szName, num1, num2)
    print("main()", szName, num1, num2);
    local nRandMax = GetRandMax();--调用test1.lua中的函数
    local nRand = math.random(nRandMax);
    print("nRand =", nRand)
    return 1;
end这样做是可以的,但是仍然有些问题:
1,如果test.lua文件dofile(test1.lua),而test1.lua文件dofile(test.lua),怎么办!出现循环应用,执行后堆栈溢出;

test.lua:5: too many C levels (limit is 200) in function at line 5 near '"main()"'2,dofile的路径问题,每次都要传入文件的绝对路径,如果路径不正确,无法正常执行,这也是个很烦的事。

cannot open \script\test.lua: No such file or directory那怎样做才更好呢?既然dofile有这些的问题,我们就把这些问题解决。在C/C++中实现Include脚本接口函数,在脚本中作为全局函数调用,实现外部脚本文件包含功能。
//脚本接口
TLua_Funcs g_GameFunc[] = {
{ "Include",LuaInclude },
{ "ReloadAllScript",LuaReloadAllScript},
{ "SayHello",LuaSayHello },
{ "StopGame",LuaStopGame },
};在Include函数中使用set集合避免重复包含的问题,获取当前的执行路径拼接成绝对路径,这样就省了不少事;)
Include("\\script\\test1.lua") --Include脚本接口

function main(szName, num1, num2)
    print("main()", szName, num1, num2);
    local nRandMax = GetRandMax();--调用test1.lua中的函数
    local nRand = math.random(nRandMax);
    print("nRand =", nRand)
    return 1;
end由于代码数量太多不便贴出,如有兴趣,请直接在Git@OSC上获得Lua2Game (VS2013工程)的完整版本!
如有问题,欢迎指出讨论,谢谢~~

文档来源:开源中国社区https://my.oschina.net/xlplbo/blog/316455
页: [1]
查看完整版本: Lua脚本怎么样调用外部脚本?