找回密码
 立即注册
查看: 157|回复: 0

Unity3d toLua# 框架学习 -- Function

[复制链接]
发表于 2023-4-9 09:40 | 显示全部楼层 |阅读模式
toLua的第三个案例是关于如何在c#中调用Lua函数的
一、LuaTable.GetLuaFunction()与LuaState.GetFunction()
具体地调用方法如下:
  1.         LuaTable table = new LuaTable();
  2.         LuaFunction func = table.GetLuaFunction("Function_Name");
  3.        
  4.         LuaState lua = new LuaState();
  5.         LuaFunction func = lua.GetFunction("Function_Name");
复制代码
二、GetFunction的执行流程
1.首先该方法会从funcMap这个字典中查找对应的方法,获取该方法的弱引用,并检查其状态(是否为游离态)。如果是非游离状态,则获取该函数的强引用,并再次检查函数的状态。若再次为true,则从GC列表中删除该方法并返回该函数,否则从funcMap中删除该方法。



2.若并未从funcMap中获取到函数,则执行PushLuaFunction方法,该方法会检测对应的持有者是否存在,并检测该方法是否为lua的function,然后进行压堆栈。



3.完成PushLuaFunction,再执行和1相同的步骤,只是在funcRefMap中查找。如果都没查找到该方法,则重新生成一个方法并向funcMap和funcRefMap中添加该方法,然后从GC列表中删除。



三、c#调用Lua函数的方法(*注:lua代表LuaState变量,luaFunc表示LuaFunction变量,并全部进行了基本的初始化)
1.LuaFunction.Invoke()
该函数有多个重载形式,比较常用的两个简单形式有
  1.         R1 luaFunc.Invoke<R1>();
  2.         R1 luaFunc.Invoke<T1, R1>(T1 param);
复制代码
2.LuaFunction.Call()
该函数同样有多个重载形式,比较常用的形式有
  1.         void luaFunc.Call();
  2.         void luaFunc.Call<T1>(T1 param);
  3.         void luaFunc.Call<T1, T2>(T1 param1, T2 param2);
复制代码
3.LuaFunction.ToDelegate()
该方法实现了一个委托,使用委托来实现函数调用
  1.         Func<T1, R1> func = luaFunc.ToDelegate<Func<T1, R1>>();
  2.         R1 func(T1 param);
复制代码
4.PCall
LuaFunction.Call()其实就是对PCall方法的封装,自己同样可以实现一个扩展的方法
  1.         LuaFunction luaFunc = new LuaFunction();
  2.         int CallFunc(p1, p2)
  3.         {
  4.         luaFunc.BeginPCall();               
  5.             luaFunc.Push(p1);
  6.             luaFunc.Push(p2);
  7.             luaFunc.PCall();        
  8.             int num = (int)luaFunc.CheckNumber();
  9.             luaFunc.EndPCall();
  10.             return num;
  11.         }
  12.         CallFunc(param1, param2);
复制代码
5.LuaState.Invoke()
可以使用LuaState的对象直接调用方法,常用的形式有,其中beLogMiss为是否打印函数不存在的信息。
  1.         R1 lua.Invoke<R1>(string "tableName.functionName", bool beLogMiss)
  2.         R1 lua.Invoke<T1, R1>(string "tableName.functionName", T1 param, bool beLogMiss)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-21 10:23 , Processed in 0.131399 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表