ToLua的Example示例学习笔记13_CustomLoad
2020-05-13 本文已影响0人
凌枫望星月
展示了如何创建自定义的Loader。
「1」代码
c#代码如下:
public class TestCustomLoader : LuaClient
{
protected override LuaFileUtils InitLoader()
{
return new LuaResLoader();
}
protected override void CallMain()
{
LuaFunction func = luaState.GetFunction("Test");
func.Call();
func.Dispose();
}
protected override void StartMain()
{
luaState.DoFile("TestLoader.lua");
CallMain();
}
「2」需要了解的部分
- 这一章是我个人理解时间最多的一章,前置需要看示例笔记02和03的一些关于LuaResLoader和LuaFileUtils的内容,本节我认为需要了解的部分如下:
-
TestCustomLoader
是对LuaClient
的继承,并重写了三个函数:InitLoader
、CallMain
、StartMain
。 - 在介绍这三个重写的函数之前,我们不妨回头看一下他们在基类LuaClient中的virtual函数是怎样实现的。来看一下基类的关键代码:
public class LuaClient : MonoBehaviour
{
public static LuaClient Instance
{
get;
protected set;
}
protected LuaState luaState = null;
protected void Awake()
{
Instance = this;
Init();
}
protected void Init()
{
InitLoader();
luaState = new LuaState();
LoadLuaFiles();
}
protected virtual LuaFileUtils InitLoader()
{
return LuaFileUtils.Instance;
}
protected virtual void LoadLuaFiles()
{
OnLoadFinished();
}
protected virtual void OnLoadFinished()
{
luaState.Start();
StartLooper();
StartMain();
}
protected void StartLooper()
{
loop = gameObject.AddComponent<LuaLooper>();
loop.luaState = luaState;
}
protected virtual void StartMain()
{
luaState.DoFile("Main.lua");
CallMain();
}
protected virtual void CallMain()
{
LuaFunction main = luaState.GetFunction("Main");
main.Call();
main.Dispose();
main = null;
}
}
这样经过删减,一看就很清晰了,InitLoader
、CallMain
、StartMain
的作用:
InitLoader
负责返回一个LuaFileUtils
对象,没有就创建,反正是单例。
StartMain
与CallMain
负责调用一个Lua函数。
经过重写后,InitLoader
返回的是继承了父类LuaFileUtils
的子类LuaResLoader
的对象,从此,以后走父类LuaFileUtils
的virtual函数,以后都走子类LuaResLoader
的override函数了。
而且,LuaFileUtils
原有的ReadFile
在LuaResLoader
中得到了重写,在base.ReadFile()找不到文件的情况下,新增了Resource.Load(./Lua/...)
来搜索新的路径,每次DoFile,都会调用LuaFileUtils.Instance.ReadFile(filename)
,而Instance已经被悄咪咪被InitLoader
的对象换成了LuaResLoader
的对象。
最后StartMain
与CallMain
负责调用TestLoader.lua
中一个叫Test
的Lua函数。
官方的说明:
这个例子主要演示的是如何创建自定义的loader,
最关键一点在:return new LuaResLoader();
这个类在之前帖子里面LuaLoader里面中就写过了,
LuaResLoader也是继承自LuaFileUtils,
然后在里面可以设置是否加载LuaBundle开关:
public LuaResLoader()
{
instance = this;
beZip = false;
}
重载拦截到读取Lua文件的override byte[] ReadFile(string fileName)函数,
你可以在里面做自己的解密、读取顺序优先级(先读取沙盒目录、再读取Resource)等操作,
返回lua虚拟机认可的byte[]即可。