编写自定义加载器加载指定路径的Lua文件:
cs
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;
//Lua是脚本语言,编写代码脚本是实现功能最重要的方式
public class Loader : MonoBehaviour
{
void Start()
{
MyLoader();
}
public void MyLoader()
{
LuaEnv env = new LuaEnv();
//将我定义的加载器,加入到xLua的解析环境中
env.AddLoader(ProjectLoader);
env.DoString("require('test1')");
env.Dispose();
}
//自定义加载器
//自定义加载器,会先于系统内置加载器执行,当自定义加载器加载到文件后,后续的加载器则不会继续执行
//当Lua代码执行require()函数时,自定义加载器会尝试获得文件的内容
//参数:被加载Lua文件的路径
//如果需要加载的文件不存在,记得返回null
public byte[] ProjectLoader(ref string filepath)
{
//filepath来自于Lua的require("文件名")
//构造路径,才能将require加载的文件指向到我们想放Lua的路径下去
string path = Application.dataPath;
path=path.Substring(0, path.Length-7)+"/DataPath/Lua/"+filepath+".lua";
//将Lua文件读取为字节数组
//xLua的解析环境,会执行我们自定义加载器返回的Lua代码
return File.ReadAllBytes(path);
}
}
将创建的自定义Lua加载器创建为单例:
cs
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;
public class xLuaEnv
{
#region Singleton
private static xLuaEnv _Instance = null;
public static xLuaEnv Instance
{
get
{
if (_Instance == null)
{
_Instance = new xLuaEnv();
}
return _Instance;
}
}
#endregion
#region Create LuaEnv
private LuaEnv _Env;
//创建单例的时候,Lua运行环境,会一起被创建
private xLuaEnv()
{
_Env = new LuaEnv();
_Env.AddLoader(_ProjectLoader);
}
#endregion
#region Loader
//创建自定义Lua加载器,这样就可以任意订制项目的Lua脚本的存储位置
public byte[] _ProjectLoader(ref string filepath)
{
string path = Application.dataPath;
path = path.Substring(0, path.Length - 7) + "/DataPath/Lua/" + filepath + ".lua";
if (File.Exists(path))
{
return File.ReadAllBytes(path);
}
else
{
return null;
}
}
#endregion
#region Free LuaEnv
public void Free()
{
//释放LuaEnv,同时也释放单例对象,这样下次调单例对象,会再次产生Lua运行环境
_Env.Dispose();
_Instance = null;
}
#endregion
#region Run Lua
public object[] DoString(string code)
{
return _Env.DoString(code);
}
#endregion
}
编写脚本测试单例:
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestSingleton : MonoBehaviour
{
void Start()
{
xLuaEnv.Instance.DoString("require('test1')");
}
private void OnDestroy()
{
xLuaEnv.Instance.Free();
}
}
运行查看输出:

接触一个新的Lua项目时,先要弄懂Lua的加载器规则,只有这样,才能弄懂项目的Lua执行流程。
研究C#的静态类如何被Lua调用:
编写C#脚本代码如下:
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace HX
{
public static class TestStatic
{
public static int ID = 99;
public static string Name
{
get;
set;
}
public static string Output()
{
return "static";
}
public static void Default(string str="abc")
{
Debug.Log(str);
}
}
}
public class LuaCallStatic : MonoBehaviour
{
void Start()
{
xLuaEnv.Instance.DoString("require('C2L/LuaCallStatic')");
}
private void OnDestroy()
{
xLuaEnv.Instance.Free();
}
}
根据C#代码中提到的路径创建对应的Lua文件,在文件中编写Lua脚本如下所示:
Lua
--Lua调用静态类
--规则"CS.命名空间.类名.成员变量"
print(CS.HX.TestStatic.ID)
--给静态属性赋值
CS.HX.TestStatic.Name = "admin"
print(CS.HX.TestStatic.Name)
--静态成员方法调用
--规则"CS.命名空间.类名.方法名()"
print(CS.HX.TestStatic.Output())
--使用默认值
CS.HX.TestStatic.Default()
--使用Lua传递的值
CS.HX.TestStatic.Default("DEF")
其测试结果如下所示:

该系列专栏为网课课程笔记,仅用于学习参考。