C#调用Lua之Lua解析器(常用函数,默认路径下加载lua文件,自定义加载器加载lua文件)

  • Post author:
  • Post category:其他


Lua解析器作用:让unity能够执行lua语言

(一)导入xlua步骤:

xlua源代码中assets文件夹中的plugins文件夹和xlua文件夹,放到unity工程中的asset目录下,xlua中的tools文件夹,放在项目的asset目录的同级目录下。

然后配置playersetting,最后编辑器会出现热补丁注入的选项,如图所示

在这里插入图片描述

测试脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;//要添加这个命名空间

public class LuaEnvTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        LuaEnv luaEnv = new LuaEnv();
        luaEnv.DoString("print('你好呀,lua')");
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

弄好后的测试结果:

在这里插入图片描述

(二)解析器常用函数,以及用解析器在默认的Resource文件夹下加载lua文件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;//要添加这个命名空间

public class LuaEnvTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //一般情况下,保持唯一性,可以提升性能
        LuaEnv luaEnv = new LuaEnv();

        //让解析器执行一个lua文件脚本,默认寻找的脚本是在Resources文件夹下,后缀.lua.txt才能被读取到
        luaEnv.DoString("require('Main')");

        //luaEnv.DoString("print('你好呀,lua')");
        //luaEnv.DoString("print('nihao')","LuaEnvTest"),第二个参数可以知道是哪个文件出了问题

        //清楚没有手动释放的对象,相当于垃圾回收
        //在帧更新中定时执行,但不是每帧执行,每帧执行耗性能,或者切换场景的时候执行。
        luaEnv.Tick();

        //销毁解析器
        luaEnv.Dispose();


    }

}
Main文件:

```lua
print("nihao lua")
结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201001112237907.png#pic_center)
(三)自定义加载器
require的执行顺序是,先去找自定义的加载器,如果没有返回空,就去默认加载路径Resources的里面找,
好处:自定义文件夹路径,不用改lua文件后缀。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;//要添加这个命名空间
using System.IO;

public class LuaEnvTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //一般情况下,保持唯一性,可以提升性能
        LuaEnv luaEnv = new LuaEnv();

        //自定义加载器,注意当有了自定义加载器,require的执行顺序是,先去找自定义的加载器,如果没有返回空,就去默认加载路径Resources的里面找
        //且自定义加载器要写在dostring前面
        luaEnv.AddLoader(MyCustomLoader);


        //让解析器执行一个lua文件脚本,默认寻找的脚本是在Resources文件夹下,后缀.lua.txt才能被读取到
        luaEnv.DoString("require('Main')");

        

    }

    //这个自定义加载器是自动执行的,require传过来的是文件名Main
   private byte[] MyCustomLoader(ref string filepath)
    {
        //拼接路径,从require传过来的lua文件名
        string path = Application.dataPath + "/Lua/" + filepath+".lua";
        Debug.Log(path);
        //找到这个路径的lua文件读成字节数组返回来
        if (File.Exists(path))
        {
            return File.ReadAllBytes(path);
        }
        else
        {
            Debug.Log("MyCustomLoader加载器加载lua文件失败");
            return null;
        }
        
    }
}



版权声明:本文为qq_42385019原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。