第12个案例,讲解的是在lua中对Unity中的一些类的使用,比如Color,GameObject,ParticleSystem等。这里是直接通过UnityEngine命名空间获取了该类,可以通过对应的命名空间+类名在lua获取该类。如通过 UnityEngine.UI.Image,可以获取

Image类。在lua中创建一个gameObject使用的方法是:GameObject('go'),go代表gameObject的名字,这与我们在C#中使用new方法不同。例子中还涉及了DOTween的使用。
第13个案例是讲解的使用Resource.Load来加载并执行lua脚本。使用的测试类继承自LuaClient类,测试类中没有具体的加载Resource资源的步骤,所以具体的加载步骤应该在基类中体现了。子类中重写了三个方法InitLoader(),StartMain()和CallMain(),StartMain()是执行找到的lua脚本,CallMain()是执行脚本中的测试function。InitLoader()创建了一个加载器LuaResLoader。在第一个案例中有提过DoFile()和Require()的区别(点击此处),这两个方法在加载lua脚本的过程中都会有目录匹配的步骤,但是匹配的目录是有限制的,只会匹配Editor/lua文件夹、Assets/Tolua、Assets/lua、Win/Lua、和当前脚本所在目录下。而在Reshource目录下的脚本是不能匹配到的。
通过单步调试,可以看到,会走到基类的Awake()方法中去,执行一步初始化Init()方法,该方法会初始化一个loader,同时创建初始化lua虚拟机,注册类到lua中去,同时会开始加载lua脚本。

初始化loader的方法被子类重写,创建了一个加载器LuaResLoader。LuaResLoader继承自LuaFileUtils,创建加载器的时候,初始化了父类LuaFileUtils中的几个字段:

OpenLibs()方法,看内容猜测是和Scoket相关的方法,不过不了解为什么从Reshource加载文件会和Socket有关系。

Build()方法除了注册lua基本类之外,还初始化了委托管理类,并且注册了lua的协程类。该协程类猜测和从Reshource中加载资源

相关。LuaCoroutine中,有一段lua片段,该片段大致上讲述的是在lua中使用unity的协程的一些方法。而Register()方法就是注册这些lua中的方法,使得可以在C#中使用。
LoadLuaFiles()方法启动了虚拟机,给gameObject对象添加了一个LuaLooper组件对象(点击此处2),最后调用了重写的StartMain()方法,这时候,在调用DoFile()方法执行脚本的时候,会匹配不到脚本路径,此时会自动去Resource中去寻找脚本。

会调用Resource.Load()方法加载资源,比较奇怪的是,到这里为止,似乎看不出来为什么要继承LuaClient类,绕这么一大圈来

从Reshource中加载资源。但是,如果我们按照通常的方法来读取Resource中的脚本是没有办法读取的。按照一般的方法来走的话,在LuaFileUtils的byte[] ReadFile(string fileName)方法中是读取不到文件的,返回数组为空,会报错。而案例中走的ReadFile()方法是重写的方法,写在LuaResLoader中的,其原因在于,我们创建了一个LuaResLoader实例对象,会自动走子类重写的方法。
最后,最大的疑问还是没有解决,为什么要继承LuaClient类,绕这么一大圈呢?这个只能留待以后继续学习解决了。