网上有许多的LUA与Unity插件,如toLua,uLua, sLua, xLua。 uniLua由于其复杂的集成使用过程,已经被主流所抛弃了。在对各个插件使用过之后,出此系列博客与大家分享一下心得。
前面两篇计划说说toLua的那些事。
toLua自己集成到项目里,下载地址:https://github.com/topameng/tolua
步骤如下:
- 1.复制assets目录到项目里
- 2.复制Unity5.x的Plugins到项目里
集成后的结构是这样的:
然后,开始Examples里面内容的学习:
大概介绍一下各个实例,
- Helloworld,介绍了LuaState的生成,DoString以执行文件,Dispose来销毁。注意销毁前调用了CheckTop,用于检测LUA栈中是否还有未执行的指令。
- ScriptsFromFile, 流程来说,首先生成一个虚拟机,再指定工作路径后,读取LUA文件内容来执行,使用DoFile和Require功能。
- CallLuaFunction,较xLua来说就提供了多种形式了。这里简单说明一下:
- 1.使用比较原始的方式,根据LUA的核心机制,使用pCALL指令将数据放LUA执行栈中,再从栈中取出。
luaFunc.Invoke就是对此的封装
- 2.使用 luaFunc.ToDelegate 直接创建一个函数委托句柄。
- 3. 使用LUA虚拟机对象里的Invoke来实现调用,实现机制基本与1一样
- 1.使用比较原始的方式,根据LUA的核心机制,使用pCALL指令将数据放LUA执行栈中,再从栈中取出。
- AccessingLuaVariables,这里涉及LUA很实用的setmetatable函数,在脚本里首先生成了一个元表,再利用以下几种形式测试:
- 1.使用LUASTATE虚拟机对象来直接取varTable中的内容。分别出了table数据和一个function数据并转为LuaFunction类型后直接可以进行调用。
- 2.取成一个LuaTable对象以访问其成员值,由于定义了metatable,可以使用其创建一个元表的实例来访问,以可以直接获取metatable原型访问数据。
- TestCoroutine,使用LUA的协程,使用于C#的协程类似,使用coroutine.start启动一个函数,coroutine.stop来停止协程函数,其中使用的coroutine.wait,coroutine.step在lua官方文档中可以查阅。
- TestCoroutine2,桥接C#的协程,效率很低,不推荐。
- TestLuaThread, lua的coroutine映射到C#中tolua的封装成luathread对象,resume来控制Lua中线程的运行。
- AccessingArray,传递一个数据给Lua,在Lua做遍历读取
- UseDictionary,字典的封装,这里需要将字典的类反射到Lua中。
- AccessingEnum,枚举的使用,基于C#反射过去的类来操作。
- 11_Delegate,这里实现将LUA中的普通函数转化成C#中可用的Delegate,这样可以实现如C#中按钮绑定某个LUA函数作为事件。
- 12_GameObject,使用Unity内置相关的操作一个gameobject对象,这里不同的插件性能有区分,具网上的一些大佬统计效率,toLua在此方面表现是最好的。
- 13_CustomLoader,自定义的一个LUA加载器,继承LuaClient类后,可以重写StartMain函数,以实现在界面运行时就执行一段Lua脚本。注意,这里使用的OnLoadFinished回调,因此会在awake和start前面,场景一加载进来就调用。
- 14_Out,就是个在LUA中简单使用物理射线的例子。
- 15_ProtoBuffer,使用ProtoBuffer的传输协议来与做为数据载体,此例中在LUA中也做实体进行解析处理。
- 16_Int64,LUA5.3的新特性,默认是double处理数据,使用Int64可处理78962871035984074- 9223372036854775807范围的数据,此例使用lua的int64来处理。
- 17_Inherit,使用LUA的.Extend 的形式扩展LUA对象操作。
- 18_Bundle,使用WWW加载作为Assetbundle的lua文件。
- 19_cjson,CJSON插件的使用。
- 20_utf8,UTF8编码支持。
- 21_String,LUA桥接C#字符串的操作。当然这里全用LUA自己的字符串也是可以的。
- 22_Reflection,LUA中桥接C#的反射机制。
- 23_List,LUA桥接C#的数组容器。
- 24_Struct,关于C#中结构体如何桥接到LUA的示例。
- Performance,测试一些常用操作的消耗。
- TestErrorStack,TestOverload,操作栈测试