4.加载自定义路径下的Lua脚本

4.CSharp调用Lua-Lua文件加载重定向


4.1 知识点

加载重定向方法

声明自定义加载路径函数

//自定义加载路径
private byte[] MyCustomLoader(ref string filePath)
{

}

初始化Lua解析器

// Lua解析器
LuaEnv luaEnv = new LuaEnv();

LuaEnv.AddLoader 自定义加载Lua文件路径 传入自定义加载路径函数

// Lua解析器中AddLoader方法 Lua文件加载重定向 其实就是自定义加载Lua文件路径
// AddLoader方法需要传入参数
// 参数是一个 参数是ref string filePath文件重定向路径 返回值是byte[]字节数组 的委托
luaEnv.AddLoader(MyCustomLoader);

自定义加载路径委托

filePath是require执行的lua脚本文件名
函数中要拼接lua脚本所在的路径并加上.lua后缀
判断路径是否存在,存在就返回字节数组

// 自定义加载路径
private byte[] MyCustomLoader(ref string filePath)
{
    // 通过函数中的逻辑 去加载 Lua文件 
    
    // 参数filePath 是 require执行的 lua脚本文件名
    // 我们需要拼接一个 lua脚本文件 所在路径 比如我们统一放在Asset下的LuaScripts文件夹下
    // 注意要把lua脚本文件名名和.lua后缀也加上 因为不在Resources下 不需要.txt后缀了
    string path = Application.dataPath + "/LuaScripts/" + filePath + ".lua";
    Debug.Log(path);
    
    // 判断lua脚本文件名所在的路径是否存在
    if (File.Exists(path))
    {
        // 存在的话 从 所在的路径的lua脚本中 读取二进制数据 并将其以字节数组的形式返回
        return File.ReadAllBytes(path);
    }
    else
    {
        // 不存在则读取失败
        Debug.Log("MyCustomLoader重定向失败,文件名为" + filePath);
    }
    
    return null;
}

执行自定义路径下的Lua脚本

在Asset文件夹下的LuaScripts文件夹下创建Lua脚本

print('我是Lua脚本 Lesson04_CSharp调用Lua_Lua文件加载重定向')

当我们用Lua解析器执行Lua语言中的 require 时 相当于执行一个lua脚本
这个时候会执行luaEnv.AddLoader传入的委托 MyCustomLoader
在传入的委托中定义的自定义加载Lua文件路径逐个找是否有require的lua脚本 找到了就不会再找了
最终没有的话 会去默认的Resources文件夹找 还没有就报错找不到了

luaEnv.DoString("require('Lesson04_CSharp调用Lua_Lua文件加载重定向')"); 

之后 会学习去AB包中加载 lua文件


4.2 知识点代码

Lesson04_CSharp调用Lua_Lua文件加载重定向.lua

print('我是Lua脚本 Lesson04_CSharp调用Lua_Lua文件加载重定向')

Lesson04_CSharp调用Lua_Lua文件加载重定向

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

public class Lesson04_CSharp调用Lua_Lua文件加载重定向 : MonoBehaviour
{
    void Start()
    {

        #region 知识点一 加载重定向方法

        //Lua解析器
        LuaEnv luaEnv = new LuaEnv();

        //Lua解析器中AddLoader方法 Lua文件加载重定向 其实就是自定义加载Lua文件路径
        //AddLoader方法需要传入参数
        //参数是一个 参数是ref string filePath文件重定向路径 返回值是byte[]字节数组 的委托
        luaEnv.AddLoader(MyCustomLoader);

        //当我们用Lua解析器执行Lua语言中的 require 时 相当于执行一个lua脚本 
        //这个时候会执行AddLoader传入的委托 MyCustomLoader
        //在传入的委托中定义的自定义加载Lua文件路径逐个找是否有require的lua脚本 找到了就不会再找了
        //最终没有的话 会去默认的Resources文件夹找 还没有就报错找不到了
        luaEnv.DoString("require('Lesson04_CSharp调用Lua_Lua文件加载重定向')");
        //之后 会去AB包中加载 lua文件 


        #endregion
    }

    #region 知识点二 自定义加载路径委托

    //自定义加载路径
    private byte[] MyCustomLoader(ref string filePath)
    {
        //通过函数中的逻辑 去加载 Lua文件 

        //参数filePath 是 require执行的 lua脚本文件名 比如上面执行的Main
        //我们需要拼接一个 lua脚本文件 所在路径 比如我们统一放在Asset下的LuaScripts文件夹下
        //注意要把lua脚本文件名名和.lua后缀也加上 因为不在Resources下 不需要.txt后缀了
        string path = Application.dataPath + "/LuaScripts/" + filePath + ".lua";
        Debug.Log(path);

        //判断lua脚本文件名所在的路径是否存在
        if (File.Exists(path))
        {
            //存在的话 从 所在的路径的lua脚本中 读取二进制数据 并将其以字节数组的形式返回
            return File.ReadAllBytes(path);
        }
        else
        {
            //不存在则读取失败
            Debug.Log("MyCustomLoader重定向失败,文件名为" + filePath);
        }


        return null;
    }

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