我是靠谱客的博主 冷酷曲奇,最近开发中收集的这篇文章主要介绍Unity Xlua 之 C#调用Lua(一)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");
    }
}

最后

以上就是冷酷曲奇为你收集整理的Unity Xlua 之 C#调用Lua(一)Unity Xlua 之 C#调用Lua(一)的全部内容,希望文章能够帮你解决Unity Xlua 之 C#调用Lua(一)Unity Xlua 之 C#调用Lua(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部