美文网首页
ToLua的Example示例学习笔记13_CustomLoad

ToLua的Example示例学习笔记13_CustomLoad

作者: 凌枫望星月 | 来源:发表于2020-05-13 00:06 被阅读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的内容,本节我认为需要了解的部分如下:
    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[]即可。
    

    相关文章

      网友评论

          本文标题:ToLua的Example示例学习笔记13_CustomLoad

          本文链接:https://www.haomeiwen.com/subject/jzswnhtx.html