下面咱们开始今天的Unity3D技能培训。 咱们学习Unity3D培训目标:让U3D初学者能够更快速的掌握U3D技术,自行制做修改素材,能够独立完成2D、3D小规模游戏及网页游戏开发。git
好了,下面咱们就来一块儿学习在Unity3D项目中如何使用Lua语言吧,Unity3D基于Mono虚拟机,因此理论上.NET的类库是能够直接在Unity3D中使用的。但是考虑到Unity3D跨平台的须要,咱们选择的工具必须在各个平台得到良好的支持。在前文中提到的LuaInterface理论上是能够在Unity3D中使用的,但是因为IOS不支持反射机制,因此这个类库咱们没法直接在Unity3D中使用的。。好了,咱们,如今来建立一个简单地Unity项目:github
第一步是下载UniLua:http://github.com/xebecnan/UniLua。将UniLua引用到项目中有两种方法,一种是将该项目中的UniLua编译成dll而后在Unity项目中使用,一种是将该项目中的UniLua直接复制到Unity 项目中,咱们这里使用第二种方法,由于博主比较懒,呵呵。将UniLua的命名空间添加到咱们项目中,咱们就能够开始动手写程序了。不过这里,博主想说的是Mono可能会致使的一个错误,估计是阿楠在写这个项目的时候使用了.NET4.0以上的版本,而在.NET4.0以上的版本是支持默认参数的构造函数的。但是因为Mono默认使用的是.NET3.5,因此在编译项目的时候就会报错,咱们能够经过Project->Assembly-CSharp->Build->General将.NET的目标框架设为4.0,这样就能够解决这个问题了。好了,下面咱们开始写代码啦,首先建立一个InvokeScript.cs的脚本:数组
在这段脚本中,咱们首先初始化了Lua环境,这一点和咱们在C++中使用Lua是同样的,由于UniLua在设计API的时候在命名上和LuaAPI保持了高度的一致,若是你对Lua API足够熟悉的话,那么如今这一切对你而言应该会很简单的。接下来,咱们经过Require的形式引入了咱们编写的一个C#库,它是一个静态库,目的是封装C#方法以便于Lua脚原本调用,这一部分咱们稍后会讲到。接下来,咱们经过Unity的AssetText加载了一个Lua脚本文件,该脚本的文件的扩展名是.txt,由于咱们只须要Lua脚本的内容。在脚本中咱们定义了两个方法InvokeLua和InvokeSharp来分别调用Lua脚本和C#脚本。好了,接下来,咱们重点来说Lua调用C#脚本的这部分,由于UniLua在调用函数这块儿和LuaInterface不太同样,因此咱们不能再用原来的先注册C#方法而后再像Lua脚本方法同样,不过这里的原理是同样的,不过UniLua提供了更好的方法绑定机制,咱们来看下面的脚本:框架
你们必定注意到这里有个NameFuncPair类吧,这就是在UniLua中用来将一个C#方法和Lua方法进行绑定的方法,咱们首先构造这样一个NameFuncPair数组,而后将其加入到lua_L_NewLib()的参数中,这样至关因而注册了一个库,我以为应该就是注册了一个方法集合吧.而CLASSNAME是一个表示当前类名称的常量,能够取任意字符,这里咱们使用该类的文件名咱们将在Lua脚本是用这个值来查找当前类.接下来,咱们能够看到博主构造了一个求和差的C#方法,这个方法和Lua API中定义的方法是一致的,即咱们须要指定该方法会返回的值得数目.若是咱们须要返回一个值,就要把它经过push系列的方法压入栈中.这里咱们返回了四个值,你们必定会问好是C#还支持返回多个值啊,其实呢,这是Lua语言提供给咱们的一个福利啊,好比咱们须要返回一个物体在3D世界里的坐标,一般状况下,咱们须要用三个赋值语句才能获取吧,但是你用Lua的话,一行代码就能够搞定啦.好,如今咱们回到InvokeScript脚本的Start方法中,你们能够注意到这里有一个L_RequireF()的方法,前面只是轻描淡写地说它引入了一个库,那么如今咱们看看它具体作了什么吧,第一个参数表示这个类的名字,指向咱们定义好的CLASSNAME,第二个参数是这个类的初始化方法指向InitLib()方法,第三个参数是是否要在全局空间中使用这个库,这里咱们选在false.好了,这样,咱们就完成了C#脚本的编写.好了,下面咱们在项目中建立一个纯文本文件,咱们输入以下代码:函数
第一行代码一样是一个require的方法,这是Lua脚本中引用一个库的方法,该方法能够引用Lua的标准库,一样能够引用咱们定义的外部库,你们注意到这里的名字和咱们以前定义的CLASSNAME是同样的,由于咱们就是经过这个名字来查询这个库的,咱们在Lua环境中注册了这个库,因此如今才能够引用这个库.在这段脚本中咱们定义了几个字符型的变量,两个Lua方法,一个用Lua包装的C#方法.好了,如今咱们将这个文本文件指定到InvokeScript的LuaFile字段,咱们经过LuaFille的text获取脚本内容,而后经过DoString()方法来执行脚本中的内容,注意这里要先对C#库进行注册,而后再执行脚本中的内容,不然会出现错误.好了,最后,咱们来一块儿看看运行效果吧:工具
你们能够看到C#调用的Lua脚本中咱们获取了脚本中的两个变量arg一、arg2,调用了Lua中定义的两个方法,而最后一个方法,如咱们所愿,它返回了四个值,这正是咱们所但愿的结果.这里顺便说一下啊,在Lua中的print方法和return在Call之后是能够直接在Debug中输出结果的,无需咱们再去作Log。更多精彩unity3d技术文章请点击 http://www.gopedu.com/article学习