项目中开始使用XLua有一段时间了,今天打算分享下在使用过程中的一些心得。遇到问题建议先看XLua的FAQ和官方文档,例子是最好的方法,因为我在使用中遇到问题去群里问,最后发觉不少问题都是FAQ里提到过的。
首先,就是在访问this[]这种类似中括号里获取某个属性的方式,在写lua脚本时总是获取不到,例如我在C#中有一个Animation对象animation,我想访问其中的一个AnimationState就可以直接animation["动画名"]这样获取,可是在lua中这样获取不到,查看了XLua官方的FAQ后发觉,如果你的XLua版本在2.1.11之上,那么可以用get_Item来获取值,用set_Item来设置值,比如刚才的需求可以写为animation:get_Item("动画名")如果是之下的版本,就只能自己在C#里封装一个方法然后导出给Lua这边使用,方法直接return animation["动画名"]就可以了,动画名就是传入C#方法的参数。
再者就是在使用C#和Lua交互,既互相调用的时候,建议使用文档中的用一个静态列表的方式,而不要使用在每一个类或者方法上去打标签[LuaCallCSharp],[CSharpCallLua]。不仅维护起来不方便,而且Generate时会生成大量代码。其中还需注意一个问题,就是如果项目中本身没有用到Unity的某个组件,而Lua脚本里用到了,切记一定要把这个组件放在LuaCallCSharp的静态列表里,否则很可能出现调用不了对应组件的功能的情况,我之前就是没有把刚体加入进去,而在使用刚体相关组件功能时一些属性获取不到,报nil,记得把这个包含配置交互的静态列表的类放到Editor目录下。
还有一个比较重要的问题就是重载含糊,产生这个问题的原因是因为Lua函数声明里没有参数类型,那么比如有的函数参数个数一样,但是参数的类型不一样,这样就导致Lua调用C#不知道该调用哪一个方法。比如发射射线的Physics.Raycast,解决的办法就是比如我自己写了一个叫PhysicsUtil的类,然后封装一些不会导致重载含糊的方法,最后把这个类添加到LuaCallCSharp的静态列表里,供Lua调用。
差不多在使用时主要遇到了这三个问题吧,以后有新的问题了再补充吧,最近因为一些事情状态不佳,也不知道何时能恢复过来,到那时在继续分享技术吧