在导入了xlua或者tolua后,我们能在lua代码里写http://CS.UnityEngine.xxx来调用unity的API。那么这个功能是如何实现的呢?为了解开这个疑惑,我们需要了解lua里面的注册表和引用系统。


注册表(Registry)是一个全局的table,它只能被C代码访问。通常,可以用它来保存那种需要在几个模块中共享的数据。注册表由一个叫LUA_REGISTRYINDEX的索引可以找到。
它在lua的c源码里被定义如下。

它是一个伪索引(Pseudo-Index)。为什么叫伪索引?因为这个索引对应的值不在栈上。而我们平常看见的-1,-2,1,2这些索引的值都在栈上。为了不跟这些正常索引冲突,伪索引被设得很小。


除了注册表之外,lua还提供了一个引用系统,方便我们往注册表里注册值和取值。 先说注册:

int luaL_ref (lua_State *L, int t)

L传入luaState的指针,t传入LUA_REGISTRYINDEX。这个函数的作用是弹出栈顶的值,并且用一个新分配的整数key把这个值注册到注册表里,然后返回这个整数key。这个key被称为"引用"。

再来看怎么取值:

int lua_rawgeti (lua_State *L, int index, lua_Integer n)

L传入luaState的指针,index传入LUA_REGISTRYINDEX,n传入上一个函数返回的整数key。作用是把注册表里的key对应的值压栈

最后是释放该值:

void luaL_unref (lua_State *L, int t, int ref)

L传入luaState的指针,t传入LUA_REGISTRYINDEX,ref传入luaL_ref返回的整数key。


需要注意的是LUA_REGISTRYINDEX在c端和c#端使用的需要是同一个值 。要么像tolua在c端把lua源码的LUA_REGISTRYINDEX改了,要么像xlua,在c端提供一个api把值传给c#端。这里我参照(照抄)xlua的做法。

LUA_API int jlua_get_registry_index() {return LUA_REGISTRYINDEX;
}

接下来我们在c#端写一个测试案例:

LuaState lua = new LuaState();
LuaIndexes.LUA_REGISTRYINDEX = LuaDLL.jlua_get_registry_index();lua.DoFile( "05" );
//把'foo'这个函数压栈
LuaDLL.lua_getglobal( lua.L, "foo" );
Debug.LogFormat( "StackSize:{0},top type is {1}", LuaDLL.lua_gettop( lua.L ), LuaDLL.lua_type( lua.L, -1 ) );
//存放函数到注册表
int key =  LuaDLL.luaL_ref( lua.L, LuaIndexes.LUA_REGISTRYINDEX );
Debug.LogFormat( "StackSize:{0}", LuaDLL.lua_gettop( lua.L ) );LuaDLL.lua_rawgeti( lua.L, LuaIndexes.LUA_REGISTRYINDEX, key );
Debug.LogFormat( "StackSize:{0},top type is {1}", LuaDLL.lua_gettop( lua.L ), LuaDLL.lua_type( lua.L, -1 ) );
LuaDLL.lua_pcall( lua.L, 0, 0, 0 );
Debug.LogFormat( "StackSize:{0}", LuaDLL.lua_gettop( lua.L ) );LuaDLL.luaL_unref( lua.L, LuaIndexes.LUA_REGISTRYINDEX, key );
lua.Dispose();
lua = null;

其中的05.lua里的代码如下:

function foo()print("helloworld")
end

最终打印的结果如下:


这就是本节全部内容。 github工程 对应的是Examples/05_Registry


关于作者:

  • 水曜日鸡,简称水鸡,ACG宅。曾参与索尼中国之星项目研发,具有2D联网多人动作游戏开发经验。

CSDN博客:https://blog.csdn.net/j756915370
知乎专栏:https://zhuanlan.zhihu.com/c_1241442143220363264
交流学习群:891809847

