6

jintを使用して、XNA (C#) で作成された 3D 環境を操作し、この環境に機能を追加することはできますか (再び jint を使用)?

4

3 に答える 3

4

Jintの寄稿者として、Jintをお勧めします。Jintを使用すると、Luaよりも簡単になります。さらに、これがLuaで可能かどうかはわかりませんが、.NETオブジェクトを指定して、javascript(JintはJavascript INTpreterの略)でそれらを操作できます。アクセス許可セットを使用してアプリケーションを保護することもできます。これは、以前に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;
    }
}
于 2010-01-02T10:44:49.893 に答える
2

Jintはオプション、LUAはオプションチェックアウトLuaForge

LUAは本当に楽しくて使いやすい言語であり、協調マルチタスク(コルーチン)をサポートしています。その基本的なデータ型は、非常に柔軟で強力なテーブル(辞書と配列のクロス)です。

これは私がちょうどそれをテストするために今書いたものです。GTestと呼ばれるオブジェクトのC#メソッドにマップすると呼ばれるスクリプトの関数を登録していますLUA_GTest。このメソッドは一般的なオブジェクトを受け入れ、スクリプトでは、doubleを表す文字列を含むテーブルを含むテーブルを渡します。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;
    }
}
于 2010-01-01T15:14:33.157 に答える
1

この SO questionを見て、.Net のスクリプト プラットフォームを選択する方法を検討してください。

一般に、スクリプト エンジンを XNA アプリケーションに組み込むことができることを確認してください。スクリプト エンジンを使用してアプリにフックを提供することは、パブリック インターフェイスを介して外部アセンブリを呼び出すことと大差ありません。

于 2010-01-01T15:04:01.057 に答える