xlua中自定义lua文件加载的一种方式

此种方法来自LoxodonFramework ,这里只做记录

定义一个LoaderBase类,做一个到CustomLoader的隐式类型转换

csharp 复制代码
public abstract class LoaderBase
{
    protected abstract byte[] Load(ref string fileName);
    
    /// <summary>
    /// 隐式类型转换,将LoaderBase转换为CustomLoader的byte[]
    /// </summary>
    /// <param name="loader"></param>
    /// <returns></returns>
    public static implicit operator LuaEnv.CustomLoader(LoaderBase loader)
    {
        return loader.Load;
    }
}

再让一个PathLoaderBase类继承,做进一步路径封装

csharp 复制代码
public abstract class PathLoaderBase : LoaderBase, IDisposable
{
    /// <summary>
    /// 前缀
    /// </summary>
    protected string prefix = "";
    
    /// <summary>
    /// 后缀
    /// </summary>
    protected string suffix = ".lua.txt";

    public PathLoaderBase(string prefix, string suffix)
    {
        this.prefix = prefix;
        if (!string.IsNullOrEmpty(this.prefix))
        {
            this.prefix = this.prefix.Replace(@"\", "/");
        }
        if (!this.prefix.EndsWith("/"))
        {
            this.prefix += "/";
        }
        this.suffix = suffix;
    }
    
    /// <summary>
    /// 得到文件路径
    /// </summary>
    /// <param name="className">文件名</param>
    /// <returns></returns>
    protected virtual string GetFullName(string className)
    {
        return string.Format($"{prefix}{className.Replace(".", "/")}{suffix}");
    }

    protected virtual void Dispose(bool disposing)
    {
        
    }

    ~PathLoaderBase()
    {
        Dispose(false);
    }
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

最后,来个FileLoader类,继承PathLoaderBase,具体重写Load方法

csharp 复制代码
public class FileLoader : PathLoaderBase
{
    public FileLoader(string prefix, string suffix) : base(prefix, suffix)
    {
    }

    public FileLoader(string prefix) : this(prefix, ".lua.txt")
    {
        
    }
    
    /// <summary>
    /// 加载require的文件
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    protected override byte[] Load(ref string fileName)
    {
        string fullName = GetFullName(fileName);
        if (!FileUtil.Exists(fullName))
        {
            return null;
        }
        
        fileName = fullName;

        byte[] data = FileUtil.ReadAllBytes(fullName);
        if (!HasBOMFlag(data))
        {
            return data;
        }

        return data.Skip(3).ToArray(); //跳过BOM开头
    }
    
    /// <summary>
    /// 检查一个字节数组是否以字节顺序标记(Byte Order Mark, BOM)开头,
    /// BOM是一种用于指示文本文件编码方式的特殊字节序列,通常出现在文件的开头
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    protected bool HasBOMFlag(byte[] data)
    {
        if (data == null || data.Length < 3)
        {
            return false;
        }

        if (data[0] == 239 && data[1] == 187 && data[2] == 191)
        {
            return true;
        }

        return false;
    }
}

最后在LuaBehaviour类中写一个方法,做Lua的自定义加载

csharp 复制代码
public class LuaBehaviour : MonoBehaviour
{
	...........
	/// <summary>
    /// 设置xlua的加载路径
    /// </summary>
    private void SetPackagePath()
    {
        //在Unity项目的"Assets"文件夹(或指定的Application.dataPath路径)及其所有子目录中,查找名为"LuaScripts"的目录,并返回一个包含这些目录路径的字符串数组
        foreach (string dir in Directory.GetDirectories(Application.dataPath,"LuaScripts", SearchOption.AllDirectories))
        {
            luaEnv.AddLoader(new FileLoader(dir, ".lua"));
            luaEnv.AddLoader(new FileLoader(dir, ".lua.txt"));
        }
    }
	..............
}

这样,Lua代码就可以require目录为"LuaScripts"下的所有Lua文件

相关推荐
韩仔搭建3 小时前
美乐迪电玩大厅加载机制与 RoomList 配置结构分析
游戏·小程序·开源·lua
老狼孩111221 天前
2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发
android·机器人·自动化·lua·脚本开发·懒人精灵·免root开发
珠峰下的沙砾1 天前
如何在 Postman 中,自动获取 Token 并将其赋值到环境变量
测试工具·lua·postman
时光话2 天前
Lua 第9部分 闭包
开发语言·lua
时光话2 天前
Lua 第7部分 输入输出
开发语言·lua
Hy行者勇哥4 天前
使用Postman调测“获取IAM用户Token”接口实际操作
测试工具·lua·postman
加油,旭杏6 天前
【Lua语言】Lua语言快速入门
开发语言·lua
徐同保6 天前
fetch使用put请求提交文件,postman使用put请求提交文件
测试工具·lua·postman
码到成功>_<8 天前
postman使用技巧
测试工具·lua·postman
King.6249 天前
SQL2API 核心理念:如何重构数据服务交付范式
大数据·开发语言·数据库·人工智能·sql·lua