Действительно ли возможно использовать jint, чтобы управлять 3D средой, созданной с XNA (C#) и добавить функциональность к этой среде (снова использующий jint)?
Jint - опция, LUA - опция, проверьте LuaForge
LUA - действительно забавный и простой в использовании язык, с хорошей поддержкой кооперативной многозадачности (coroutines). Его базовый тип данных - таблица (это пересечение словаря и массива), которая очень гибкая и мощная.
Вот кое-что, что я только что написал для тестирования. Я регистрирую функцию для скрипта под названием GTest
, которая сопоставляется с методом C# в моем объекте под названием LUA_GTest
. Метод принимает общий объект, а в скрипте я передаю ему таблицу, содержащую строку, представляющую собой двойник. В C# я разворачиваю все и возвращаю значение, основанное на значении double.
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
private void Run()
{
Lua lua = new Lua();
var methodInfo = typeof(Program).GetMethod("LUA_GTest", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
lua.RegisterFunction("GTest", this, methodInfo);
lua.DoString("GTest({{\"3.3\"}})");
}
private double LUA_GTest(object d)
{
Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString());
while (d is LuaTable)
{
d = ((LuaTable)d)[1];
Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString());
}
if (d is string)
{
d = double.Parse((string)d);
Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString());
}
if (d is double)
return (double)d * 2;
return 0;
}
}
Я бы порекомендовал Jint. Jint делает это проще, чем то, что делает Lua. Более того, я не знаю, возможно ли это с Lua, но Вы можете дать ему .NET объекты и играть с ними на javascript (Jint расшифровывается как Javascript INTpreter). Вы также можете обезопасить свое приложение с помощью Permissions Set. Вот тот же код, что и для Jint :
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
private void Run()
{
JintEngine engine = new JintEngine();
engine.SetFunction("GTest", new Jint.Delegates.Func<object, double>(LUA_GTest));
engine.Run("GTest([['3,3']])");
}
private double LUA_GTest(object d)
{
Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString());
while (d is ArrayList)
{
d = ((ArrayList)d)[0];
Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString());
}
if (d is string)
{
d = double.Parse((string)d);
Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString());
}
if (d is double)
return (double)d * 2;
return 0;
}
}
Взгляните на этот SO вопрос, рассматривая, как выбрать платформу для скриптинга для .Net.
В общем, конечно, вы можете встроить скриптовый движок в ваше приложение XNA. Использование скриптового движка и предоставление крючков в вашем приложении не сильно отличается от вызова внешних сборок через публичные интерфейсы.