LayaAir UnityPlugin反编译和BoxCollider的Bug修复

反编译
使用JetBrain的ReSharper或dotPeek反编译LayaAir3D/LayaTool/LayaAirLibrary.dll
将dll中的4个cs文件的代码复制粘贴到新文件中。

1.png


(JSONObject反编译后问题较多,所以我没有做成源代码,大家可以自行尝试。)
此时,往往编译不通过。找到报错的地方,会发现有很多反编译不成功的代码。
例如:

2.png


手动改成

3.png


其他错误往往类似。
通篇改一遍,大约10分钟可以完成。(不同的反编译工具生成的代码略微不同,有的错误更多,需要用正则表达式自动化替换。试过.NetReflector,问题非常多。ILSpy还没有试过。)
将源码放在Unity工程里。

4.png



修改BUG
之所以要反编译这个导出工具,是因为它有个严重的bug——BoxCollider导出时center.x属性没有加负号!
我们知道Laya和Unity的x轴是反的,所以在导出Transform组件的position时,程序员添加了* -1:

5.png


然而在导出BoxCollider组件时,没有* -1。找到public static void getBoxColliderComponentData(GameObject gameObject, JSONObject component)方法:

6.png


所以我们要修复这个bug。很简单,加一个负号即可:

7.png


这个时候,Unity工程里有LayaAirLibrary.dll和它的源码。Unity在Import新的文件后,发现了两份代码的冲突,却很体贴地帮我们选择了执行源码,忽略dll。可以从如下Warning中看到。

8.png


当我们运行LayaAir Export时,执行的则是我们修改过的源码。因为JSONObject没有源码,所以我必须将dll保留在工程里,而这样就可以按我们的需求编译通过了,实属幸运。如果要证明我们运行的是源码,可以在DataManager.cs的public static void getData()方法开头加一行log。
如果有朋友没有看到如图的Warning,且执行的还是dll,可以让Unity重新导入dll,例如直接点击Re-import,或者将dll移除去→编译→再移回来→编译,或者将dll的Import Settings里的√去掉→Apply→再点上→再Apply。
已邀请:

xiaosong

赞同来自:

谢谢分享。

158*****076

赞同来自:

大佬请教下,2.1.1版的LayaAirLibrary反编译后,各种文件名,类名,变量名都很奇怪,用了de4dot去混淆后也没多大用,请问该怎么办。。。
Laya.png

 

要回复问题请先

商务合作
商务合作