如何在Lua中的userdata块旁边存储数据?

我正在为游戏Scrap Mechanic制作一个mod,试图让零件之间轻松通信。通常这意味着创建一个全局表格,将我要通信的变量放入该全局表格中,然后使用存储变量的部件的ID从另一个部件中检索它们。问题在于它很笨重,我想知道是否有一种简单的方法使其工作。游戏的Lua API看起来像这样:

self = {interactable = {<interactable>, id = 1}, shape = {<shape>, id = 1}}

这里有更多类似的代码,但主要部分是它们包含API的主要函数。我可以使用函数在两者之间进行切换,从游戏获取数据并设置变量,例如块的输出(不幸的是,我只能设置1个变量和1个布尔值,这使得传输大量数据很困难)。 我遇到的问题是,当我尝试将值存储在self.interactable或self.shape中时,它会被更改为每个对象游戏中的该值,而不是仅将其放在userdata/metatable旁边(我仍然不确定它是哪个,所以对此的帮助也很好)。

现在我已经尝试使用insertraw或其他涉及元表的函数来忽略可能在表中的__newindex函数,但我无法访问该库的该部分,并且在Web上没有其他答案。我还尝试从self.interactable中检索self部分,但我只能访问interactable,(至少不在游戏API中)无法从interactable返回self,但这不是问题的关键,尽管对此的答案会很有帮助,因为我可以在不干扰其他部分的情况下存储数据在self中。

function test1.server_onFixedUpdate( self, dt ) --一个部分的代码
    self.interactable.testValue = 1
end

function test2.server_onFixedUpdate( self, dt ) --另一个部分的代码
    print(self.interactable:getSingleParent().testValue) --返回连接部件的可交互部分并访问testValue
    print(self.interactable.testValue)
end

在执行此操作时,您将期望输出为“1,nil”,但实际上它读取“1,1”,这表明testValue已被放置在两个部分中。当打印self.interactable时,它仅打印“{,id = 1}”,这使我认为它将该值存储在每个部件默认的元表中。并且使用insertraw(self.interactable,testValue,1)只会给我返回一个未知的全局错误(如果我在这里使用了错误的函数,请不要担心,我在代码中正确输入了它)。

点赞