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}");
}

Производительность

Рекомендации

  1. Компилируйте часто используемые скрипты - избегайте повторной компиляции
  2. Используйте локальные переменные в Lua - они быстрее глобальных
  3. Кешируйте функции - сохраняйте ссылки на часто вызываемые функции
  4. Избегайте 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)

Ограничения

Ссылки


Проект: Igdrasil Engine
Автор: Alexander Izmailov
Собственность: Igdrasil Project
Версия: 1.0
Лицензия: Proprietary License

© 2026 Alexander Izmailov. Все права защищены.
Этот программный продукт является собственностью студии Igdrasil Project.