xlua执行加载lua代码有两种
执行字符串
最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法
比如:luaenv.DoString(“print(‘hello world’)”)
xlua的使用文档上说这种方式并不建议。加载Lua文件
用lua的require函数即可
比如:DoString(“require ‘byfile’”)
后面自定义Loader就与这个有关自定义Loader
在xLua加自定义loader是很简单的,只涉及到一个接口:
public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader);
通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。
下面是根据官方提供的demo进行的测试代码
using UnityEngine;
using System.Collections;
using XLua;
public class CustomLoader : MonoBehaviour {
LuaEnv luaenv = null;
// Use this for initialization
void Start()
{
//自定义loader
//lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件
//回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。
// public delegate byte[] CustomLoader(ref string filepath);
//public void LuaEnv.AddLoader(CustomLoader loader)
luaenv = new LuaEnv();
luaenv.AddLoader(CoutomLoaderMethod);
luaenv.DoString("require 'loader1'");
luaenv.DoString("require 'loader2'");
luaenv.DoString("require 'loader3'");
/*
luaenv.AddLoader((ref string filename) => {
if (filename == "InMemory")
{
string script = "return {ccc = 9999}";
return System.Text.Encoding.UTF8.GetBytes(script);
}
return null;
});
luaenv.DoString("print('InMemory.ccc=', require('InMemory').ccc)");
*/
}
// Update is called once per frame
void Update()
{
if (luaenv != null)
{
luaenv.Tick();
}
}
public byte[] CoutomLoaderMethod(ref string file)
{
if(file == "loader1")
{
string str = "print('loader1===')";
return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
}
if(file == "loader2")
{
string str = "a = {b = 2} print('loadr2 result is '.. a.b)";
return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
}
if(file == "loader3")
{
string str = "a = 3 print('loadr3 result is '.. a)";
return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
}
return null;
}
void OnDestroy()
{
luaenv.Dispose();
}
}