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");
    }
}

你可能感兴趣的:(Xlua,unity,c#,lua)