Начало работы
Требования
- .NET 8.0 SDK или выше
- IgdrasilCore
- IgdrasilLogging
Установка
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");
}
}
Следующие шаги
- Изучите Модули для расширения функционала
- Узнайте о Профилировании для оптимизации
- Познакомьтесь с Отладкой скриптов