lua如何打印行号_【Lua与C#交互⑤】Lua中的注册表和引用系统相关推荐

  1. lua如何打印行号_双11购物清单,你打印了吗?9个打印技巧解密Excel打印问题,每一个难题都可以在这里找到答案...

    关注精彩内容,要先点击这里哦~ 双十一要来了, 你的购物清单整理好了吗? 设置打印时有没有缺斤少两? 作为一个办公人员,经常需要打印很多数据表格,但是表格打印可是技术活儿,稍不留神儿,打印效果就会乱七 ...

  2. lua如何打印行号_Lua 字符串处理

    今天项目中遇到一个字符串处理的通用函数,一时不明白胡乱搜索后才发现原来是字符串处理库里面的通用函数,想着该理一遍字符串. 这个库提供了字符串处理的通用函数.例如字符串查找,子串,模式匹配等.当在Lua ...

  3. lua如何打印行号_Lua常用代码

    dolocal a1 = 10local a2 = 10end          -->a1和a2的作用域到此结束 if op == "+" thenr = a + bels ...

  4. lua如何打印行号_LUA教程错误信息和回跟踪(Tracebacks)-34

    虽然你可以使用任何类型的值作为错误信息,通常情况下,我们使用字符串来描述遇到的错误.如果遇到内部错误(比如对一个非table的值使用索引下标访问)Lua将自己产生错误信息,否则Lua使用传递给erro ...

  5. php mysql 单引号_插入MySQL时转义PHP中的单引号

    我有一个困惑的问题,我似乎无法理解... 我有两个SQL语句: 第一个将信息从表单输入数据库. 第二个从上面输入的数据库中获取数据,发送电子邮件,然后记录交易的详细信息 问题是似乎单引号仅在第二个条目 ...

  6. mysql生成类似qq号_【mysql】类似QQ的好友关系表是怎么设计的?

    请问一下类似QQ的好友关系表是怎么设计的? 难道只是简单的id,userId,friendId吗? 回答 其实没有必要把事情想得太复杂了,按照需求慢慢递进就可以了. 这是我做关注功能的表结构,可以参考 ...

  7. 卡巴斯基安全浏览器_卡巴斯基 for windows 全方位安全软件2021注册表清除版

    软件介绍 最近从来不相信木马的Run同学中招了,wup.exe(俗称矿机木马),此款木马真可谓厉害,无敌,用过所有方法都无法清理,百度了所有的道道几乎无用,中了此毒,电脑不会有什么特别异常,不好察觉, ...

  8. html表单居中_如何在IE低版本中兼容HTML5表单属性placeholder属性

    WEB开发数据提交是必不可少的,为了更友好的用户体验,通常需要给输入框一个默认的提示信息.HTML5技术提供了一个表单属性placeholder专门用于输入框默认提示,但是在IE低版本中根本不兼容. ...

  9. 卸载idea2020不干净_强制卸载软件程序、以及清理注册表

    我们经常遇到,软件卸载不了,或者卸载不干净的情况.要手动去强制卸载软件和清理它的注册表信息,比较麻烦.因此很多朋友都喜欢用三百六来强制卸载.但是360有时候也卸载不干净软件.而且三百六本来就不干净.除 ...

  10. 管理员获得所有权_在Windows 7中获得注册表项的所有权

    管理员获得所有权 We have previously written about how to take ownership of files and folders in Windows 7, b ...

最新文章

  1. Java中如何实现Date与String之间的数据类型转换
  2. 使用PHP对数据库输入进行恶意代码清除
  3. 为什么总是在__new __()之后调用__init __()?
  4. ffmpeg图片压缩为视频
  5. kubernetes1.8.4 安装指南 -- 9. calico
  6. integer 负数字符串比较_Integer与int的区别 (== 与 equal)
  7. [html] 移动端布局的自适应如何做?
  8. [css] 有用过scss和sass吗?说说它们之间的区别是什么?
  9. python连接sql数据库_python连接SQL数据库
  10. mysql 数据库之表操作
  11. 自顶向下红黑树java,【CPP】各种各样的树(9)——自顶向下的红黑树
  12. 联想记忆计算机网络,联想记忆网络,associative memory network,音标,读音,翻译,英文例句,英语词典...
  13. jquery 学习笔记(二)
  14. Hero引擎47个各种问题解答
  15. python jsonrpc_jsonrpc使用
  16. 关于腾讯云服务器备案全流程 内容
  17. css3中vw/vh/vmin/vmax的含义与使用方法
  18. 2022年R2移动式压力容器充装特种作业证考试题库及在线模拟考试
  19. 颜色空间 ---HSI
  20. Strategy (策略)模式

热门文章

  1. 电脑右击文件夹无反应
  2. EFM (Explicit Factor Models)显因子模型
  3. 第六节课-(第七节课)训练神经网络-2
  4. weekend110(Hadoop)的 第七天笔记
  5. POJ 2502 Subway dij
  6. matlab按行读文件
  7. 深入Java集合学习系列:SynchronousQueue实现原理
  8. 【转】android 完全退出应用程序
  9. shell 变量自增(转)
  10. ORACLE11G 字符集更改(这里更改为AL32UTF8)