请配合视频一起学习: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现在的产品线吧。
(02)
ulua_v1.03_with_iOS64_x86.unitypackage
:社群发布在1.03基础上支持iOS64跟intel x86平台的版本(反射模式)。适用于Unity4.6.2及到Unity5最新版。
<A>SimpleFramework_NGUI版本:适用于Unity4.6.2-最新Unity5.x版本。
<B>SimpleFramework_UGUI版本:适用于Unity5.x.x,因为使用了自带 U5的新版AssetBundle功能。
最新的uLua_v1.21版本的目录结构,已经精简到极致了,只有两个文件夹。所以如果你不需要用框架,可以用插件版本。
(顺便说下uLua插件版本怎么来的,每一次代码升级都是先从框架开始升级,然后测试完成后,开始从框架中抽取最精简的代码,导出成了uLua插件版本)

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

这种用法在ulua1.03、1.03_ios64优化版里面适用,在新版里面不建议直接用LuaState,已经被蒙哥的LuaScriptMgr管理器取代,因为它里面做了大量的优化手段,所以在新版里面直接使用LuaState会玩不转。
-------------------------------------------------------------------------------------------------------------------------------------
02_CreateGameObject:这个例子里面,蒙哥提供了2中模式,反射(效率低)与去反射模式(效率高)。

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

这是反射模式的直接设置Luastate中的变量Objs2Spawn即可。当DoString的时候,lua代码就可以访问已经设置进去的变量Objs2Spawn。

在去反射模式中,也是相应的操作,只是luastate,需要从LuaScriptMgr中引用出来即可。
--------------------------------------------------------------------------------------------------------
04_ScriptsFromFile:这个例子教大家怎么从一个文件加载lua代码,相对于前面都是从字符串里面加载lua代码。

上面的代码是从一个TextAsset,也就是一个文本文件中读取lua代码到lua中。效果与前面从string变量中读取进lua虚拟机中,效果相同。

这个就是变换成从.lua文件中读取lua代码了,他使用的函数与上面相同都是dofile,而不再是dostring。
--------------------------------------------------------------------------------------------------------
05_CallLuaFunction:这个例子开始教大家怎么调用lua的函数faunction。

在lua代码中定义了函数luaFunc,有个参数message,通过LuaFunction f = l.GetFunction("luaFunc");获取到这个函数,然后object[] r = f.Call("I called a lua function!");开始调用,并且lua返回多值,在c#这边就是个object[]数组形式,然后打印出第一个参数就是lua函数的返回值了。

换成使用LuaScriptMgr来进行函数调用,也相应的非常简单。就不再重复了。
--------------------------------------------------------------------------------------------------------
06_LuaCoroutines:Lua的协程不同于 Unity的协程,具体区别请百度,不废话。

通过调用lua.GetLuaFunction("myFunc");获取lua函数,并且调用启动lua的协同,循环打印出相应的值。
--------------------------------------------------------------------------------------------------------
07_AccessingArray:这个函数是很多人都在找的,其实就在自带例子中,lua与c#怎么传递数组。

这个例子需要注意的是f.Call((object)objs); 把数组转换成object,为了防止把数组当作多参数传递。
--------------------------------------------------------------------------------------------------------
08_ProtoBuffer:这个例子演示了lua怎么用Protobuf。

这个例子可当做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#中的委托。


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

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

这个是我提供的lua传递数组给c#,反过来c#也传递数组给lua的例子。代码很简单了。
--------------------------------------------------------------------------------------------------------
A2_LuaEnum:lua怎么使用c#中的枚举的例子。

枚举定义在LuaEnumType文件里面,这个文件需要添加到Wrap列表,并且在Wrap.lua里面import。
--------------------------------------------------------------------------------------------------------
A3_LuaClass:lua如何使用类的概念例子。


这个例子演示了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