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」需要了解的部分

  1. TestCustomLoader是对LuaClient的继承,并重写了三个函数:InitLoaderCallMainStartMain
  2. 在介绍这三个重写的函数之前,我们不妨回头看一下他们在基类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;                
    }
}

这样经过删减,一看就很清晰了,InitLoaderCallMainStartMain的作用:
InitLoader负责返回一个LuaFileUtils对象,没有就创建,反正是单例。
StartMainCallMain负责调用一个Lua函数。

经过重写后,InitLoader返回的是继承了父类LuaFileUtils的子类LuaResLoader的对象,从此,以后走父类LuaFileUtils的virtual函数,以后都走子类LuaResLoader的override函数了。
而且,LuaFileUtils原有的ReadFileLuaResLoader中得到了重写,在base.ReadFile()找不到文件的情况下,新增了Resource.Load(./Lua/...)来搜索新的路径,每次DoFile,都会调用LuaFileUtils.Instance.ReadFile(filename),而Instance已经被悄咪咪被InitLoader的对象换成了LuaResLoader的对象。

最后StartMainCallMain负责调用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[]即可。
上一篇下一篇

猜你喜欢

热点阅读