【UE5】射线检测Channel静态变量初始化,一招搞崩你的程序
事情是这样的....
开发的程序一直都能稳定的打包,运行。直到有一天,诡异的事情发生了,无论是Android还是Win包,启动程序立即闪退。UE没有生成任何文件,没有任何log,就好像不曾点击过启动图标一样。但在PIE模式下,一切正常。
一切都发生得太突然,太懵逼,突然这么来一下,还真是摸不着头脑。后面静下心来,从0开始。无论什么问题,不还得从哪些解决问题的方法入手吗,线索少一点,并不代表不能开展工作了。
于是
第一步:还原现场,找到发生前和发生后项目中的差异。将时间回退,找出问题的时间节点,虽然这是一个笨方法,但不可否认他很有效。经过一番折腾,终于找到那些文件可能出现问题。(这时候版本管理工具就凸显出特别重要的作用)
第二步:分析嫌疑人。既然找到嫌疑人,那肯定凭借多年的办案经验,按个分析。写了这么些年代码,错误就摆在面前,还有版本管理工具辅助,找出问题不是分分钟的事吗?所有代码都分析了一遍,没得到结论,此时开始怀疑自己代码的基础功底了。
第三步:从0开始分析,既然启动就闪退,UE都还没来得及工作。那会不会跟静态变量初始化,静态代码块等相关?所以开始着手仔细看静态代码相关,同样毫无收获,难道这个方向也错了吗?
第四步:进一步缩小嫌疑范围。锁定最终代码文件。
结果:
由于调用UKismetSystemLibrary::LineTraceMultiForObjects进行射线检查需要用到TArray<TEnumAsByte<EObjectTypeQuery> >作为查询数组,在我们的功能里面,这个数组又是固定的,就想着初始化一次就好。不用每次都新建,所以将该对象创建为静态变量。代码如下:
该对象为静态对象,在程序启动时就会初始化。但进一步到UEngineTypes::ConvertToObjectType里面去看,并非全为静态,需要通过CDO访问配置文件,从而才能得到对象。此时,UE还未初始化好,CDO UClass也不存在,直接闪退了。
按这个理,所有用到UClass的东西设置为静态变量并初始化,应该都会出现该问题,大家可以试试去。