boxmoe_header_banner_img

菜就多练喵

文章导读

[Unity][XLua]热更新10——XLua解析器


avatar
Ib_Mccf 2026年3月4日 11
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class Lesson_LuaEnv : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //Lua解析器 能够在Unity中使用lua
        //一般情况下保持它的唯一性
        LuaEnv luaEnv = new LuaEnv();

        luaEnv.DoString("print('你好世界')");
        
        //执行一个lua脚本,使用require执行lua脚本
        //默认寻找Resources文件夹下的lua脚本,且无法直接识别lua文件,因此需要在lua文件后加一个.txt后缀
        luaEnv.DoString("require('Lesson1')");
        
        //清除lua中没有被手动释放的对象(垃圾回收)
        //帧更新中定时执行 或 切换场景时执行
        luaEnv.Tick();
        
        //销毁lua解析器
        luaEnv.Dispose();
    }
}

require(‘Lesson1’)会默认加载Assets/Resources文件下的lua脚本。

由于加载时无法识别.lua文件,需要在.lua后再加一个.txt后缀,即“Lesson1.lua.txt”

Lua文件加载重定向

使用require加载lua文件时,先会去自定义路径委托的方法里查找,最后才是去Resources文件夹。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System.IO;
public class Lesson2_Loader : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        LuaEnv env = new LuaEnv();
        //xlua提供的路径重定向方法
        //允许我们在自定义加载lua文件的规则
        //当我们执行lua语言 require时 相当于执行一个lua脚本
        //他就会自动执行我们自定义传入的函数
        env.AddLoader(MyCustomLoader);
        env.DoString("require('Main')");
    }

    //自定义加载lua文件的规则
    private byte[] MyCustomLoader(ref string filePath)
    {
        //传入的参数是 require执行的lua脚本文件名
        string path = Application.dataPath + "/Lua/" + filePath + ".lua";
        Debug.Log(path);

        //判断文件是否存在
        if (File.Exists(path))
        {
            return File.ReadAllBytes(path);
        }
        else
        {
            Debug.LogError("Lua文件不存在:" + path);
        }
        return null;
    }
}


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码