uLua Unity工作机制

基于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

时间: 2024-09-30 19:11:09

uLua Unity工作机制的相关文章

Binder的工作机制浅析

在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. 一.在Android Studio中建立AIDL 首先,我们需要建立一个AIDL 1.在建立了对应的实现Parcelable接口的实体类和AIDL接口后,文件结构如下: 2.点击clean Project/reBuild Project,出现如下错误:提示无法找到Book实体类. 3.解决方案 这

重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?虚拟机执行引擎的工作机制

Class文件二进制字符流通过类加载器和虚拟机加载到内存(方法区)完成在内存上的布局和初始化后,虚拟机字节码执行引擎就可以执行相关代码实现程序所定义的功能.虚拟机执行引擎执行的对象是方法(均特指非本地方法),方法是 着一个程序所定义的一个功能的载体,实现预定的业务功能或者特定的功能等. Java虚拟机内存内针对方法的执行专门划分了一个区域即虚拟机栈.虚拟机栈内通过栈帧结构来存储调用方法和执行方法需要的局部变量,操作数栈.方法返回值等,通过栈帧的出入栈来表示方法的执行顺序. 1.栈帧结构:虚拟机内

Java IO工作机制分析

Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 Reader 基于磁盘操作的 I/O 接口:File 基于网络操作的 I/O 接口:Socket 1 IO类库的基本结构 1.1 基于字节操作的IO接口 基于字节操作的IO接口分别是InputStream和OutputStream,InputStream的类结构图如下所示: 同InputStream

深入分析 Java I/O 的工作机制

I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈.本文的目的正是分析 I/O 的内在工作机制,你将了解到:Java 的 I/O 类库的基本架构:磁盘 I/O 工作机制:网络 I/O 的工作机制:其中以网络 I/O 为重点介绍 Java Socket 的工作方式:你还将了解到 NIO 的工作方式,还有同步和异步以及阻塞与非阻塞的区别,最

深入struts2(三)---工作机制和运行流程图

1     工作原理 1.1     体系架构 图2.1 struts2.0体系架构图 1.2     工作机制 针对上节体系架构图,以下分步说明运行流程 ?  client初始化一个指向Servlet容器(比如Tomcat)的请求: ?  这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其它框架的集成非常有帮助,比如:SiteMesh Plugin): 注:从struts2.1.3后就不须要配

BrnShop开源网上商城第三讲:插件的工作机制

这几天BrnShop的开发工作比较多,所以这一篇文章来的晚了一些,还请大家见谅呀!还有通知大家一下BrnShop1.0.312版本已经发布,此版本添加了报表统计等新功能,需要源码的园友可以点此下载.好了,我们现在进入今天的正题.关于BrnShop插件内容比较多,所以我分成两篇文章来讲解,今天先讲第一部分内容:插件的工作机制. 对于任意一种插件机制来说,基本上只要解决以下三个方面的问题,这个插件机制就算成功了.这三个方面如下: 插件程序集的加载 视图文件的路径和编译 插件的部署 首先是插件程序集的

Web的工作机制

简要的介绍一下Web的工作机制,以便对开发JavaWeb项目有个更好的理解. 一.Web的概念     1.1    何为Web:Web是万维网(World Wide Web)的简称.Web出现以前,用户查询信息时,需要记住信息的详细地址和各种网络命令.有了万维网,就可以利用链接从Internet的一个站点方便的访问另一个站点,我们今天将这种行为称为"浏览".   1.2   Web的核心标准:URL.HTTP.HTML URL统一资源定位符:URL为描述网页和其他资源地址提供了一种标

Java I/O的工作机制2

Java Socket的工作机制 Socket是描述计算机之间完成相互通信的一种抽象功能.Socket有很多种,大部分情况下我们使用的都是基于TCP/IP的流套接字,它是一种稳定的通信协议. 主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须由底层TCP/IP来建立TCP连接.建立TCP连接需要底层IP来寻址网络中的主机.网络层使用的IP可以帮助我们根据IP地址来找到目标主机,然后再通过TCP或UDP的地址也就是端口号来指定.这样就可以通过一个S

深入分析 Java I/O 的工作机制(转载)

声明:本文转自 http://www.ibm.com/developerworks/cn/java/j-lo-javaio/ I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈.本文的目的正是分析 I/O 的内在工作机制,你将了解到:Java 的 I/O 类库的基本架构:磁盘 I/O 工作机制:网络 I/O 的工作机制:其中以网络 I/