DelegateLuaBindFunction LuaUnityDebugLogUseArg;               // 当然、ガベコレ食らった関数ポインタをLuaがアクセスすると動作不定になる
    void test4()
    {
        IntPtr luastate = NativeMethods.luaL_newstate();

        NativeMethods.luaL_openlibs(luastate);        // これは、Lua側に必要な基本的な機能を関連付けている

        // Lua読み込み
        TextAsset file = Resources.Load <TextAsset>("UnityFunction");
        int       res  = NativeMethods.luaL_loadstring(luastate, file.text);

        res = NativeMethods.lua_pcallk(luastate, 0, -1, 0);         // これで、LuaStateにLuaScriptの関連付けが終わる

        // Lua側にC#の関数を登録する(多分、C#の関数のポインタを渡して、Lua側からもアドレスにAccess出来るようにしてるんだと思う)
        LuaUnityDebugLog = new DelegateLuaBindFunction(UnityDebugLog);
        IntPtr LuaUnityDebugLogIntPtr = Marshal.GetFunctionPointerForDelegate(LuaUnityDebugLog);         // これが例のIOSで使えない関数ね
        int    num = NativeMethods.lua_gettop(luastate);

        NativeMethods.lua_pushcclosure(luastate, LuaUnityDebugLogIntPtr, 0);
        num = NativeMethods.lua_gettop(luastate);
        NativeMethods.lua_setglobal(luastate, "UnityDebugLog");
        num = NativeMethods.lua_gettop(luastate);

        // Luaで定義した関数をスタックに積む。Luaは関数も変数のひとつに過ぎないらしい
        NativeMethods.lua_getglobal(luastate, "CallUnityDebugLog");
        // 関数呼び出し。
        res = NativeMethods.lua_pcallk(luastate, 0, 0, 0);         // 引数の数と、戻り値の数を指定しなければならない
        num = NativeMethods.lua_gettop(luastate);


        // ここから引数ありの方
        // Lua側にC#の関数を登録する(多分、C#の関数のポインタを渡して、Lua側からもアドレスにAccess出来るようにしてるんだと思う)

/*		LuaUnityDebugLogUseArg = new DelegateLuaBindFunction (UnityDebugLogUseArg);
*               IntPtr LuaUnityDebugLogUseArgIntPtr = Marshal.GetFunctionPointerForDelegate (LuaUnityDebugLogUseArg);// これが例のIOSで使えない関数ね
*               NativeMethods.lua_pushcclosure (luastate, LuaUnityDebugLogUseArgIntPtr, 0);
*               NativeMethods.lua_setglobal (luastate, "UnityDebugLogUseArg");
*
*               // Luaで定義した関数をスタックに積む。Luaは関数も変数のひとつに過ぎないらしい
*               NativeMethods.lua_getglobal(luastate, "CallUnityDebugLogUseArg");
*               NativeMethods.lua_pushstring(luastate, "C#から渡した引数文字列だよ");
*
*               // 関数呼び出し。
*               res = NativeMethods.lua_pcallk (luastate, 1, 0, 0);// 引数の数と、戻り値の数を指定しなければならない*/
    }
Example #2
0
 public void AddDelegateAddress(string functionName, DelegateLuaBindFunction function)
 {
     mDelegateAddressMap.Add(functionName, function);
 }
Example #3
0
    // Lua側にUnityの関数を教える
    // Lua側からUnityの関数を呼び出す時に、ガベコレで関数デリゲートを持ってかれないように参照も保持する
    public void AddUnityFunction(string filename, string functionName, IntPtr functionPointer, DelegateLuaBindFunction function)
    {
        IntPtr luastate = GetLuaState(filename);

        NativeMethods.lua_pushcclosure(luastate, functionPointer, 0);
        NativeMethods.lua_setglobal(luastate, functionName);

        mDelegateAddressMap.Add(filename + functionName, function);
    }