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);// 引数の数と、戻り値の数を指定しなければならない*/ }
public void AddDelegateAddress(string functionName, DelegateLuaBindFunction function) { mDelegateAddressMap.Add(functionName, function); }
// 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); }