郑州网站改版,广东网站备案要多久,百度推广账号注册,wordpress采集接口1.Xlua的配置应用
xLua所有的配置都支持三种方式#xff1a;打标签#xff1b;静态列表#xff1b;动态列表。配置要求#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录#xff08;如果是H…1.Xlua的配置应用
xLua所有的配置都支持三种方式打标签静态列表动态列表。配置要求 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录如果是Hotfix配置而且类位于Assembly-CSharp.dll之外的其它dll必须放Editor目录
1.打标签
xLua用白名单来指明生成哪些代码而白名单通过attribute来配置该方式方便但在il2cpp下会增加不少的代码量不建议使用。
1.LuaCallCSharp
一个C#类型加了这个配置xLua会生成这个类型的适配代码包括构造该类型实例访问其成员属性、方法静态属性、方法。一个类型的扩展方法Extension Methods加了这配置也会生成适配代码并追加到被扩展类型的成员方法上。xLua只会生成加了该配置的类型不会自动生成其父类的适配代码当访问子类对象的父类方法如果该父类加了LuaCallCSharp配置则执行父类的适配代码。如果没有适配代码则会尝试用反射来访问但反射访问性能不佳在il2cpp下有可能因为代码剪裁而导致无法访问。
[LuaCallCSharp]
public class TestObj
{public void test(testStruct t){Debug.Log(${t.a},{t.c});}
} 上面的类加了此标签就会生成适配代码
2.ReflectionUse
一个C#类型类型加了这个配置xLua会生成link.xml阻止il2cpp的代码剪裁。对于扩展方法必须加上 LuaCallCSharp 或者 ReflectionUse 才可以被访问到。建议所有要在Lua访问的类型要么加LuaCallCSharp要么加上ReflectionUse这才能够保证在各平台都能正常运行。
如何配置
[ReflectionUse]
public class TestReflectionUseObj
{}
link.xml保存着打上LuaCallCSharp和ReflectionUse标签的类 3.DoNotGen
指明一个类里头的部分函数、字段、属性不生成代码通过反射访问。 只能标准 DictionaryType, Liststring 的field或者property。key指明的是生效的类value是一个列表配置的是不生成代码的函数、字段、属性的名字。
如何配置
[LuaCallCSharp]
public class TestDontGen
{public int a1;public int a2;
}
1.打标签(这种方式行不通) 在生成代码中a2还是生成和a1一样的适配函数 2.静态列表
public static class ExportCfg
{[DoNotGen]public static DictionaryType,Liststring dontGenDic new DictionaryType, Liststring {[typeof(TestDontGen)] new Liststring { a2 },};
} 4.CSharpCallLua
把一个lua函数适配到一个C# delegate一类是C#侧各种回调UI事件delegate参数比如ListT:ForEach另外一类场景是通过LuaTable的Get函数指明一个lua函数绑定到一个delegate或者把一个lua table适配到一个C# interface时使用该标签。
如何配置 [CSharpCallLua]public interface IPlayerPosition{int x { get; set; }int y { get; set; }int z { get; set; }void add(int x, int y, int z);void sub(int x, int y, int z);}[CSharpCallLua]public delegate void AddMethod(LuaTable self, int x, int y, int z);[CSharpCallLua]public delegate Action addAc(LuaTable t, int x, int y, int z);[CSharpCallLua]public delegate void test1(int x);[CSharpCallLua]public delegate Action test2(int x);
生成代码如下接口生成独立文件委托事件生成在DelegateGenBridge文件中 5.GCOptimize
xLua无参构造函数的复杂类型struct的默认传递方式是引用传递当lua侧使用完毕释放该对象的引用时会产生一次gc。 一个C#纯值类型注指的是一个只包含值类型的struct可以嵌套其它只包含值类型的struct或者C#枚举值加上这个标签之后XLua会生成gc优化代码在lua和c#间传递将不产生C#gc alloc该类型的数组一维访问也不产生gc。
如何配置
[GCOptimize]
public struct TestGCOptimizeValue
{public int a;public int b;public float f;
}
struct 满足条件如下
1.struct允许嵌套其它struct但它以及它嵌套的struct只能包含这几种基本类型byte、sbyte、short、ushort、int、uint、long、ulong、float、double例如UnityEngine定义的大多数值类型Vector系列QuaternionColor。。。均满足条件或者用户自定义的一些struct 2.该struct配置了GCOptimize属性对于常用的UnityEngine的几个structVector系列QuaternionColor。。。均已经配置了该属性这个属性可以通过配置文件或者C# Attribute实现 3.使用到该struct的地方需要添加到生成代码列表
6.AdditionalProperties
该标签GCOptimize的扩展配置如果struct有的字段是私有的需要通过属性来访问这时就需要用到该配置默认情况下GCOptimize只对public的field打解包
如何配置
[GCOptimize]
public struct TestGCOptimizeValue
{public int a;public int b;[AdditionalProperties]float f;
}
7.BlackList
一个类型的一些成员不需要适配代码可以通过加上该标签来实现。考虑到有可能需要把重载函数的其中一个重载列入黑名单配置方式比较复杂类型是 ListListstring对于每个成员在第一层List有一个条目第二层List是个string的列表第一个string是类型的全路径名第二个string是成员名如果成员是一个方法还需要从第三个string开始把其参数的类型全路径全列出来。
如何配置
[LuaCallCSharp]
public class TestBlackList
{public int a1;public int a2;public void Test(){}
}
若不加处理生成代码如下 1.打标签
C#代码
[LuaCallCSharp]
public class TestBlackList
{public int a1;[BlackList]public int a2;[BlackList]public void Test(){}
}
生成代码如下 2.静态列表
列表中的第一个字符串是类型第二个及以后是要屏蔽的字段 [BlackList]public static ListListstring BlackList new ListListstring(){new Liststring(){ TestBlackList, a2},new Liststring(){ TestBlackList, Test}};
生成代码 注 DoNotGen和ReflectionUse的区别是1、ReflectionUse指明的是整个类2、当第一次访问一个函数字段、属性时ReflectionUse会把整个类都wrap而DoNotGen只wrap该函数字段、属性 DoNotGen和BlackList的区别是1、BlackList配了就不能用2、BlackList能指明某重载函数DoNotGen不能
2.静态列表
有时我们无法直接给一个类型打标签比如系统api没源码的库或者实例化的泛化类型这时可以在一个静态类里声明一个静态字段然后为这字段加上标签并且这个字段需要放到一个静态类里建议放到 Editor目录。
如何配置
public static class ExportCfg
{[DoNotGen]public static DictionaryType, Liststring dontGenDic new DictionaryType, Liststring{[typeof(TestDontGen)] new Liststring { a2 },};[BlackList]public static ListListstring BlackList new ListListstring(){new Liststring(){ TestBlackList, a2},new Liststring(){ TestBlackList, Test}};
}
3.动态列表
声明一个静态属性打上相应的标签即可。
见HotFix。
2.HotFix
3.其他 1.Unity协程的使用
未完待续。。。
参考链接
介绍 — XLua (tencent.github.io)