当前位置:首页 > 感悟生活

ULUA的简洁用法

webgou10年前 (2017-02-22)感悟生活445

 《ULUA的简洁用法》 

作者: 游蓝海 
文章链接:http://blog.csdn.net/you_lan_hai/article/details/51059510 
转载请注明出处

ULUA(http://www.ulua.org/index.html)所推荐的几种framework虽然功能强大,但是结构比较复杂,对于unity初学者来说太过麻烦和冗余。因此我自己总结了一套很简洁的用法,抛开MVC和各种框架,直接使用tolua(https://github.com/topameng/tolua)实现Unity和LUA的交互。 
本文介绍的所以代码,我已经上传到了GitHub,链接见文章末尾。下面介绍实现的详细步骤。

1.原理

给GameObject添加上一个C#脚本组件作为中间层,在中间层上绑定上一个LUA脚本,将Unity的所有回调接口通过中间层传递到LUA。同时,LUA脚本也可以通过中间层操作GameObject。

2.准备

  1. 获取tolua:https://github.com/topameng/tolua。 
    tolua是一个工具,将Unity的C#代码包装之后导出给LUA,同时提供了一些访问LUA的接口,使得Unity和LUA可以相互调用。
  2. 简单起见,直接用Unity编辑器打开tolua工程。 
    本文使用的tolua版本是1.0.4,Unity版本是5.2.2。

3.添加C#中间层

新建C#脚本,命名为LuaBehaviourScript.cs。下面是文件的核心内容(无关紧要的代码已经删除,可在文章末尾链接中获得完整代码):

public class LuaBehaviourScript : MonoBehaviour {     //记录LUA模块名称     public string           ScriptName;     //记录LUA脚本对象     protected LuaTable      self_;      protected void Awake()     {         //require lua文件,得到返回的LUA类         LuaTable metatable = (LuaTable)LuaMainInstance.Instance.require(ScriptName);          //从类中找到New函数         LuaFunction lnew = (LuaFunction)metatable["New"];          //执行New函数生成脚本对象         object[] results = lnew.Call(metatable, this);          //存贮脚本对象         self_ = (LuaTable)results[0];          //给脚本对象设置上常用的属性         self_["transform"] = transform;         self_["gameObject"] = gameObject;          //尝试调用脚本对象的Awake函数         CallMethod("Awake");     }     protected object[] CallMethod(string func, params object[] args)     {         //查找LUA函数         LuaFunction lfunc = (LuaFunction)self_[func];         if(lfunc == null)         {             return null;         }          //调用LUA函数。等价于lua语句“self:func(...)”         int oldTop = lfunc.BeginPCall();         lfunc.Push(self_); //将self作为第一个参数传入         lfunc.PushArgs(args);         lfunc.PCall();         object[] objs = luaState_.CheckObjects(oldTop);         lfunc.EndPCall();         return objs;     } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

4.添加LUA脚本层

在Assets/Lua目录下新建LUA脚本Test.lua,核心代码如下:

--构造Test类 local Test = {} Test.__index = Test --让实例对象的__get方法指向Test类  --给Test类实例化一个对象 function Test.New(cls)     local self = {}     setmetatable(self, cls)     return self end  --Awake方法 function Test:Awake()     print("Test:Awake", self) end  --将类Test返回。通过require函数的返回值就可以获取到此值了。 return Test
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5.辅助脚本

由于各个GameObject的初始化先后顺序不好统一,而且考虑到多个场景切换的情况,tolua提供的LuaClient就没那么好使了。所以我增加了一个LuaMainInstance的单例类,在其构造的时候就初始化一个全局的LuaState,供LUA脚本使用。 
由于不使用LuaClient,所以LuaLooper也无法直接使用了,我就添加了一个派生类LuaWatchdog,用于启动LuaLooper。

6.总结

将LuaBehaviourScript.cs添加给GameObject之后,并设置上要绑定的Lua模块名称。当GameObject Awake的时候,会自动加载绑定的LUA脚本文件,并创建出脚本对象。后续所有的Untity回调函数,都会通过脚本对象传递到LUA层。 
完整代码下载地址:https://github.com/youlanhai/tolua 
打开Test场景,点击播放,你会看到立方体在垂直方向上下移动。移动的逻辑,就是在Test.lua中实现的。

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=602

标签: unity3d
分享给朋友:

“ULUA的简洁用法” 的相关文章

关于衣服

习惯有的时候,换个角度去思考,却有绝然不同的结果.在生活中,第件事处理方法上,我何不从自己的习惯外去采取更折中的方呢?…

LayaAir功能介绍

 LayaAir包括引擎库与LayaAir IDE两大核心部分...…

如何做到在台上镇定自若?

这个问题个人觉得可以分为两个方面:1. 演讲技巧方面    手脚怎么放才得体,有一部分是演讲技巧的问题,这个本人不在行就不多说了。2. 演讲焦虑方面    硕士时读过一点“社交焦虑(social anxiety)”相关的专业书,&ldq…

回一趟的杂想100829

流水帐,又一次刷写.顺水而下,逆天而上.…

《毕业八年,我重逢了高中的校花》语录

(一) ●我点燃身上最后一支烟,在路灯杆下百无聊赖。 抬头看看,楼上的窗口还是一片黑乎乎的,那种漆黑,就是孤独的颜色。 其实孤独并不可怕,可怕的是在孤独的时候,竟然没一个人可以用来想起。 ...…

VC++动态链接库(DLL)编程深入浅出(二)

上节给大家介绍了静态链接库与库的调试与查看(动态链接库(DLL)编程深入浅出(一)),本节主要介绍非MFC DLL。 4.非MFC DLL 4.1一个简单的DLL 第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数。 如图6,…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。