恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

u3d插件xLua[五]xLua特性和生成配置

  • 首页
  • 资讯中心
  • /
  • u3d插件xLua[五]xLua特性和生成配置

相关资讯

2026国内精密行星减速机厂家最新解析推荐 2026/8/13 9:57:43
2026年数学建模国赛A题算法(12):相平面分析与稳定性判断在自治系统中的应用研究 2026/8/13 9:57:43
Claude Code实践指南:从AI编程工具到智能体工程范式的转型 2026/8/13 9:52:43

最新资讯

2026 PC 浏览器推荐横评:Chrome/Edge/360 深度对比,国内用户到底该选谁?
simdjson:利用 SIMD 指令实现 GB/s 级 JSON 解析的 C++ 开源库
基于Docker的AI代理安全沙箱:原理、部署与工程实践
C++ std::deque 底层实现深度解析:分块存储、中控映射与双端扩容
VisualCppRedist AIO 使用指南:3步装齐2005到2022全部VC++运行库,彻底告别DLL报错
电脑硬件的“体检报告“,为什么发烧友和运维人员都装它?

今日推荐

VSCode插件精选:从AI补全到代码规范,打造高效开发环境
如何快速完成文件批量重命名:FreeReNamer终极指南
2026年横评:宁波3大学科小升初机构全面对比

本周热门

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁
如何快速生成中国车牌图片:Python开源工具完整指南
当 LLM 遇见大文档:主流开源项目如何处理上下文超限

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

u3d插件xLua[五]xLua特性和生成配置

