Я создаю некоторый пользовательский интерфейс для игры, над которой я сейчас работаю, в C #, и хочу показать все на Lua, чтобы мой художник мог вносить небольшие изменения без необходимости что-либо делать в коде. Я использую MoonSharp для интеграции скриптов Lua в мой проект.
Вот что у меня сейчас есть для моего класса-оболочки UIElement:
UIElement = {};
UIElement.__index = UIElement;
setmetatable( UIElement, {
__index = function( self, key )
local codeElement = rawget( self, "__codeElement" );
local field = codeElement and codeElement[key];
if type( field ) == "function" then
return function( obj, ... )
if obj == self then
return field( codeElement, ... );
else
return field( obj, ... )
end
end;
else
return field;
end
end,
__call = function( cls, ... )
return cls.new( ... );
end,
} );
function UIElement.new()
local self = setmetatable( {}, UIElement );
self.__codeElement = BLU_UIElement.__new();
return self;
end
BLU_UIElement - это мой класс C #, который предоставляется Lua через API MoonSharp. Он работает правильно при работе непосредственно с объектом и имеет такие функции, как SetPos, SetColor и т. Д.
UIElement предназначен для моего "класса" в Lua, чтобы обернуть и расширить мой объект C #.
Когда я создаю экземпляр UIElement в другом месте скрипта и пытаюсь вызвать функцию (например, SetPos), он правильно попадает в функцию __index. Однако вызов rawget всегда возвращает ноль. Это не кажется специфичным для элемента BLU_UIE. Я уже пробовал что-то очень простое, например, добавление значения идентификатора строки в конструкторе и попытка получить его в функции __index, но оно также возвращает nil.
Я предполагаю, что просто делаю что-то неправильно, настраивая метастабильность либо для класса, либо для самого объекта, но я не совсем уверен, в чем проблема. Я искал здесь: http://lua -users.org / wiki / ObjectOrientationTutorial , чтобы получить представление о том, что я делаю неправильно, но у меня ничего не выскакивает.
Я ценю любые рекомендации по этому поводу, я смотрел на это пару дней, не понимая этого, и поиск в Интернете, как правило, просто показывает код, аналогичный тому, что я уже делаю.