LuaInterface C# Metatables



我有一些背景lua代码,我在每次启动时加载它们,它们工作正常,但是有什么方法可以将它们转换为C#吗?

这是我的元表代码:

player = {}
player.__index = player
function player:Add(name)
    return setmetatable({name = name}, player)  
end
function player:Nick()
    return self.name
end

它工作正常,这是目前我的代码的工作方式:

print(ply:Nick())

目前,我在注册lua函数代码时使用void搜索Player.cs对象,我的C#代码上没有任何特殊的void或函数,上面有Player对象,但是我想将它们全部更改为Player对象,还有没有办法使用播放器.cs void/字符串或lua中的任何内容而无需注册它们?播放器.cs对象是非静态的。

我发现 KopiLua 和 LuaInterface (最新) 有元表, 你只需要返回你的对象, 你不能返回类或将它们添加到LuaInterface,但你可以返回可以做同样事情的对象或函数。 从Lua开始,人们可以使用对象函数。具有参数(甚至为空)的函数与 : 一起使用,其他函数与点一起使用。下面是示例:

// C#:
public List<string> testing()
{
   return new List<string>()
   {
      {"Test"},
      {"Another test"}
   };
}
// Player object:
public int Health { get { return 1; } }
public int Hp() { return this.Health; }
// lua:
testing:Clear()
print(ply.Health)
print(ply:Hp())
ply.Health = 2
// You can not change a function style value like Hp(), So no way to change health this way except making a set function

我不确定你到底需要什么,但让我试试。我会为我的 LUA 类设置一个标识符(如"csid"="Player"),我可以从 C# 中检索到的"LuaTable"对象中使用它来标识要实例化的对象。然后,您可以让 C# 类有一个工厂方法,该方法采用"LuaTable"来构建实例,并在实例上有一个允许从中获取"LuaTable"的方法。或者为每个 C# 类提供一个 LUA 包装器类,其中包含"ToLUA"和"FromLUA"方法,以双向转换。

每当使用"LuaTable"调用某些 C# 代码时,您都会检查它是否具有"csid"成员,如果是,请使用 switch 语句选择您的类或使用带有检索到的名称的反射来构建您的 C# 对象。每当需要将 C# 对象传递给 LUA 时,都会以相同的方式使用相反的转换方法。

完全通用但实际上不理想的解决方案是在从 LUA 读取所有内容然后加载它时从 C# 生成 dll。但是,只有当你的 C# 代码是完全通用的并且不必知道 LUA 正在使用"玩家"或"汽车"或其他任何东西时,这才有用。

最新更新