Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NLua-如何通过Lua向userdata添加新函数?_C#_Lua_Luainterface_Nlua - Fatal编程技术网

C# NLua-如何通过Lua向userdata添加新函数?

C# NLua-如何通过Lua向userdata添加新函数?,c#,lua,luainterface,nlua,C#,Lua,Luainterface,Nlua,我正在尝试为我的Player类定义一个新函数,该类是在C#中定义的。在我的项目(一个游戏引擎)中,Lua的目的是为诸如玩家之类的实体定义自定义行为 但是,当我对Lua文件执行DoFile(fileName)操作时,它会崩溃,出现以下异常: “字段或属性“空闲”不存在” 它特别指向这段代码的第一行: function Player:Idle() self:Turn() self.StateType = StateType.Stand self.MoveType = Move

我正在尝试为我的
Player
类定义一个新函数,该类是在C#中定义的。在我的项目(一个游戏引擎)中,Lua的目的是为诸如玩家之类的实体定义自定义行为

但是,当我对Lua文件执行
DoFile(fileName)
操作时,它会崩溃,出现以下异常:

“字段或属性“空闲”不存在”

它特别指向这段代码的第一行:

function Player:Idle()
    self:Turn()
    self.StateType = StateType.Stand
    self.MoveType = MoveType.Idle
    self.Vel = Vector2.Zero
    if self.Anim.Number ~= 0 and (self.Anim.Number ~= 5 or self:GetAnimTime() == 0) then
        self:ChangeAnim(0)
    end
end
它似乎在编写
Player:Idle
时有问题。然而,我也试着以
Player.Idle
的身份编写它,我也遇到了同样的问题。下面是我如何处理在C#中为播放器加载脚本的过程:

换句话说,我希望能够在脚本中使用
self
,以便能够引用用户数据,以及自定义函数,例如
Idle()
Turn()


我如何才能实现我想要的行为?

来自Lua参考手册:

用户数据值不能在Lua中创建或修改,只能通过 C API。这保证了主机拥有的数据的完整性 节目

因此,您不能向userdata添加函数,但可以通过将userdata包装到自己的Lua表中来编写自己的扩展接口

举个简单的例子,假设您可以通过调用Player()创建一个Player userdata值

然后您只需调用
WrappedPlayer:Idle()

当然,您可以进一步改进这一点,在用您自己的表覆盖播放器表并添加一些元表魔法后,您只需创建自己的播放器对象:

local myPlayer = Player()
myPlayer:Idle()
只需阅读一些LuaOOP教程就可以了解如何使用它

不要忘记一个非常简单的解决方案:

function SetPlayerIdle(player)
  player:Turn()
  -- and so forth
end

从Lua参考手册:

用户数据值不能在Lua中创建或修改,只能通过 C API。这保证了主机拥有的数据的完整性 节目

因此,您不能向userdata添加函数,但可以通过将userdata包装到自己的Lua表中来编写自己的扩展接口

举个简单的例子,假设您可以通过调用Player()创建一个Player userdata值

然后您只需调用
WrappedPlayer:Idle()

当然,您可以进一步改进这一点,在用您自己的表覆盖播放器表并添加一些元表魔法后,您只需创建自己的播放器对象:

local myPlayer = Player()
myPlayer:Idle()
只需阅读一些LuaOOP教程就可以了解如何使用它

不要忘记一个非常简单的解决方案:

function SetPlayerIdle(player)
  player:Turn()
  -- and so forth
end

我现在是
nlua
方面的专家,但根据我的经验,你不应该先使用
LoadCLRPackage
然后使用
.state.dostring
来创建.net属性,因为
Player
被定义为
c
类吗?这不是我要问的。我想知道的是,是否可以将Lua函数添加到Lua中预定义的.NET对象中。我已经读了几个小时了,从技术上来说这似乎是不可能的,但我读过一些叫做
debug.setuservalue
的东西。我现在是
nlua
方面的专家,但是根据我的说法,你不应该先使用
LoadCLRPackage
然后使用
.state.dostring
来创建.net属性,既然
Player
被定义为
c#
类,那不是我要问的。我想知道的是,是否可以将Lua函数添加到Lua中预定义的.NET对象中。我已经读了几个小时了,从技术上来说,这似乎是不可能的,但我已经读了一些叫做
debug.setuservalue
的东西。非常感谢!你给我的关于使用元表的提示肯定是我需要走的路!我发现这也让我离实现我想要的目标又近了一步!如果可以,请查看我的。非常感谢!你给我的关于使用元表的提示肯定是我需要走的路!我发现这也让我离实现我想要的目标又近了一步!如果可以,请查看我的。
function SetPlayerIdle(player)
  player:Turn()
  -- and so forth
end