标签:
基于ulua 1.25版本,开启C#类型动态注册.
一. 步骤
在WrapFile.cs类中,使用_GT(typeof(XXX)), 注册需要Wrap的C#类型
注册的C#类型被包装成BindType对象,在BindType构造函数里获取注册类型的类名,注册给Lua的名称,基类名称,Wrap的文件名称等信息,并保存在相应的BindType对象中.(这些是在WrapFile类创建时就生成的)
2. 执行编辑器脚本,生成Wrap的C#类, LuaBinder类,以及Wrap.lua文件.
执行编辑器脚本SimulatorRunScript,调用LuaBinding里的相关接口,LuaBinding里遍历WrapFile中注册的需要Wrap的C#类型,根据BindType里的信息,自动生成cs代码文件,并且生成LuaBinder类和Wrap.lua文件.
3.以上是运行前的准备工作.点击运行按钮,运行项目
4.项目首先初始化LuaScriptMgr.cs类,该类初始化后会执行Global.lua代码.
Global.lua首先require Wrap.lua文件,执行Wrap.lua文件中的代码.
Wrap.lua是2步骤里生成的,其内容是import各种C#类型到Lua,由于ulua支持动态注册C#类型.该类默认状态下是import了所有的C#类型到Lua,可以根据性能需要,修改Wrap.lua的生成方式,减少其中不需要立刻import的类型,改为在首次使用时import.提高启动效率.
通过import ‘XXX’ 可以把XXX类型注册到Lua,其原理是在Lua.cs脚本里将import这一字段注册到Lua的全局表中,并且将import绑定到C#中的LuaStatic.importWrap函数,因此Lua端执行import ‘XXX’之后,调用了C#的LuaStatic.importWrap函数,该函数从Lua栈中取出栈顶的XXX类型名,并调用了LuaBinder的Bind函数
LuaBinder也是在第2步中生成的类,其作用是注册1步骤Wrap的类型到Lua,该类Bind函数,接收一个类型名,然后Switch该类型,得到该类型Wrap后的类,并调用Wrap类中的Register函数,将该类型的相关方法注册到Lua,以供Lua端调用.
各Wrap类的Register函数通过调用LuaScriptMgr.RegisterLib函数,注册到Lua,在RegisterLib函数里,为该类型的namespace的各级创建相应table并注册到Lua端,以免类型的namespace在Lua端无法找到.例如System.IO.File会创建System,IO的table,以及File类型的table
二. 需要注意的事情
共同学习,如有错误,请务必提出.
转载请注明:http://www.cnblogs.com/xixidaguai/p/5556791.html
标签:
原文地址:http://www.cnblogs.com/xixidaguai/p/5556791.html