uLua/cstolua使用基础

请配合视频一起学习:http://pan.baidu.com/s/1gd8fG4N

关于uLua/cstolua使用基础这个概念,我觉得更多的是从一个初学者拿到插件会怎么样用,作为出发点了吧,这部分已经有相应的视频介绍了,这里补一个文字的版本,视频的使用的ulua版本是1.16,现在最新的是1.21,从1.20以后的动态wrap功能,有些使用方式稍有不同,即:需要使用者生成wrap的同时,还要在System/Wrap.lua里面import相应的类,才能正常工作。原因在另一篇帖子里面:bbs.ulua.org/article/ulua/ulua1_20_1_21.html 

视频下载地址:http://pan.baidu.com/s/1gd8fG4N
 
我先介绍清楚uLua现在的产品线吧。
 
(01)ulua_v1.03.unitypackage:老外在Unity商店最后的一个版本,停止更新了。适用于Unity4.6.1及其老版本(反射模式)。
(02)ulua_v1.03_with_iOS64_x86.unitypackage :社群发布在1.03基础上支持iOS64跟intel x86平台的版本(反射模式)。适用于Unity4.6.2及到Unity5最新版。
(03)ulua_v1.08.unitypackage:从这个版本开始已经集成了蒙哥的cstolua去反射模式,效率开始提升,开始支持第三方库。
(04)ulua_v1.10.unitypackage:升级版。
(05)ulua_v1.12.unitypackage:升级版。
(06)ulua_v1.14.unitypackage:升级版。
(07)ulua_v1.16.unitypackage:升级版。
(08)ulua_v1.18.unitypackage:升级版。
(09)ulua_v1.20.unitypackage:从这一版本开始支持动态加载Wrap功能,使用者开始注意。
(10)ulua_v1.21.unitypackage:最新修正版本。
 
<A>SimpleFramework_NGUI版本:适用于Unity4.6.2-最新Unity5.x版本。
<B>SimpleFramework_UGUI版本:适用于Unity5.x.x,因为使用了自带 U5的新版AssetBundle功能。
 
最新的uLua_v1.21版本的目录结构,已经精简到极致了,只有两个文件夹。所以如果你不需要用框架,可以用插件版本。
(顺便说下uLua插件版本怎么来的,每一次代码升级都是先从框架开始升级,然后测试完成后,开始从框架中抽取最精简的代码,导出成了uLua插件版本)

图片点击可在新窗口打开查看此主题相关图片如下:qq图片20150809175935.png
图片点击可在新窗口打开查看
 
如果我是个新用户的话,我拿到一个插件,首先到处找这个插件的Demo或者Examples,因为你只有找到这两个中的一个,才能知道插件能做什么,根据里面的代码等信息,知道该怎么用,才能模仿着用起来,那拿到上面的插件,导入到Unity里面以后,只有2个目录,第一个Plugins下面是底层库文件,没什么好看的,主要还是看uLua目录下面有哪些,如果不知道这些目录是做什么的,其实可以参考SimpleFramework基础支持帖子,对照一下,(地址:bbs.ulua.org/article/ngui/simpleframework_base1.html)插件版只是更加规整,比如Lua目录移动到了uLua目录下面,
 
果然,下面有我们需要的Examples文件夹。这个目录下面提供了10多个例子,都是最简化的,可能从开发的各个角度都有演示,我们捡着重点说几个。
 
01_HelloWorld:这个是ulua老外版本的时候就带的,所以没什么改动,

图片点击可在新窗口打开查看此主题相关图片如下:0.png
图片点击可在新窗口打开查看
 
这种用法在ulua1.03、1.03_ios64优化版里面适用,在新版里面不建议直接用LuaState,已经被蒙哥的LuaScriptMgr管理器取代,因为它里面做了大量的优化手段,所以在新版里面直接使用LuaState会玩不转。
 
-------------------------------------------------------------------------------------------------------------------------------------
02_CreateGameObject:这个例子里面,蒙哥提供了2中模式,反射(效率低)与去反射模式(效率高)。

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看
上图中import_type都是反射模式,它的区别可以参考帖子:blog.ulua.org/article/faq/shenmeshifansheyuqufanshequbieshishenme.html
 
图片点击可在新窗口打开查看
上图里面开始出现LuaScriptMgr类的使用,它跟前面使用Luastate没啥区别,也是new出一个实例即可,唯一需要做的是还需要调用一些Start函数,这个函数其实就是将生成的Wrap文件注册进lua虚拟机里面。
 
--------------------------------------------------------------------------------------------------------
03_AccessingLuaVariables:这里面也是提供了2种模式(反射、去反射)的C#如何访问Lua中的变量。

图片点击可在新窗口打开查看此主题相关图片如下:3.png
图片点击可在新窗口打开查看
这是反射模式的直接设置Luastate中的变量Objs2Spawn即可。当DoString的时候,lua代码就可以访问已经设置进去的变量Objs2Spawn。
 

图片点击可在新窗口打开查看此主题相关图片如下:4.png
图片点击可在新窗口打开查看
在去反射模式中,也是相应的操作,只是luastate,需要从LuaScriptMgr中引用出来即可。
 
--------------------------------------------------------------------------------------------------------
04_ScriptsFromFile:这个例子教大家怎么从一个文件加载lua代码,相对于前面都是从字符串里面加载lua代码。

图片点击可在新窗口打开查看此主题相关图片如下:5.png
图片点击可在新窗口打开查看
上面的代码是从一个TextAsset,也就是一个文本文件中读取lua代码到lua中。效果与前面从string变量中读取进lua虚拟机中,效果相同。


图片点击可在新窗口打开查看此主题相关图片如下:6.png
图片点击可在新窗口打开查看
这个就是变换成从.lua文件中读取lua代码了,他使用的函数与上面相同都是dofile,而不再是dostring。

