问题描述
比较诡异的问题,美术同学给过来的特效资源,在Edtior里是正常播放的,但打包后特效里应该落下来的光柱却消失了。
问题分析
考虑到打包后的环境和Editor环境的区别
- AssetBundle
通过在Editor里加载AssetBundle来播放,发现也是正常的,应该不是资源问题。 - ParticleSystem的Culling Mode
粒子系统和Animator一样,默认是不在镜头内就不模拟的。由于光柱效果是从远处落下的,考虑有可能其落下位置是在镜头外导致了粒子效果没模拟。那为什么在Editor里是正常呢?因为Editor里可能会被Scene界面的镜头看到而触发了模拟(之前就试过在Animator踩过这个坑)。
通过把相关粒子效果的Culling Mode都改成Always Simulate
,再打包,发现问题没解决。。 - IL2CPP裁剪
通过检查特效,发现里面用到了Timeline,而出现的光柱是通过Control Track
里的Control Activation
控制的,通过问答1和问答2发现这是官方的一个bug,IL2CPP裁剪时没有兼容AB包里用到的Timeline功能,导致各种被裁剪,关键是运行时也不报错。。。
解决方案
上面提到的问答里也说到了解决办法,但不是每个都有效。
- 通过把Timeline的package放在项目里,然后加
[Preserve]
标签明显是落后的办法,应该用link.xml
。 - 简单地通过在
link.xml
里加入下面配置,可以解决这个问题。
- 如果觉得preserve整个Assembly太浪费了,可以先记录下资源里用到Timeline的哪些类,然后通过ILSpy等工具查看其是否被裁剪了,然后对应加到
link.xml
里。但这个比较麻烦,我试过简单加上ActtivationTrack
和SignalReceiver
也不行,所以还是要仔细比对。 - 通过做一个简单的Timeline资源,里面用到被裁剪的特性,然后把这个资源放在一个会被打包的Scene里(这个Scene不能放在AssetBundle),这样IL2CPP就能正确裁剪代码。(实测可行)
本文来自博客园,作者:agoo做独立游戏,转载请注明原文链接:https://www.cnblogs.com/agoo-indie/p/16775144.html