从本篇开始将为大家讲解ToLua在unity当中的使用教程。
Tolua的框架叫LuaFramework,首先附上下载链接:
https://github.com/jarjin/LuaFramework_UGUI_V2
这个地址的是UGUI的。
下载完之后导入项目,首先,我们要先让这个项目跑起来。
![](https://file.jishuzhan.net/article/1711394515916427265/7d0db6570613c227c6f0ba0aca3e32a3.webp)
首先点击Lua->Clear wrap files,清除所有wrap文件。
![](https://file.jishuzhan.net/article/1711394515916427265/248acb050a39132cdd47ed710af71ea0.webp)
然后点击LuaFramework->Build Windows Resource,打包ab资源。
![](https://file.jishuzhan.net/article/1711394515916427265/0dd649d3b2adf36d8b9588ea8a56721a.webp)
最后点击Lua->Generate All,重新生成wrap文件。
但是在我这里生成Wrap文件时出现了一个报错。
![](https://file.jishuzhan.net/article/1711394515916427265/490db2b7f3cf125186acd4331e9ee943.webp)
经过调试之后发现是ParticleSystem该类生成wrap文件时出现的问题。
![](https://file.jishuzhan.net/article/1711394515916427265/f3c00d10fe67bde8b492b60f909fc456.webp)
所以把这行注释掉,重新操作一下就可以了。
然后点击运行。
![](https://file.jishuzhan.net/article/1711394515916427265/745b0fd191215ccec367feae5891eeb5.webp)
直到这里,我们的项目总算是跑起来了。
接下来,我们来看一下这个框架是如何运行的。
![](https://file.jishuzhan.net/article/1711394515916427265/583cd2878387bbe4d0fbd64c082de886.webp)
在运行之前我们可以看到,场景中只有一个GameManager挂载了一个Main脚本,顾名思义,该脚本就是入口脚本。
![](https://file.jishuzhan.net/article/1711394515916427265/500cb3da67bf8c56e600f879cab2bf67.webp)
游戏一开始,调用一个StartUp函数。
![](https://file.jishuzhan.net/article/1711394515916427265/ac7a215b13ea6bbc0e93f682596fc42a.webp)
在StartUp当中又去调用了一个SendMessageCommand。
![](https://file.jishuzhan.net/article/1711394515916427265/42845ab946d42e93b71637b1ac4a70a9.webp)
该函数调用了m_controller的ExecuteCommand方法。
![](https://file.jishuzhan.net/article/1711394515916427265/b360d1adc2a847ab6989ede42e82f443.webp)
这个m_controller是一个单例,当Facade被构造的时候创建的,而我们入口脚本当中的AppFacade类又是继承自Facade的。我们看到,当Facade类构造时,会调用InitFramework方法。
![](https://file.jishuzhan.net/article/1711394515916427265/5d81828420fa255db259e6ecc5ea5107.webp)
所以当AppFacade构造时,就注册了一个StartUp的类型。
![](https://file.jishuzhan.net/article/1711394515916427265/f946490b39b3210fa8882c4badca15d7.webp)
将该枚举对应的类型注册进字典。
我们上面调用了m_controller的ExecuteCommand,我们可以看到,这个ExecuteCommand函数就是根据传进来的枚举去获取对应的类型,然后使用Activator.CreateInstance(commandType)去创建一个这种类型的实例,并且调用它的Execute方法。
![](https://file.jishuzhan.net/article/1711394515916427265/3197e6f3484f577916f0cae2a5543b79.webp)
我们上面注册的时候,该枚举对应的类型是StartUpCommand。
![](https://file.jishuzhan.net/article/1711394515916427265/5d62e0e1dd6a99670d304f512a8f4121.webp)
![](https://file.jishuzhan.net/article/1711394515916427265/b2b13864468875fec7e6bce9d707384b.webp)
看到他的Execute方法。
这里添加了很多个管理器。
![](https://file.jishuzhan.net/article/1711394515916427265/d3b60b3322708f8b0e8171f0ff9a2cd6.webp)
他是怎么添加的呢,实际上这些管理器都是继承自Monobehaviour的,其实就是添加这些组件到GameManager对象上并存进字典当中。那么既然是Monobehaiour,那么这些管理器就肯定都有生命周期函数。我们先看到GameManager。
![](https://file.jishuzhan.net/article/1711394515916427265/891a03b98d02f218a18a3f05e3651ac4.webp)
在Awake当中调用了初始化方法Init。然后释放资源。然后热更新,对比files文件等等一系列的操作,大家可以顺着往下看,代码太长不截图了,最后我们会看到他执行到了这个方法。
![](https://file.jishuzhan.net/article/1711394515916427265/aa56d473397df043920ca5e95179dc41.webp)
OnInitialize这个方法,LuaManager.DoFile("Logic/Game"); 这句代码,加载Logic文件夹下的Game这个lua文件。这个Game文件可以说是Lua脚本的入口脚本了。可以看到上面的代码,它调用了Game脚本的OnInitOK函数来驱动lua脚本。
![](https://file.jishuzhan.net/article/1711394515916427265/259a681aed7507a686b18849dca53657.webp)
OnInitOK该函数中,他去初始化一些View脚本和Ctrl脚本,这里就可以看出来,其实Tolua是采用MVC思想的。
看到InitViewPanels方法,他去加载PanelNames表的所有脚本。其实就是加载View文件夹下的视图层脚本。
那么视图层脚本的代码就可以使用了。反正Game这个脚本就是一个lua的入口脚本,具体大家要怎么做都可以。就是这么个流程。本篇就先讲这么多。