让我们在lua代码中打印出hello world吧~
1.定义lua代码
新建一个名为first.lua.txt的lua文件,注意文件以文本文件后缀结尾
print("hello world")
接下来让我们在C#代码中调用lua代码
using UnityEngine;
using XLua;
public class luaHelloWorld : MonoBehaviour {
LuaEnv env;
// Use this for initialization
void Start () {
env = new LuaEnv();//lua虚拟机 建议全局唯一
env.DoString("require 'first'");
}
private void OnDestroy()
{
env.Dispose();
}
// Update is called once per frame
void Update () {
}
}
运行unity后会有如下报错
这是因为first.lua.txt的lua文件没有放在Resources文件夹内,导致lua默认的加载器没有找到,更改文件位置即可解决,
2.内置loader
lua中的require会挨个调loader去加载,有一个成功就不再往下尝试。xLua除了原生的loader外,还添加了从Resource加载的loader,需要注意的是因为Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀。
3.自定义loader
public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader)
通过AddLoader可以注意一个回调,参数为string,当使用require去调用loader查找模块时,会将模块名字传递给自定义loader参数,在自定义的loader内可以根据自己定义的文件后缀去查找,查找成功会返回字节数组,找不到则失败。
改变文件路径,使用自定义的加载器加载lua文件。
新建StreamingAssets文件夹,将first.lua.txt的lua文件放在该文件夹内,使用自定义loader加载
LuaEnv env;
// Use this for initialization
void Start () {
env = new LuaEnv();//lua虚拟机 建议全局唯一
env.AddLoader(customerLoader);//使用自定义loader
env.DoString("require 'first'");
}
private void OnDestroy()
{
env.Dispose();
}
private byte[] customerLoader(ref string filePath)//自定义loader
{
string path = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}
lua say hello world成功!