2

我有一些后台 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 对象,还有什么方法我可以使用 Player.cs voids/strings 或来自 lua 的任何东西而不注册它们?Player.cs 对象是非静态的。

4

2 回答 2

0

我发现 KopiLua 和 LuaInterface (Latest) 有元表,所有你必须返回的是你的对象,你不能返回类或无论如何将它们添加到 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
于 2013-10-23T18:21:07.230 回答
-1

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

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

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

于 2013-09-27T09:21:52.297 回答