ToLua学习笔记三——toLua解析器自定义解析方式

一、自定义路径

toLua为我们定义了执行Lua文件的路径"Assets/Lua",那么执行其他路径的lua文件要怎么办呢?
1、在Asset/Lua文件夹下新建一个文件夹“C#CallLua”并在里面创建一个lua文件“Loader.lua”。
此时直接使用luaState.Require执行会报错:module ‘Loader’ not found,因为Require默认只能找到Assets/Lua文件夹下的lua文件。
2、第一种方式:如果文件属于Lua文件夹下,可以直接加父目录

luaState.Require("C#CallLua/Loader");

3、第二种方式:使用AddSearchPath方法添加查找路径

luaState.AddSearchPath(Application.dataPath+"/Lua/C#CallLua");
luaState.Require("Loader");

4、移除搜索路径(使用较少不建议只用)

luaState.RemoveSeachPath(Application.dataPath+"/Lua/C#CallLua");

二、自定义解析方式

要自定义解析方式,需要新建一个类,继承LuaFileUtils,重写加载函数。
1、新建一个脚本LuaCustomLoader并继承LuaFileUtils。
2、重写ReadFile函数。
首先要注意到的是,不管从ab包中加载还是从res中加载,都不支持用.lua后缀,所以tolua加上了bytes后缀,当然我们自己也可以加上.txt后缀,所以我们要在传入的fileName后面加上“.lua”
完整代码如下,重写中包含了从res加载和从ab包加载两种方式

public override byte[] ReadFile(string fileName){
        //Debug.Log("自定义解析方式"+fileName);
        //如果想要重新定义 解析lua的方式 那么只需要在该函数中去写逻辑即可
        //如果没有lua后缀,加上lua后缀,不管从ab包中加载还是从res中加载,都不支持用.lua后缀,所以tolua加上了bytes后缀
        //我们自己可以加上.txt后缀
        if (!fileName.EndsWith(".lua")){
            fileName += ".lua";
        }
        byte[] buffer = null;
        //因为进行热更新的lua代码 肯定是我们自己写的上层lua逻辑

        //从ab包中加载lua文件
        //C#CallLua/Lesson2_Loader可能传入这样的名字,但是在AB包中只需要文件名,所以需要拆分一下
        string[] strs = fileName.Split('/');
        //加载ab包中的lua文件
        TextAsset luaCode = ABMgr.GetInstance().LoadRes<TextAsset>("lua",strs[strs.Length-1]);
        if(luaCode!=null){
            buffer = luaCode.bytes;
            Resources.UnloadAsset(luaCode);
        }

        //tolua的自带逻辑和自带lua类,我们不太需要热更新,直接从resources中加载即可
        if(buffer == null)
        {
            //从resources中加载lua文件
            string path = "Lua/"+fileName;
            TextAsset text = Resources.Load<TextAsset>(path);
            if(text!=null)
            {
               buffer = text.bytes;
               //卸载使用后的文本资源
               Resources.UnloadAsset(text);
            }
        }
        return buffer;
    }

3、在初始化luastate之前 new一个LuaCustomLoader。

new LuaCustomLoader();

因为LuaFileUtils中有一个构造函数:

public LuaFileUtils()
        {
            instance = this;
        }

在new的时候单利就会变成重新构造的类。
4、点击Lua->Copy Lua Files To Resources将Lua文件夹下所有lua文件复制到Resources中

上一篇:Cocos2dLua3.17.2集成FairyGUI之 lua绑定 getGroup() 调用问题(三)


下一篇:centos 编译lua