本例讲解了在lua中使用协程。创建了三个变量,其中,luaFile是lua指的是lua脚本。looper应该是和协程相关的对象。
实例化了一个LuaResLoader()对象,但是没有变量来接收该对象,很奇怪。。LuaResLoader继承自LuaFileUtils。初始化了LuaFileUtils中的几个字段。其中searchPath是查找文件的路径,zipMap是AB资源包。
创建lua虚拟机,并启动。接下来是执行了一步LuaBinder.Bind(lua),这一步的目的是注册unity中的模块和一些类到lua中去。
下一步是初始化委托管理器DelegateFactory,添加一系列类型的事件、委托到内部字典等等操作。下一步在gameObject对象上挂载了一个LuaLooper脚本。该脚本猜测是用于控制循环的。该脚本在Start()方法中会获取几个事件,这几个事件和MonoBehaviour的Update(),LateUpdate()和FixedUpdate()相关。
GetEvent()方法内部也是通过LuaState.GetTable()获取了和参数相关的table,然后通过该table创建了LuaBeatEvent对象,并
且返回。然后对该table添加了“增”和“删”方法。
接下来加载执行了一个外部的lua脚本。同时获取了该脚本中的TestCortinue方法,该方法是开启协程的方法。
这里需要注意的一点是在lua脚本中,本例中是直接使用了coroutine关键字,猜想该关键字应该是提前注册进了lua中。lua脚本中涉及了一些协程的方法:
1、coroutine.wait(时间), 有点类似于Thrad.Sleep()方法;
2、coroutine.step()
3、coroutine.www(www对象),这个方法应该是启动下载的。
4、coroutine.start(方法),启动一个协程
5、coroutine.stop(nil),停止协程
总结:
调用lua中的协程时,需要挂载一个LuaLooper脚本。同时设置其LuaState对象为当前虚拟机对象。
在本例中,挂载LuaLooper脚本前,创建了LuaResLoader()实例对象,该对象是用于下载资源。同时调用了LuaBinder.Bind()方法,注册unity中的类。
获取lua脚本中,相关协程的方法,进行调用。