xLua(三)——在Unity中加载Lua文件

xLua提供的各种方法都是在LuaEnv(Lua的环境)类中的,使用之前需要构造一个Lua对象(LuaEnv虚拟机),之后用这个虚拟机去访问各种方法:
一个LuaEnv对应一个Lua虚拟机,出于开销的考虑,建议全局唯一。

xLua加载Lua文件是通过DoString来实现的,DoString的参数是一个字符串


一:参数里直接写Lua语句

必须符合Lua语法
     
因为是调用Lua中的输出语句,所以输出结果会有一个LUA:去说明是在Lua文件中的输出,运行后控制台输出LUA:HelloWorld和LUA:1,LUA:2


二:通过加载Lua文本文件

先加载Lua文本文件,再将Lua文件中的文本作为参数传入DoString参数中。
注意在Unity中不论是Resources加载还是面板赋值,都无法识别到后缀为.lua的文件,为了区分lua文件与txt文件,可以将文件的名字命名为XX.lua.txt,这样既可以在Unity中识别到同时也标明了这个文件是一个lua文件。
     
运行后控制台输出LUA:3


三:Lua中调用C#的类去执行代码

     
因为是CS中的方法,所以运行后控制台输出HelloWorld


以上方法显然很麻烦,DoString里的参数还可以使用require,在Lua中require是引入了一个模块(文件),而在DoString的参数中这样写既可以引入模块还可以加载模块中的代码。


四:调用内置loader

当在DoString的参数中传入require时,会自动调用xLua的内置方法:loader
loader会从Resources文件夹中加载XX.lua.txt的文件,它相当于自动执行了这句代码:Resources.Load<TextAsset>("XX.lua").text;
注意:
——引入的文件名必须为XX.lua.txt
——文件必须放在Resources文件夹里

     
运行后控制台输出LUA:3


五:自定义loader

首先看一下底层源码:

使用AddLoader可以添加自定义loader方法,在DoString的参数中传入require后在底层是这样执行的:
1.先去加载自定义的loader方法(每个自定义的loader方法都返回一个字节数组)
2.如果返回值为空,则继续查找下一个loader方法,如果返回值不为空,则返回自定义loader的返回值
3.如果所有自定义的方法都返回空,则使用内置的loader方法从Resources文件夹中加载。

例如还是之前的Test.lua.txt文件

——第一种情况

因为自定义的loader返回值为空,所以执行内置的loader,运行后控制台输出LUA:3

——第二种情况

因为自定义的loader返回值为空,所以仍然会执行内置的loader,但是自定义的loader方法也会执行,需要注意的是,require的参数是什么,loader在回调的时候filepath就会被设置为什么,运行后控制台输出Test和LUA:3

——第三种情况

因为自定义的loader返回值不为空,所以直接输出自定义loader的返回值,不会再执行内置的loader,运行后控制台输出LUA:helloworld

自定义loader示例:
例如Lua文件不在Resources文件夹中而是在其他的路径下:

using UnityEngine;
using XLua;
using System.IO;

public class Test : MonoBehaviour
{
    private void Start()
    {
        LuaEnv luaenv = new LuaEnv();

        luaenv.AddLoader(MyLoader);
        luaenv.DoString("require 'Test'");

        luaenv.Dispose();
    }

    private byte[] MyLoader(ref string filePath)
    {
        string path = @"C:\Users\Desktop\" + filePath + ".lua.txt";
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
    }
}


    

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/89300370