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

原文地址:http://bbs.ulua.org/article/ulua/ulua_cstolua.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值