如何将对象从 c# 传递到 lua 的函数

本文关键字:lua 函数 对象 | 更新日期: 2024-11-05 08:17:12

我在c#上使用Lua接口将我创建的对象传递给lua的函数。它成功调用了函数,但 lua 不断抛出错误:

LuaInterface.LuaException:/hook.lua:32: 尝试索引本地 'objj' (一个 nil 值)

这是 c# 代码:

public class PerObj
{
    public string name;
    public PerObj() 
    {
    }
}
PerObj obj = new PerObj();
LuaFunction lf = lua.GetFunction ("item.HookMe");
lf.Call(obj);

这是lua代码:

function item:HookMe(objj)
    objj.name= "lalala"
end

该函数实际上正在被调用,但我不确定它是否不起作用......

如何将对象从 c# 传递到 lua 的函数

将函数定义更改为:

function item.HookMe(objj)
    objj.name= "lalala"
end

原始定义中的冒号表示该函数还具有 self 参数。这些函数的调用方式如下:object:HookMe() 。但是你想直接调用它,所以冒号不适用。

编辑:
如果要保留函数定义并保留self,请像这样调用它:

lf.Call(null, obj);

要调用它传递self对象:

lf.Call(lua["item"], obj);

似乎问题出在Lua方法的设计上(但这实际上取决于意图):

而不是

function item:HookMe(objj)
    -- self not used
    objj.name= "lalala"
end

这在给定的示例中效果更好:

function item:HookMe()
    self.name= "lalala"
end

原因(以及其他答案中也讨论过)是用方法语法(:)声明一个函数会添加一个隐含的第一个形式参数self。调用方可以将任何内容作为第一个实际参数传递,但协定通常是传递函数的父表,以便它可以访问其同级字段。

在这种情况下,name似乎是HookMe的同级,因此该方法不应在作为objj传递的任意表上运行,而应在self上运行。