2013-09-09 3 views
2

У меня есть коды фона lua, и я загружаю их при каждом запуске, они работают нормально, но есть ли способ конвертировать их в C#?LuaInterface C# Metatables

Вот мой мета-таблица кодов:

player = {} 
player.__index = player 

function player:Add(name) 
    return setmetatable({name = name}, player) 
end 

function player:Nick() 
    return self.name 
end 

Он отлично работает, вот как в настоящее время мои коды работают:

print(ply:Nick()) 

В настоящее время я ищу объект Player.cs используя пустоту в моей регистрируя код функции lua, у меня нет специального void или функции на моем C# -кодексе, на котором есть объект Player на нем, но я хочу изменить их все на объект Player. Также есть ли способ использовать Player.cs пустоты/строки или что-либо из lua, не регистрируя их? Объекты Player.cs нестатические.

ответ

0

Я узнал, что KopiLua и LuaInterface (Latest) Имеет metatables, все, что вам нужно вернуть. Является вашим объектом. Вы не можете возвращать классы или добавлять их в LuaInterface, но вы можете возвращать объекты или функции, которые могут делать то же самое , от lua, люди могут использовать функции объекта. Функции, имеющие аргумент (даже пустой) Используются с:, и другими с точкой. Вот пример:

// C#: 
public List<string> testing() 
{ 
    return new List<string>() 
    { 
     {"Test"}, 
     {"Another test"} 
    }; 
} 

// Player object: 
public int Health { get { return 1; } } 
public int Hp() { return this.Health; } 

// lua: 
testing:Clear() 
print(ply.Health) 
print(ply:Hp()) 
ply.Health = 2 
// You can not change a function style value like Hp(), So no way to change health this way except making a set function 
-1

Я не уверен, что понял, что вам нужно, но позвольте мне попробовать. Я бы установил идентификатор для моих классов LUA (например, «csid» = «Player»), который я мог бы использовать из объекта LuaTable, полученного на C#, для идентификации объекта для создания экземпляра. Тогда у вас могут быть либо классы C#, либо заводские методы, берущие «LuaTable» для создания экземпляра и метода в экземпляре, позволяющего получить от него «LuaTable». Или у вас есть класс оболочки LUA для каждого из ваших классов C# с методами ToLUA и FromLUA для преобразования обоих способов.

Когда какой-либо код C# вызывается с помощью «LuaTable», вы должны проверить, имеет ли он член «csid», и если это так, используйте оператор switch для выбора вашего класса или используйте Reflection с полученным именем для создания вашего объекта C#. И всякий раз, когда вам нужно передать объект C# в LUA, вы будете использовать обратный метод конвертации таким же образом.

Полностью общее, но действительно не идеальное решение должно было бы генерировать dll из C#, когда вы читаете все из LUA, а затем загружаете. Но это будет полезно, только если ваш код на C# является полностью общим и не должен знать, что LUA использует «Игроков» или «Автомобилей» или что-то еще.