IgdrasilLuaScripting - Lua для Igdrasil Engine
IgdrasilLuaScripting — это реализация системы скриптинга на основе Lua через библиотеку NLua. Предоставляет полную поддержку Lua 5.2+ для Igdrasil Engine.
Основные возможности
✅ Полная поддержка Lua 5.2+
✅ Интеграция через NLua
✅ Поддержка всех стандартных библиотек Lua
✅ Модульная система через require()
✅ Асинхронное выполнение скриптов
✅ Компиляция скриптов для повторного использования
✅ Двусторонняя передача данных между C# и Lua
✅ Поддержка C# классов и перечислений в Lua
Быстрый старт
using IgdrasilEngine.Engine.Scripting.Lua;
// Создать движок
var engine = new LuaEngine();
// Выполнить скрипт
var result = engine.Evaluate("return 2 + 2");
Console.WriteLine(result[0]); // 4
// Работа с переменными
engine.SetValue("playerHealth", 100);
var health = engine.GetValue<int>("playerHealth");
Архитектура
IgdrasilLuaScripting
├── LuaEngine - Основной движок скриптов
├── LuaScript - Скомпилированный Lua-скрипт
├── LuaModuleInterface - Регистрация функций/классов
└── ResourceRequire - Система модулей
Возвращаемые значения
Lua может возвращать несколько значений, поэтому все методы возвращают object[]:
// Одно значение
var result = engine.Evaluate("return 42");
Console.WriteLine(result[0]); // 42
// Несколько значений
var result = engine.Evaluate("return 1, 2, 3");
Console.WriteLine(result[0]); // 1
Console.WriteLine(result[1]); // 2
Console.WriteLine(result[2]); // 3
Типы данных
C# → Lua
| C# | Lua |
|---|---|
int, long, float, double |
number |
string |
string |
bool |
boolean |
null |
nil |
Dictionary<,> |
table |
List<>, Array |
table (array) |
| C# класс | userdata |
Delegate, Action, Func |
function |
Lua → C#
// Числа
var num = engine.GetValue<double>("myNumber");
// Строки
var str = engine.GetValue<string>("myString");
// Булевы значения
var flag = engine.GetValue<bool>("myFlag");
// Таблицы как Dictionary
var dict = engine.GetValue<Dictionary<object, object>>("myTable");
// LuaFunction для функций
var func = engine.GetValue<NLua.LuaFunction>("myFunction");
Модули
Регистрация модуля
public class MathModule : Module<LuaModuleInterface>
{
public override string Name => "mymath";
public override void Initialize(LuaModuleInterface moduleInterface)
{
moduleInterface.RegisterFunction("square", (double x) => x * x);
moduleInterface.RegisterValue("PI", Math.PI);
}
}
// Использование
engine.RegisterModule(new MathModule());
Использование в Lua
local mymath = require("mymath")
print(mymath.square(5)) -- 25
print(mymath.PI) -- 3.14159...
Стандартные библиотеки Lua
Все стандартные библиотеки Lua доступны:
-- Math
local result = math.sqrt(144)
local random = math.random(1, 100)
-- String
local upper = string.upper("hello")
local len = string.len("test")
-- Table
table.insert(myTable, value)
table.sort(myTable)
-- IO
local file = io.open("data.txt", "r")
local content = file:read("*a")
file:close()
-- OS
local time = os.time()
local date = os.date("%Y-%m-%d")
Компиляция скриптов
// Скомпилировать скрипт
var script = engine.Compile("return x * x");
// Установить параметры
script.SetValue("x", 5);
// Выполнить много раз
for (int i = 0; i < 1000; i++)
{
script.SetValue("x", i);
var result = script.Evaluate();
Console.WriteLine(result[0]);
}
MoonScript
MoonScript — это язык программирования с расширенным синтаксисом, который компилируется в Lua. Поддерживает классы, списковые включения, деструктуризацию и многое другое.
📖 Полная документация по MoonScript
Быстрый пример
using IgdrasilEngine.Engine.Scripting.Lua;
string moonCode = @"
class Player
new: (@name, @health = 100) =>
attack: (target) =>
print @name .. ' attacks ' .. target
";
string luaCode = MoonScriptCompiler.Compile(moonCode);
var engine = new LuaEngine();
engine.Execute(luaCode);
Подробнее: MoonScript Documentation
Обработка ошибок
using IgdrasilEngine.Engine.Scripting.Exceptions;
try
{
engine.Execute("invalid lua code");
}
catch (ScriptCompilationException ex)
{
Console.WriteLine($"Синтаксическая ошибка: {ex.Message}");
Console.WriteLine($"Строка: {ex.LineNumber}");
}
try
{
engine.Execute("error('Something went wrong')");
}
catch (ScriptExecutionException ex)
{
Console.WriteLine($"Ошибка выполнения: {ex.Message}");
}
Производительность
Рекомендации
- Компилируйте часто используемые скрипты - избегайте повторной компиляции
- Используйте локальные переменные в Lua - они быстрее глобальных
- Кешируйте функции - сохраняйте ссылки на часто вызываемые функции
- Избегайте boxing - используйте
doubleвместоintв Lua
Пример оптимизации
-- Медленно (глобальные переменные)
for i = 1, 1000000 do
result = result + math.sqrt(i)
end
-- Быстро (локальные переменные)
local result = 0
local sqrt = math.sqrt
for i = 1, 1000000 do
result = result + sqrt(i)
end
Интеграция C# классов
public class Player
{
public string Name { get; set; }
public int Health { get; set; }
public void Attack(string target)
{
Console.WriteLine($"{Name} attacks {target}");
}
}
var module = new Module<LuaModuleInterface>
{
Name = "game",
Initialize = mi =>
{
mi.RegisterClass("Player", typeof(Player));
mi.RegisterFunction("createPlayer", (string name, int health) =>
new Player { Name = name, Health = health });
}
};
engine.RegisterModule(module);
В Lua:
local game = require("game")
local player = game.createPlayer("Hero", 100)
player.Name = "Super Hero"
player:Attack("Dragon")
print(player.Health)
Ограничения
- Coroutines: NLua имеет ограниченную поддержку корутин
- Метатаблицы: Некоторые операции с метатаблицами могут работать нестабильно
- Weak references: Слабые ссылки могут вести себя непредсказуемо
- Многопоточность: Каждый
LuaEngineдолжен использоваться в одном потоке
Ссылки
Проект: Igdrasil Engine
Автор: Alexander Izmailov
Собственность: Igdrasil Project
Версия: 1.0
Лицензия: Proprietary License
© 2026 Alexander Izmailov. Все права защищены.
Этот программный продукт является собственностью студии Igdrasil Project.