首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LuaInterface C# Metatable

LuaInterface C# Metatable
EN

Stack Overflow用户
提问于 2013-09-09 06:56:54
回答 2查看 685关注 0票数 2

我有一些背景lua代码,我在每次启动时都加载它们,它们运行良好,但是有什么方法可以将它们转换为C#呢?

这是我的元表代码:

代码语言:javascript
复制
player = {}
player.__index = player

function player:Add(name)
    return setmetatable({name = name}, player)  
end

function player:Nick()
    return self.name
end

它工作得很好,下面是我当前代码的工作方式:

代码语言:javascript
复制
print(ply:Nick())

目前,我在注册lua函数代码时使用Player.cs对象搜索一个空值,在我的C#代码中没有任何包含Player对象的特殊的void或函数,但是我想将它们全部更改为Player对象,还有什么方法可以不用注册就使用Player.cs空/字符串或lua中的任何东西吗?Player.cs对象是非静态的.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-23 18:21:07

我发现KopiLua和LuaInterface (最新的)都有元对象,您只需要返回对象,您不能返回类或者无论如何都不能将它们添加到LuaInterface中,但是您可以返回可以这样做的对象或函数。从lua,人们可以使用对象函数。带有参数(甚至为空的)的函数与a :一起使用,而其他函数则使用点。下面是一个例子:

代码语言:javascript
复制
// 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
票数 0
EN

Stack Overflow用户

发布于 2013-09-27 09:21:52

我不知道你到底需要什么,但让我试试。我将为我的LUA类设置一个标识符(如'csid‘= "Player"),我可以使用它从C#中检索的'LuaTable’对象中识别要实例化的对象。然后,您可以让您的C#类有一个工厂方法,使用“LuaTable”来构建实例,并在实例上使用允许从它获取“LuaTable”的方法。或者为每个C#类设置一个LUA包装类,其中包含“ToLUA”和“FromLUA”方法,以实现这两种方法的转换。

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

一个完全通用但并不理想的解决方案是,当您从LUA读取所有内容,然后加载它时,可以从C#生成一个dll。但是,只有当你的C#代码是完全通用的,并且不需要知道LUA使用的是“播放器”或“汽车”或其他任何东西时,这才是有用的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18692931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档