xlua使用

开始准备
下载地址:https://github.com/Tencent/xLua/tree/v2.1.16
下载好后,将里面的XLua和Plugins导入到自己的工程中,如果需要热重载,将Assets的同级目录的Tools也放入自己的工程中并加上宏定义HOTFIX_ENABLE
例如Unity2020.3.33中添加宏定义

配置生成Warp类

(1) 打标签,例如lua需要调用C#的某个类,那么就给这个类加上标签[LuaCallCSharp],这样Generate Code时会自动生成Warp类
(2) 静态列表:
有时候无法给封装好的一些类中加入标签,这时可以在一个静态类声明一个静态字段,该字段除了BlackList和AdditionalProperties之外只要实现了IEnumerable就可以。然后为这字段加上标签
[LuaCallCSharp]
public static List my_list = new List(){
typeof(GameObject),
}
这个字段需要放到一个静态类中,建立放到Editor目录下
(3) 动态列表
通过属性进行动态配置List,打上相应的标签即可,同样也要放在静态中

标签

LuaCallCSharp

一个C#加了这个配置,XLua会生成这个类型的适配代码,否则将会尝试用性能较差的反射方式访问
一个类型的扩展方法加了这配置,也会生成适配代码并追加扩展类型的成员方法上
xlua只会生成加了该配置的类型,不会自动生成其父类的适配代码,当访问子类对象的父类方法,如果该父类加了LuaCallCSharp标签,则执行父类的适配代码,否则尝试使用反射访问
反射访问除了性能不佳之外,在il2cpp下还有可能因为代码剪裁而导致无法访问

ReflectionUse

一个C#类型加了这个标签,,XLua会生成link.xml阻止il2cpp的代码剪裁

CSharpCallLua

把一个lua函数适配到一个C# delegate

GCOptimize

一个C#纯值类型

BlackList

如果你不要生成一个类型的一些成员适配代码,可以通过这个配置来实现

下面是生成期配置,必须放到Editor目录下

CSObjectWrapEditor.GenPath

配置生成代码的放置路径,类型是string。默认放在"Assets/XLua/Gen/"下。

CSObjectWrapEditor.GenCodeMenu

该配置用于生成引擎的二次开发,一个无参数函数加了这个标签,在执行"XLua/Generate Code"菜单时会触发这个函数的调用

简单流程

创建lua虚拟机:LuaEnv luaEnv = new LuaEnv();
加载加载器:luaEnv.AddLoader(CustomMyLoader);
加载器用来跟require搭配使用,可以自定义一个加载器
private byte[] CustomMyLoader(ref string fileName)
{
string luaPath = Application.dataPath + “/LuaScripts/” + fileName + “.lua.txt”;
string strLuaContent = File.ReadAllText(luaPath);
byte[] result = System.Text.Encoding.UTF8.GetBytes(strLuaContent);
return result;
}
加载Lua文件:luaEnv.DoFile(); luaEnv.DoString();

热重载

首先在需要热重载C#的脚本类A上加上特性Hotfix
需要在lua中重载类A中的方法start
在lua中执行
xlua.private_accessible(CS.A)
xlua.hotfix(CS.A,“start”,function(self)
print("重载类” … self.name);
end)

C# 调用lua

C#调用a.lua中的方法test
C#中声明
[XLua.CSharpCallLua]
public delegate void Test(float a)
绑定
var test = luaEnv.Global.GetInPath(“a.test”)
调用
test();

Lua调用C#

通过warp类,CS.xxx.xxx

猜你喜欢

转载自blog.csdn.net/weixin_44806700/article/details/124386700
今日推荐