Я делаю мод для игры под названием Scrap Mechanic и пытался найти детали, чтобы легко общаться друг с другом. Обычно это означало бы создание глобальной таблицы, заполнение этой глобальной таблицы переменными, которые я хочу передать, а затем извлечение их из другой части с использованием идентификатора части, которая ее сохранила. Проблема в том, что это громоздко, и мне было интересно, есть ли простой способ заставить это работать. API lua для игр выглядит примерно так:
self = {interactable = {<interactable>, id = 1}, shape = {<shape>, id = 1}}
Их больше, но основная часть состоит в том, что они содержат основные функции API. Я могу переключаться между двумя, используя функции, получать данные из игры и устанавливать переменные, такие как выходные данные блока (к сожалению, я могу установить только 1 переменную и 1 логическое значение, что затрудняет передачу больших объемов).
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь сохранить значение в self.interactable или self.shape, оно изменяется для каждого объекта в игре на это значение, а не просто помещается рядом с userdata / metatable ( до сих пор не уверен, какой из 2 это так помочь с этим также было бы здорово).
Теперь я попытался использовать inserttraw или что-то еще, а также другие функции, связанные с метатаблицами, чтобы игнорировать функцию __newindex, которая может быть в таблице, но я не могу получить доступ к этой части библиотеки и там есть шов, чтобы нет других ответов в Интернете на это. Я также подумал о том, чтобы, возможно, получить собственную часть из self.interactable, но у меня есть доступ только к интерактивному и (по крайней мере, в игровом API) способу вернуться из интерактивного к себе, но здесь вопрос не в этом, хотя ответ на это очень помог бы, потому что я могу хранить данные самостоятельно, не мешая другим частям.
function test1.server_onFixedUpdate( self, dt ) --code for one of the parts
self.interactable.testValue = 1
end
function test2.server_onFixedUpdate( self, dt ) --code for another part
print(self.interactable:getSingleParent().testValue) --returns the interactable of the connected part and accesses testValue
print(self.interactable.testValue)
end
При этом вы ожидаете, что результат будет читать 1, nil
, но вместо этого он будет читать 1, 1
, что говорит о том, что testValue был помещен в обе части. При печати self.interactable он печатает только {<interactable>, id = 1}
, что заставляет меня думать, что он хранит значение внутри метатаблицы, которое является значением по умолчанию для каждой части. А использование insertraw( self.interactable, testValue, 1 )
просто возвращает мне неизвестную глобальную ошибку (если я использовал здесь не ту функцию, не волнуйтесь, я правильно ее набрал в коде).