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