Unity Xlua 之 C#调用Lua(一)

Unity Xlua 之 C#调用Lua(一)

一.Lua解析器(LuaEnv)

执行Lua代码,加载Lua文件执行

public class Lesson01_LuaEnv : MonoBehaviour
{
    private LuaEnv _luaEnv;
    private void Start()
    {
        _luaEnv = new LuaEnv();
        _luaEnv.DoString("print('Unity!')");
        _luaEnv.DoString("require('Main')");//默认从Resources文件夹下加载,且文件格式为xxx.lua.txt
        _luaEnv.Tick();//类似C#清理没有引用的变量内存
        _luaEnv.Dispose();//释放掉Lua虚拟机环境
    }
}

二.文件加载重定向

XLua加载Lua脚本默认是从Resources文件夹下加载,由于Unity对文件的读取性质,不能对后缀名称为.lua的文件进行读取,所以需要使用xxx.lua.txt。但是这样不能进行热更新Lua代码,而且开发起来不方便,所以需要重定向Lua文件的加载路径。

public class Lesson02_Loader : MonoBehaviour
{
    private LuaEnv _luaEnv;
    private void Start()
    {
        _luaEnv = new LuaEnv();
        _luaEnv.AddLoader(CustomLoader);//可以有多个Loader,依次加载,直到加载成功,否则执行默认的Loader进行加载
        _luaEnv.DoString("require('Main')");
        _luaEnv.Dispose();
    }

    private byte[] CustomLoader(ref string filePath)
    {
        var path = Application.dataPath + "/Lua/" + filePath + ".lua";
        if (File.Exists(path))
        {
            return File.ReadAllBytes(path);
        }
        else
        {
            Debug.Log("文件:"+path+"不存在!!!");
        }
        return null;
    }
}

三.Lua解析器管理器

在项目中多处地方需要使用LuaEnv,并且项目中的Lua文件是放在AB包中进行读取(AB包中只允许.txt的Lua文件),这时候就需要对其进行封装。

public class LuaMgr : BaseManager<LuaMgr>
{
    private LuaEnv _luaEnv;
    public LuaTable Global => _luaEnv.Global;
    public void Init()
    {
        if(_luaEnv!=null)
            return;
        _luaEnv = new LuaEnv();
        _luaEnv.AddLoader(CustomLoader);
        _luaEnv.AddLoader(CustomABLoader);
    }
    private byte[] CustomLoader(ref string filePath)
    {
        var path = Application.dataPath + "/Lua/" + filePath + ".lua";
        if (File.Exists(path))
        {
            return File.ReadAllBytes(path);
        }
        else
        {
            Debug.Log("文件:"+path+"不存在!!!");
        }
        return null;
    }
    private byte[] CustomABLoader(ref string filePath)
    {
        var lua = ABMgr.GetInstance().LoadRes<TextAsset>("lua",filePath+".lua");
        return lua != null ? lua.bytes : null;
    }
    public void DoString(string str)
    {
        _luaEnv?.DoString(str);
    }
    public void LoadFile(string fileName)
    {
        DoString($"require('{fileName}')");
    }
    public void Tick()
    {
        _luaEnv?.Tick();
    }
    public void Dispose()
    {
        if(_luaEnv==null)
            return;
        _luaEnv.Dispose();
        _luaEnv = null;
    }
}

测试代码

public class Lesson03_LuaMgr : MonoBehaviour
{
    private void Start()
    {
        LuaMgr.GetInstance().Init();
        
        LuaMgr.GetInstance().LoadFile("Main");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值