我在我的C ++游戏中使用Lua作为脚本。我希望能够将脚本附加到实体,并根据脚本中定义的函数,注册将在适当的时间运行脚本函数的回调。
我相信通过制作"脚本"我可以相互封装不同的脚本。进入一张桌子。基本上,... lua source code ...
将成为ScriptName = { ... lua source code ... }
。然后,我不是调用func()
,而是调用ScriptName.func()
,因此定义相同功能的两个脚本(也就是注册同一事件)不会相互踩踏。
我现在的问题是封装共享相同脚本的不同实体。显然,我不希望它们共享变量,但是我现在正在做的事情,脚本定义的任何变量都会被该脚本的每个实例共享,这真的很糟糕。我可以在源代码级别尝试与上述解决方案类似的东西,在编译之前用EntityID.ScriptName = { ... }
包装每个脚本。有些东西告诉我,这是一个更好的方式,但我不知道。
另一个因素是脚本需要能够引用相对于特定实体的实体和脚本/组件。如果我使用上面的方法,最好的解决办法是将实体ID作为字符串传递,可以引用特定于该实体的表,我想?在这一点上,我真的不知道我在做什么。
答案 0 :(得分:0)
为了使脚本与C ++对象交互,典型的方法是让C ++代码将对象公开为Lua作为用户数据(指针的包装器)并提供脚本可以调用的C ++函数,传递userdata作为参数。在C ++代码中,该userdata为您提供了该函数应该操作的对象。它等同于“this”指针。
通常将C ++函数放入与userdata关联的元表中,这样就可以像Lua代码中的方法一样调用它们(即objectIGotFromCpp:someMethod('foo')
。
ScriptName.func(),因此两个定义相同功能的脚本(也就是注册同一个事件)不会互相践踏。
而不是依赖于访问全局变量或命名约定,等等。简单地提供一个Lua脚本可以用来注册事件的回调就更清晰了。
如果我使用上述方法,那么最佳解决方案是将实体ID作为字符串传递
没理由。 C ++代码中的实体是指向堆上对象的指针。您可以将该指针直接传递给Lua作为userdata。 Lua可以将其传递回您的C ++代码并让您直接访问该对象,而不是通过一些对象到ID的映射。