发布时间:2026/8/13 9:57:43
u3d插件xLua[五]xLua特性和生成配置 讲解xLua特性和生成配置一.概述执行XLua-Generate Code菜单后会在XLua/Gen下生成若干文件用于特性C#和Lua互相访问的性能掌握xLua特性和生成配置(静态列表、动态列表)可以对生成过程有更好掌控。参考xLua的配置二.配置这里配置指的是代码中的一种写法让特性应用于代码生成下面以特性[LuaCallCSharp]类名ClassA举例2.1 打标签ClassA上加特性[LuaCallCSharp]using UnityEngine; using XLua; namespace XLuaTest { [LuaCallCSharp] public class ClassA : MonoBehaviour { public void Func1() { } } }执行XLua-Generate Code生成了XLuaTestClassAWrap.cs2.2 静态列表有时无法直接给一个类型打标签比如系统api没源码的库实例化的泛化类型这时可在一个静态类里声明一个静态字段该字段的类型除BlackList和AdditionalProperties之外只要实现了IEnumerableType就可以了这两个例外后面具体会说然后为这字段加上标签ExampleGenConfig.cs中有静态列表的应用我们把ClassA的特性删除然后在ExampleGenConfig中新建一个静态列表加入ClassA执行XLua-Generate Code生成了XLuaTestClassAWrap.cs2.3 动态列表做法是在静态类中声明一个静态属性打上相应的标签在Getter方法中return 一个集合。如此可实现多种效果比如按名字空间配置按程序集配置等等。public static class ExampleGenConfig { [LuaCallCSharp] public static ListType by_property { get { return (from type in Assembly.Load(Assembly-CSharp).GetTypes() where type.Namespace XLuaTest select type).ToList(); } } }执行XLua-Generate Code生成了XLuaTestClassAWrap.cs三.特性3.1 [LuaCallCSharp]一个C#类型加了这个配置执行XLua-Generate Code会生成这个类型的适配代码包括构造该类型实例访问其成员属性、方法静态属性、方法否则将会尝试用性能较低的反射方式来访问。一个类型的扩展方法Extension Methods加了这配置也会生成适配代码并追加到被扩展类型的成员方法上。xLua只会生成加了该配置的类型不会自动生成其父类的适配代码当访问子类对象的父类方法如果该父类加了LuaCallCSharp配置则执行父类的适配代码否则会尝试用反射来访问。对ClassA加[LuaCallCSharp]后生成代码如下文件会变化[LuaCallCSharp] public class ClassA : MonoBehaviour { public void Func1() { } }3.2 [CSharpCallLua]如果希望把一个lua函数适配到一个C# delegate一类是C#侧各种回调UI事件delegate参数比如ListT:ForEach另外一类场景是通过LuaTable的Get函数指明一个lua函数绑定到一个delegate。或者把一个lua table适配到一个C# interface该delegate或者interface需要加上该配置。实测委托FDelegate加[CSharpCallLua]后生成代码DelegateBridge内会加很多代码[CSharpCallLua] public delegate int FDelegate(int a, string b, out DClass c);3.3 [ReflectionUse]一个C#类型类型加了这个配置xLua会生成link.xml阻止il2cpp的代码剪裁。对于扩展方法必须加上LuaCallCSharp或者ReflectionUse才可以被访问到。建议所有要在Lua访问的类型要么加LuaCallCSharp要么加上ReflectionUse这才能够保证在各平台都能正常运行。对ClassA加[ReflectionUse]后生成代码link.xml产生如下变化3.4 [DoNotGen]指明一个类里头的部分函数、字段、属性不生成代码通过反射访问。[DoNotGen]不支持标签它的用法只能用静态列表的形式。使用时需要定义一个static DictionaryType, Liststring的字段Dictionary的key指明的是生效的类value是一个列表配置的是不生成代码的函数、字段、属性的名字。见如下example:public static class ExampleGenConfig { [DoNotGen] public static DictionaryType, Liststring DoNotGenCfg new DictionaryType, Liststring() { { typeof(XLuaTest.ClassA), new Liststring() {Func1} } }; }生成代码后XLuaTestClassAWrap的变化如下3.5 [GCOptimize]用[GCOptimize]修饰后纯值类型 struct 和 enum 可以做到 0 GC包含引用类型的 struct 如果有无参构造虽不能完全 0 GC但能大幅减少 GC 次数如果struct用了有参构造或自动属性这个特性就失效了加上GCOptimize后生成代码如下文件会变化[GCOptimize] [LuaCallCSharp] public struct Pedding { public byte c; }3.6 [AdditionalProperties][AdditionalProperties]是GCOptimize的扩展配置由于GCOptimize只对public的field进行优化AdditionalProperties用来支持struct把field做成是私有的通过property来访问field的情况。其用法不支持标签通常用静态列表写法来看一个例子StrctTest它的字段m_Origin是私有的通过属性origin访问namespace XLuaTest { public struct StrctTest { private Vector2 m_Origin; public Vector2 origin { get { return m_Origin; } set { m_Origin value; } } } }使用静态列表加上AdditionalProperties特性其用的是属性origin不是原有字段m_Origin然后执行生成代码public static class ExampleGenConfig { [GCOptimize()] private static ListType listGCOpt new ListType(){ typeof(StrctTest) }; [AdditionalProperties] private static DictionaryType, Liststring AdditionalProperties new DictionaryType, Liststring(){ {typeof(StrctTest), new Liststring { origin, }}, }; }生成代码新增了对origin的处理3.7 [BlackList]用来指定C#类中成员既不生成wrap代码也在Lua中不能通过反射访问。可通过标签或静态列表实现来看一个例子[LuaCallCSharp] public class ClassA { public void Func1() { Debug.Log(ClassA.Func1); } }function start() local a CS.XLuaTest.ClassA() a:Func1() end显示打印通过标签的方式加上BlackList特性后执行生成代码报错Func1为nil[LuaCallCSharp] public class ClassA { [BlackList] public void Func1() { Debug.Log(ClassA.Func1); } }由于考虑到有可能需要把重载函数的其中一个重载列入黑名单配置方式比较复杂类型是ListListstring对于每个成员在第一层List有一个条目第二层List是个string的列表第一个string是类型的全路径名第二个string是成员名如果成员是一个方法还需要从第三个string开始把其参数的类型全路径全列出来。例如下面是对 GameObject 的一个属性以及FileInfo的一个方法列入黑名单[BlackList] public static ListListstring BlackList new ListListstring() { new Liststring(){UnityEngine.GameObject, networkView}, //new Liststring(){ typeof(UnityEngine.GameObject).FullName, networkView}, new Liststring(){System.IO.FileInfo, GetAccessControl, System.Security.AccessControl.AccessControlSections}, //new Liststring(){ typeof(System.IO.FileInfo).FullName, GetAccessControl,typeof(System.Security.AccessControl.AccessControlSections).FullName }, };因此判断项目中是否用静态列表加黑名单只需要搜索ListListstring就可以了

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号