xlua

xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。

xLua的突破

xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:

  • 可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现;
  • 出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;
  • 编辑器下无需生成代码,开发更轻量;

配置

去github网站上直接下载项目,不是发布版本

https://github.com/Tencent/xLua

image-20241203203457634

将xlua加入到项目中

image-20241203203656077

压缩包中的Asses文件夹下的内容直接鼠标拖动加入到Unity工程中,在此之前要保证Assets文件夹下不存在同名文件夹,不然运行的时候会直接报错

Rider配置

2024通过官网下载到的最新版的rider,具体的安装注册请移步去百度,直接跳过到安装插件,EmmyLua,如下图所示。

image-20241203204059539

最新的版本会自动配置对.lua和.lua.txt的识别

提示

插件中对.lua.txt的使用是因为Unity不能识别.lua

不过一开始对.lua.txt中的高亮文字识别会失败,需要先删除再重新配置

image-20241203204430798

Unity运行

require运行

路径配置

运行的时候xlua会自动扫描配置的文件夹,在Unity中,最直接的是建议脚本放在Resources文件夹下作为一开始的测试手段

C#调用

创建LuaManager的C#文件,并附加在在场景中的一个游戏对象,会在Sart函数中自动调用lua中配置的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;
using XLua;

public class LuaManager : MonoBehaviour
{
private LuaEnv luaEnv; //配置对象

private void Start()
{
luaEnv = new LuaEnv();



//模块调用
//require是指定方法
//'MainLua',模块名,一般是脚本名,在路径正确配置的前提下才能正常运行
luaEnv.DoString("require 'MainLua'");


}

private void Update()
{
// 清除Lua的未手动释放的LuaBase对象(比如:LuaTable, LuaFunction),以及其它一些事情。
// 需要定期调用,比如在MonoBehaviour的Update中调用。
this.luaEnv.Tick();
}

private void OnDestroy()
{
//xlua创建的独享需要手动进行释放
this.luaEnv.Dispose();
}
}

lua文件准备

提示

插件中对.lua.txt的使用是因为在Unity的Resources文件夹下可以识别的文件数量有限,不指定Loader的话就需要用 .txt 进行结尾

MainLua:调用LuaTEST

LuaTEST:具体实现

image-20241203205739362

MainLua

1
require("LuaTest")

LuaTEST

1
print("LuaTEST")

最终的效果是在Unity的控制台输出 LuaTEST的字样

自定义Loader

在指定的C#文件中按照如下方式进行定义

需要在执行 require 方法之先指定Loader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private void Start()
{
luaEnv = new LuaEnv();

luaEnv.AddLoader((ref string filename) =>
{
byte[] bytes = null;

string middlePathStr = "/Scripts/Lua/";

//对开头进行一个筛查
if (!filename.StartsWith("Main"))
{
middlePathStr += "Src/";
}

//程序位置定位
string filePath = Application.dataPath + middlePathStr + filename + ".lua";

//加载内容
string strLuaContent = File.ReadAllText(filePath);

//转为Utf-8的类型
bytes = System.Text.Encoding.UTF8.GetBytes(strLuaContent);

return bytes;
});

luaEnv.DoString("require 'MainLua'");



}

涉及到的类型为

1
2
3
public delegate byte[] CustomLoader(ref string filepath);

public void LuaEnv.AddLoader(CustomLoader loader)

程序位置定位

打包后也能通过该复合获取到游戏的路径,不过在驱动lua运行的没有正确加载,具体原因子啊2024.12.10暂且不清楚

1
2
Application.dataPath
//经过测试,该路径指向Unity的开发路径 Assets文件夹