--------------------------------------------------------------------------------------------------------
05_CallLuaFunction:这个例子开始教大家怎么调用lua的函数faunction。


图片点击可在新窗口打开查看此主题相关图片如下:7.png
图片点击可在新窗口打开查看
 
在lua代码中定义了函数luaFunc,有个参数message,通过LuaFunction f = l.GetFunction("luaFunc");获取到这个函数,然后object[] r = f.Call("I called a lua function!");开始调用,并且lua返回多值,在c#这边就是个object[]数组形式,然后打印出第一个参数就是lua函数的返回值了。


图片点击可在新窗口打开查看此主题相关图片如下:8.png
图片点击可在新窗口打开查看
换成使用LuaScriptMgr来进行函数调用,也相应的非常简单。就不再重复了。
 
--------------------------------------------------------------------------------------------------------
06_LuaCoroutines:Lua的协程不同于 Unity的协程,具体区别请百度,不废话。


图片点击可在新窗口打开查看此主题相关图片如下:9.png
图片点击可在新窗口打开查看
通过调用lua.GetLuaFunction("myFunc");获取lua函数,并且调用启动lua的协同,循环打印出相应的值。

--------------------------------------------------------------------------------------------------------
07_AccessingArray:这个函数是很多人都在找的,其实就在自带例子中,lua与c#怎么传递数组。

图片点击可在新窗口打开查看此主题相关图片如下:10.png
图片点击可在新窗口打开查看
这个例子需要注意的是f.Call((object)objs); 把数组转换成object,为了防止把数组当作多参数传递。
 
--------------------------------------------------------------------------------------------------------
08_ProtoBuffer:这个例子演示了lua怎么用Protobuf。

图片点击可在新窗口打开查看此主题相关图片如下:11.jpg
图片点击可在新窗口打开查看
这个例子可当做3个操作,第一个加载通过protobuf-lua-gen编译出来的lua pb文件,并且调用lua的encoder编码函数,
local pb_data = msg:SerializeToString() 生成的(pb_data)实际上是一个c语言的char*结果值。
这个值传递给c#可以用LuaStringBuffer类实例接收,里面的buffer变量就是一个c#的byte[]。这样就可以通过socket
发送给服务器端。反过来从服务器端接收到的byte[],通过创建一个LuaStringBuffer(byte[])并且传递给Lua,然后再调用
lua的msg:ParseFromString(TestProtol.data)将protobuf的结构反序列化成lua的table,完成解码操作。

--------------------------------------------------------------------------------------------------------
09_Delegate:这个例子演示了lua怎么使用c#中的委托。

图片点击可在新窗口打开查看此主题相关图片如下:12a.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:12b.png
图片点击可在新窗口打开查看

lua通过c#类实现在lua中通过
+-来实现添加、移除监听操作。实际上lua的function本身可以作为变量
来回传递给c#,更加方便。
 
--------------------------------------------------------------------------------------------------------
10_TestOverride:这个例子演示了lua中怎么重载c#中的类。

图片点击可在新窗口打开查看此主题相关图片如下:13.png
图片点击可在新窗口打开查看

--------------------------------------------------------------------------------------------------------
A1_LuaArray:这是我提供的Lua与C#共享数组的例子。

图片点击可在新窗口打开查看此主题相关图片如下:14.png
图片点击可在新窗口打开查看
这个是我提供的lua传递数组给c#,反过来
c#也传递数组给lua的例子。代码很简单了。
 
--------------------------------------------------------------------------------------------------------
A2_LuaEnum:lua怎么使用c#中的枚举的例子。

图片点击可在新窗口打开查看此主题相关图片如下:15.png
图片点击可在新窗口打开查看
枚举定义在
LuaEnumType文件里面,这个文件需要添加到Wrap列表,并且在Wrap.lua里面import。

--------------------------------------------------------------------------------------------------------
A3_LuaClass:lua如何使用类的概念例子。

图片点击可在新窗口打开查看此主题相关图片如下:16a.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:16b.png
图片点击可在新窗口打开查看
这个例子演示了lua怎么创建类,类继承,实例化,并且调用类实例等操作。

==============================================================================
到此为止,ulua自带例子基本上都过了一遍,大家对ulua的使用应该有了初步的认识,上面所说的去反射的步骤,还需要大体的介绍下步骤。
(1)创建一个自定义的类,比如视频中的Demo类,里面添加了1个静态方法Add。

(2)打开uLua/Editor/BindLua.cs文件,找到类似_GT(type)列表,添加_GT(Demo)条目。

(3)通过单击菜单Lua/Gen Lua Wrap Files,生成LuaWrap文件,所在位置在uLua/Source/LuaWrap/DemoWrap.cs

 



[本日志由 admin 于 2015-09-15 06:58 PM 更新]
上一篇: 这是最早的一篇日志
下一篇: SimpleFramework NGUI/UGUI基础知识[1]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 3 | 引用: 0 | 查看次数: -
F2N7ln[2016-07-06 11:50 AM | | Mail To:195467279@qq.com | 113.27.98.163 | del | 回复回复]
宝妈吧,加微信helen10888,备注进“宝妈吧”
卡西欧手表[2016-05-19 02:59 PM | 访问 http://www.casiostore.com.cn/ | | 116.21.90.210 | del | 回复回复]
不错,支持一个,文章写的很溜
fananchong[2016-05-13 11:29 AM | | Mail To:184435769@qq.com | 101.81.98.175 | del | 回复回复]
例子03_AccessingLuaVariables,AccessingLuaVariables02.cs中 我把第8行、30行 注释掉,  程序运行正常。求 第7行注释是什么意思?
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