基于ulua 1.25版本,开启C#类型动态注册.

一.  步骤

  1. 注册需要Wrap的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

二.  需要注意的事情

  1. 有些类在Wrap后会导致编译错误,例如File类,因为ulua在Wrap时不支持泛型<T>,一些用到泛型的函数Wrap后会出错,还有其他一些方面会导致Wrap出的类型报错,或者有一些类是经过改造的,不能从原类型Wrap,这时,我们Wrap一次之后,修改Wrap后的文件以满足我们的需要,解决编译报错,然后将该类型从WrapFile中_GT(typeof(XXX))删除,不让ulua在Wrap阶段处理该类型,但是需要修改LuaBinder.cs和Wrap.lua的生成方式,保留该类型的相关代码,以免影响该类型注册到Lua的这一过程.
  2. 有些类比如Image,其继承了Graphic类的color属性,如果Image是属于第1点中提到的Wrap一次的类,那么也必须要对其基类Graphic进行Wrap一次,否则Lua端会找不到Image继承的color属性.
  3. 编译LuaJit – 同一台PC上如果安装了多个版本的VS,可能会出现找不到kernel32库的问题,尝试用各个版本的命令行工具编译.
  4. 编译ulua库时,如果环境变量里有其他MinGW,有可能导致编译失败.需要先将环境变量include,lib,path改为ulua源码编译工具中带的MinGW

共同学习,如有错误,请务必提出.

转载请注明:http://www.cnblogs.com/xixidaguai/p/5556791.html

uLua Unity工作机制的更多相关文章

  1. Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇

    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...

  2. android 6.0 高通平台sensor 工作机制及流程(原创)

    最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...

  3. Java IO工作机制分析

    Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 ...

  4. malloc 函数工作机制(转)

    malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...

  5. springMVC工作机制和框架搭建配置说明

    先说一下springMVC的工作机制 1.springmvc把 所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作. 2.Dispatcher ...

  6. CKPT进程工作机制

    CKPT进程工作示意图 2.CKPT进程工作机制 检查点进程被触发的条件为: a> 当发生日志组切换时: b>  用户提交了事务时(commit): c>  Redo log buf ...

  7. 15 sql base line 工作机制

    <个人Configuration> 正常配置一下, 就OK了, 不用理了, oracle 11g 默认启动 发展: .从Oracle的发展角度来看,估计这种方法是Oracle发展和改进的方 ...

  8. HBase读写路径的工作机制

    出处:http://wuyudong.com/1946.html HBase 写路径工作机制 在HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的.HBase 接到命令后存下变化信息, ...

  9. PHP自动加载__autoload的工作机制

    PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文   服务器君一共花费了 ...

随机推荐

  1. docker配置环境

    debian: curl -sSL https://get.docker.com/ | sh curl -sSL https://get.daocloud.io/docker | sh daoclou ...

  2. html中select标签获取选中value和text

    $("#id").find("option:selected").text(); //获取Select选择的Text$("#id").val ...

  3. C基础--结构体成员初始化方式

    之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下: 转自:http://www.cnblogs.com/Anke ...

  4. SVN Server配置详解 及备份

    SVN简介和工作原理 subversion(简称svn)是近几年崛起的版本管理软件,是cvs的接班人,目前绝大多数开源软件都使用svn作为代码版本管理软件.Subversion支持linux和wind ...

  5. (四)java程序基本组成

    一个基本的java程序一般包括几个部分,分别是程序所在的包名.程序中用到的其他包的路径.程序的类.类中的方法.变量和字面量. package demo; import java.util.Date; ...

  6. 杀死future处理的阻塞线程

    public class Test{ public static void main(String[] args){ ExecutorService pool = Executors.newFixed ...

  7. android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error(Sqlite code 14): Could not open database,(OS error - 13:Permission denied)

    07-24 15:03:14.490 6291-6291/com.tongyan.nanjing.subway E/SQLiteDatabase: Failed to open database '/ ...

  8. 执行sh文件 进行MongoDB的业务逻辑导入

    将从HDFS中的数据转化为Json格式写入文件后,十个文件的文件名为 文件名_01 ...._02 ....03格式. 编写个简单的sh文件 通过for do循环让i+1 文件名对应上就可以的- -执 ...

  9. IGS_学习笔记10_IREP监控SOA Integration和日志设定(案例)

    20150506 Created By BaoXinjian

  10. AP_AP系列 - 费用报表分析(案例)

    2014-07-08 Created By BaoXinjian