当前位置: 首页 > news >正文

lua与c#交互篇

C#与Lua交互过程:

C# Call Lua :由C#文件先调用Lua解析器底层dll库(由C语言编写),再由dll文件执行相应的Lua文件;

Lua Call C# :

Wrap方式:首先生成C#源文件所对应的Wrap文件,由Lua文件调用Wrap文件,再由Wrap文件调用C#文件;

C# Call Lua:C#把请求或数据放在栈顶,然后lua从栈顶取出该数据,在lua中做出相应处理(查询,改变),然后把处理结果放回栈顶,最后C#再从栈顶取出lua处理完的数据,完成交互。

lua与c#交互篇

1.从致命的gameobj.transform.position = pos开始说起

像gameobj.transform.position = pos这样的写法,在unity中是再常见不过的事情,但是在ulua中,大量使用这种写法是非常糟糕的。为什么呢?

因为短短一行代码,却发生了非常非常多的事情,为了更直观一点,我们把这行代码调用过的关键luaapi以及ulua相关的关键步骤列出来(以ulua+cstolua导出为准,gameobj是GameObject类型,pos是Vector3):

第一步:
GameObjectWrap.get_transform lua想从gameobj拿到transform,对应gameobj.transform
LuaDLL.luanet_rawnetobj 把lua中的gameobj变成c#可以辨认的id
ObjectTranslator.TryGetValue 用这个id,从ObjectTranslator中获取c#的gameobject对象
gameobject.transform 准备这么多,这里终于真正执行c#获取gameobject.transform了
ObjectTranslator.AddObject 给transform分配一个id,这个id会在lua中用来代表这个transform,transform要保存到ObjectTranslator供未来查找
LuaDLL.luanet_newudata 在lua分配一个userdata,把id存进去,用来表示即将返回给lua的transform
LuaDLL.lua_setmetatable 给这个userdata附上metatable,让你可以transform.position这样使用它
LuaDLL.lua_pushvalue 返回transform,后面做些收尾
LuaDLL.lua_rawseti
LuaDLL.lua_remove

第二步:
TransformWrap.set_position lua想把pos设置到transform.position
LuaDLL.luanet_rawnetobj 把lua中的transform变成c#可以辨认的id
ObjectTranslator.TryGetValue 用这个id,从ObjectTranslator中获取c#的transform对象
LuaDLL.tolua_getfloat3 从lua中拿到Vector3的3个float值返回给c#
lua_getfield + lua_tonumber 3次 拿xyz的值,退栈
lua_pop
transform.position = new Vector3(x,y,z)准备了这么多,终于执行transform.position = pos赋值了
就这么一行代码,竟然做了这么一大堆的事情!

C#与Lua交互过程及原理

Unity+Lua性能优化(Lua和C#交互篇)

相关文章:

  • 企业网站模板 演示/黄页网络的推广网站有哪些类型
  • 用html5做的个人网站/精准客户软件
  • 品牌型网站建设/搜索引擎广告形式有哪些
  • 商城网站建设报价表/合肥seo网络优化公司
  • 软件开发需要多久/信息流优化师简历
  • 山东网站建设价格实惠/西安seo顾问
  • B+树详解,一次就懂
  • R语言ggplot2可视化:错误条(error bar)在图形上是水平的、但是在图例中是垂直的、使用ggstance包纠正过来(图例图标也是水平的)
  • 【LeetCode】2011. 执行操作后的变量值
  • python基础(14):模块
  • Mac使用CMake编译stasm
  • Docker容器中安装Jenkins
  • 第5章 管理端(Vue)布局面的重构与路由的全局存储
  • 斩获数亿元B轮融资,这家Tier 1抢跑「L2/L2+」主战场
  • 【C++】类和对象(C++门槛)
  • 2023北京福祉展,残疾人用品展,中国国际康复博览会
  • 怎么给视频加水印?
  • FineReport企业数据图表-JS实现参数控件赋值