ulua中lua代码使用反射调用c#详解

1、官方解释
ulua中lua代码使用反射调用c#详解_第1张图片
2、代码层分析
2.1 官方脚本
ulua中lua代码使用反射调用c#详解_第2张图片
2.2 语句 luanet.load_assembly(‘UnityEngine’)解析

LuaState lua = new LuaState();

LuaState构造函数-实例化ObjectTranslator
ulua中lua代码使用反射调用c#详解_第3张图片
ObjectTranslator 构造函数-将loadAssembly函数注册到lua中并命名为load_assembly
ulua中lua代码使用反射调用c#详解_第4张图片
loadAssembly函数的实现-取得参数(assemb名称)-获取assemb-装入translator集合中
ulua中lua代码使用反射调用c#详解_第5张图片
所以 luanet.load_assembly(‘UnityEngine’)就是调用的上面c#中的loadAssembly函数取得UnityEngine集合
2.3 luanet.import_type(‘UnityEngine.GameObject’) 解析
通过2.2可以找到luanet.import_type是在调用c#中的importType函数
ulua中lua代码使用反射调用c#详解_第6张图片
importType函数实现-从translator集合中找到该类-将该类返回到lua,注意return 1是指返回了一个值,并不是返回1
ulua中lua代码使用反射调用c#详解_第7张图片
2.3.1translator集合返回查找类到lua详解-上面提到return 1并不是返回1而是指返回了一个值也就是返回的查找类(涉及到c#与lua交互栈)
ulua中lua代码使用反射调用c#详解_第8张图片
将查找到的type,push到交互栈上面
ulua中lua代码使用反射调用c#详解_第9张图片
简单封装-指定查找类型为class
ulua中lua代码使用反射调用c#详解_第10张图片
如果前面查找过该类就会缓存起来方便下次使用-缓存实现在addObject(o, beValueType)中实现,addObject(o, beValueType)也会把交互栈的顶层位置返回出来方便将该类push到交互栈
ulua中lua代码使用反射调用c#详解_第11张图片
计算位置并缓存
ulua中lua代码使用反射调用c#详解_第12张图片
主要push并弹出的算法

 LuaDLL.luanet_newudata(luaState, index);//新建一个userdata
LuaDLL.luaL_getmetatable(luaState, metatable);//将luaNet_class表弹到栈顶也就是-1的位置,此时新创建的userdata在luaNet_class下面也就是-2的位置
LuaDLL.lua_setmetatable(luaState, -2);//用新创建的userdata创建元表给luaState,由于没有看到lua的源码,有点不确定
LuaDLL.lua_pushvalue(luaState, -1);//将luaNet_class复制一份弹到栈顶
LuaDLL.lua_rawseti(luaState, -3, index);//将新创建的userdata弹出返回到lua

你可能感兴趣的:(Lua)