Notifications
Article
爬坑篇之 2019.3坑(又名:性感程序化身名侦探)
Updated a month ago
1.1 K
16
BDFramework一个高效的开发工作流,绝对不是几个库一凑那种~
BDFramework:Simple! Easy! Beautiful! This is a powerful Unity3d game workflow!
框架地址:
码云: https://gitee.com/yimengfan/BDFramework.Core,
gayhub :https://github.com/yimengfan/BDFramework.Core
第九艺术 、第十艺术讨论群 : 763141410

前言:

最近在为BDFrame适配Unity2019.3,遇到一个坑,解决过程也挺有意思的。这边把整个过程记录给大家,希望能给大家一点爬坑上的启发~
不过这次遇坑的这坨代码,肯定是unity实习生写的,
强烈谴责!!!
强烈谴责!!!
强烈谴责!!!
爬坑关键字(方便后来者搜索):Unity2019 keyword

0x001 问题的发现:

适配2019的过程中,大多是一些小坑,但是到我们 搜集 KeyWord的时候,直接error了。
事情是这样的
2018中有个收集Keyword的接口长这样:

别问我为啥用反射调用,问Unity官方去~
然而2019用不了啊~
然后2019我们找了一遍,接口变了,心想:变了也就变了吧,继续反射调用.
Unity2019接口长这样:

然后,我就反射吧,接口改了就改了吧~
....
紧接着,调用之后,熟悉的事情就来了

蹦蹦蹦~
别问我这张图怎么来的,我为了复现情况,专门搞得!!!
像我这么敬业的UP主,也是绝无仅有了,欢迎大家一键三连~~~

0x010 开始解决:从崩溃日志查起:


查看日志堆栈:

从下往上看:
  • 1.红色的第一行是我C#代码中开始反射调用
  • 2.红色第二行是Unity C#源码最后的调用
  • 3.黄色那个框框,没法石锤,但是能猜测.
第一,那个"::"调用出卖了他,虽然C#也有::但是这个明显是函数调用,所以熟悉的味道:这个是C++层的代码。
第二,其他的log类型 都是mono -jit,就这三个是(unity)。当然咱也没证据,咱也买不起源码
行吧,日志只给了我这么点,
但是有个很奇怪的地方:这个搜集Keyword的接口,
会调用ShaderVariantCollection相关接口,但是做了啥。咱也不知道~
当时也只是觉得奇怪~

0x011 Google大法:

goole上搜索关键字: GetShaderVariantEntriesFiltered

很惨,只有3个答案:
  • 1.第一个是知乎老哥,他是今年7月份写的代码,跟我一样,pass,他肯定没遇到相关问题。
  • 2.后面两个是Unity编辑器相关的代码,
最后我发现 ShaderVariantCollection的Inspector 调用了这个接口,于是乎我就去
反编译编辑器的Inspector查看。
又得到一个很重要的结果!
这个inspector上,这个界面会调用搜集keyword的接口:


此时我又陷入了沉思,到底有什么不同~~
此时我又陷入了沉思,到底有什么不同~~

0x100 我的名侦探之路:

整理线索:
1.这个接口他最后会调用ShaderVariantCollection某些东西
2.inspector内部调用GetShaderVariantEntriesFiltered没问题
我与他们调用的区别在哪?

分析传参:
只有这个ShaderVariantCollection(后称:SVC),不同,我传参这个SVC是我手动new的。(2018中也是这么干~)
我在尝试所有可能性后,做出了最不可能的猜测:

莫非就是这个SVC不同?
他在SVC的Inspector中,能呼出这个面板,能调用成功,有个前提。
也就是SVC中有这个Shader!!!
震惊,我心想Unity接口设计不至于这样子吧~
于是,
1.我在调用接口前,搜集项目中所有的Shader,输出到一个Tools的SVC中~

2.然后用这个SVC进行传参!

Fuxx!!
成功!!!
结论:
于是以上也解释通了:
  • 1.凶手要求用SVC传参,并且SVC中存在这个Shader,所以存在凶手最后在c++层调用了SVC相关接口!
  • 2.而凶手不会蹦蹦蹦的原因是:他只有那个二级窗口调用受害接口GetShaderVariantEntriesFiltered,而能显示出这个二级窗口的入口先决条件是,该SVC有这个Shader。(逻辑鬼才)
  • 3.因此我分析,这个ShaderUtil的 getKeyword接口,全局只有凶手用到,
  • 并且凶手写这个接口只是为了他的Inspector。
但是,getkeyword 只是做一下语法 词法分析,为何会依赖SVC?咱也不敢问~
要我说这个接口设计:
要么SVC.GetShaderKeyword(shader shader),
此时svc中没有shader,return null我也理解。
要么就ShaderUtil.GetShaderKeyword,专门写个功能做词法分析也行.
这种逻辑鬼才型接口设计,enmmmm....
我只想说,如果我们团队中,有人这么设计接口:
我会对他一顿胖揍!
我会对他一顿胖揍!
我会对他一顿胖揍!
以上,只是笑话,当然也希望能给大家一些爬坑的解决思路~
最后我修改了我的title:
Tags:
奶泡泡.(B道友)
Unity3d名侦探 - Programmer
9
Comments
Unity3d名侦探
超级汽水是实体的奖励啦,什么背包一类的,在微信公众号上有清单
卒~
0
超级汽水
21 days ago
超级热爱
奶泡泡.(B道友)我就想知道开运大礼包是啥,一年份的unitypro么?
是实体的奖励啦,什么背包一类的,在微信公众号上有清单
0
Unity3d名侦探
达达尼亚私信给你啊
我就想知道开运大礼包是啥,一年份的unitypro么?
0
达达尼亚
21 days ago
xunshu@zhang zhidong 感谢支持中文原创,恭喜获得新年开运大礼包,收货地址私信我哦~
私信给你啊
0
Unity3d名侦探
xunshu@zhang zhidong 感谢支持中文原创,恭喜获得新年开运大礼包,收货地址私信我哦~
这么惨,我有奖么
0