这边文章是看xlua官方教程和一些文档之后的一个总结,希望大家都能学会lua,当然最希望我能快点学会lua。。。


C#调用Lua

(1) LuaEnv

LuaEnv是C#中调用lua时需要用到的lua环境提示,需要在C#中使用Lua语法的时候就需要new一个LuaEnv。

下面这个案例展示了在C#中用Lua语法打印一句话:

  public LuaEnv luaEnv;
// Start is called before the first frame update
void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("print('这是一个lua语法的句子')");
}

输出结果如下:

【热更新实践】xLua基本用法_c#

(2)C#调用Lua语句和Lua文件

调用lua语句上面已经演示了,不再赘述。我们还可以通过读取文件的方式来访问lua文件,以下为代码演示:

    public LuaEnv luaEnv;
private void Start()
{
var lua = Resources.Load<TextAsset>("LuaScripts/Test");
if (lua!= null)
{
luaEnv = new LuaEnv();
luaEnv.DoString(lua.text);
luaEnv.Dispose();
}
}

需要访问的文件是在Assets/Resources/LuaScripts下新增了一个text格式的文件,代码如下:

a=2
b=5
print("a+b="..a+b)
print("这是一段lua代码")

输出结果如下:

【热更新实践】xLua基本用法_c#_02

(3)使用Loader进行文件加载

这种方式的关键词是require。xLua自身有一些Loader可以用来添加文件,也可以自己添加loader。

Resources中的文件是可以通过自带的Loader进行加载的,不过前提是需要将文件的后缀改为.lua.text。

【热更新实践】xLua基本用法_xLua_03

以下是代码演示:

    public LuaEnv luaEnv;
private void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("require 'Test'");
}

输出结果如下:

【热更新实践】xLua基本用法_c#_04

当然这无法满足我们的大多数需求,接下来我们来看自定义Loader,只涉及到一个接口:

 public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader)

以下是我们的案例代码:

我们将lua脚本移动到Resources下的LuaScripts文件中后,上面的xLua自带的Loader就找不到文件了。我们将这个脚本的后缀改为.bytes,然后使用如下C#代码进行调用。

    public void Start()
{
LuaEnv luaEnv = new LuaEnv();
luaEnv.AddLoader(MyLoader);
luaEnv.DoString("require 'Assets/Resources/LuaScripts/Test.bytes'");//这一串有点长,实际使用中可以写个方法来获取,后续再总结一篇Xlua热更新框架的笔记
luaEnv.Dispose();
}

private byte[] MyLoader(ref string path)
{
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}

输出结果如下:

【热更新实践】xLua基本用法_热更新_05

(4)C#访问Lua的数据结构

 luaenv.Global.Get<int>("a")
luaenv.Global.Get<string>("b")
luaenv.Global.Get<bool>("c")

还是上述的lua脚本,我们在C#脚本中用以下代码进行获取:

Debug.Log(luaEnv.Global.Get<int>("a"));
打印结果为2,成功访问到Lua中的变量的值。

Lua调用C#

需要添加CS关键字进行调用:

-- 实例化对象  
local go = CS.UnityEngine.GameObject("LuaGameObject")

-- 访问静态属性、方法
local deltaTime = CS.UnityEngine.Time.deltaTime
local GameObject = CS.UnityEngine.GameObject
local camera = GameObject.Find("Main Camera")

-- 访问成员属性、方法
camera.name = "LuaCamera"
camera:GetComponent("Camera").clearFlags = CS.UnityEngine.CameraClearFlags.SolidColor



参考文献

​https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md​

​https://blog.csdn.net/LWR_Shadow/article/details/127113712?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-127113712-blog-89296680.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-127113712-blog-89296680.pc_relevant_landingrelevant&utm_relevant_index=5​