Начало работы

Требования

Установка

IgdrasilScripting является частью Igdrasil Engine. Для использования скриптинга добавьте ссылки на нужные проекты:

<ItemGroup>
  <ProjectReference Include="..\IgdrasilScripting\IgdrasilScripting.csproj" />
  <ProjectReference Include="..\IgdrasilLuaScripting\IgdrasilLuaScripting.csproj" />
  <!-- или -->
  <ProjectReference Include="..\IgdrasilJavaScriptScripting\IgdrasilJavaScriptScripting.csproj" />
</ItemGroup>

Первый скрипт на Lua

Шаг 1: Создайте Lua-движок

using IgdrasilEngine.Engine.Scripting.Lua;

var engine = new LuaEngine();

Шаг 2: Выполните простой скрипт

// Вычислить выражение
var result = engine.Evaluate("return 10 + 5");
Console.WriteLine(result[0]); // Выведет: 15

// Выполнить код без возврата значения
engine.Execute(@"
    local message = 'Hello, Igdrasil!'
    print(message)
");

Шаг 3: Работа с переменными

// Установить переменную из C#
engine.SetValue("playerHealth", 100);
engine.SetValue("playerName", "Hero");

// Использовать в скрипте
engine.Execute(@"
    print('Player: ' .. playerName)
    print('Health: ' .. playerHealth)
");

// Получить значение из скрипта
var health = engine.GetValue<int>("playerHealth");

Первый скрипт на JavaScript

Шаг 1: Создайте JavaScript-движок

using IgdrasilEngine.Engine.Scripting.JS;

var engine = new JavaScriptEngine("MyGame");

Шаг 2: Выполните скрипт

// Вычислить выражение
var result = engine.Evaluate("2 + 2");
Console.WriteLine(result); // 4

// Выполнить код
engine.Execute(@"
    const greeting = 'Hello from JavaScript!';
    console.log(greeting);
");

Шаг 3: Работа с объектами

// Создать объект в JavaScript
engine.Execute(@"
    var player = {
        name: 'Hero',
        level: 10,
        health: 100
    };
");

// Получить значение
var playerLevel = engine.GetValue<int>("player.level");

Компиляция скриптов

Для повторного использования скрипты можно скомпилировать:

// Скомпилировать скрипт Lua
IScript<object[]> luaScript = engine.Compile(@"
    return math.sqrt(x^2 + y^2)
");

// Установить параметры и выполнить
luaScript.SetValue("x", 3.0);
luaScript.SetValue("y", 4.0);
var distance = luaScript.Evaluate();
Console.WriteLine(distance[0]); // 5.0

Асинхронное выполнение

// Асинхронная компиляция
var script = await engine.CompileAsync("return 42");

// Асинхронное выполнение
var result = await engine.EvaluateAsync("return os.time()");

// Безопасное выполнение
var (success, result) = await engine.TryEvaluateAsync("return 1 / x");
if (!success)
{
    Console.WriteLine("Скрипт выполнен с ошибкой");
}

Обработка ошибок

using IgdrasilEngine.Engine.Scripting.Exceptions;

try
{
    engine.Execute("invalid lua code @@#");
}
catch (ScriptCompilationException ex)
{
    Console.WriteLine($"Ошибка компиляции на строке {ex.LineNumber}: {ex.Message}");
}

try
{
    engine.Execute("error('Something went wrong!')");
}
catch (ScriptExecutionException ex)
{
    Console.WriteLine($"Ошибка выполнения: {ex.Message}");
    if (ex.Context != null)
    {
        Console.WriteLine($"Время выполнения: {ex.Context.ElapsedMilliseconds}ms");
    }
}

Следующие шаги