问题描述

比较诡异的问题,美术同学给过来的特效资源,在Edtior里是正常播放的,但打包后特效里应该落下来的光柱却消失了。

问题分析

考虑到打包后的环境和Editor环境的区别

  1. AssetBundle
    通过在Editor里加载AssetBundle来播放,发现也是正常的,应该不是资源问题。
  2. ParticleSystem的Culling Mode
    粒子系统和Animator一样,默认是不在镜头内就不模拟的。由于光柱效果是从远处落下的,考虑有可能其落下位置是在镜头外导致了粒子效果没模拟。那为什么在Editor里是正常呢?因为Editor里可能会被Scene界面的镜头看到而触发了模拟(之前就试过在Animator踩过这个坑)。
    通过把相关粒子效果的Culling Mode都改成Always Simulate,再打包,发现问题没解决。。
  3. IL2CPP裁剪
    通过检查特效,发现里面用到了Timeline,而出现的光柱是通过Control Track里的Control Activation控制的,通过问答1和问答2发现这是官方的一个bug,IL2CPP裁剪时没有兼容AB包里用到的Timeline功能,导致各种被裁剪,关键是运行时也不报错。。。

解决方案

上面提到的问答里也说到了解决办法,但不是每个都有效。

  1. 通过把Timeline的package放在项目里,然后加[Preserve]标签明显是落后的办法,应该用link.xml
  2. 简单地通过在link.xml里加入下面配置,可以解决这个问题。
  1. 如果觉得preserve整个Assembly太浪费了,可以先记录下资源里用到Timeline的哪些类,然后通过ILSpy等工具查看其是否被裁剪了,然后对应加到link.xml里。但这个比较麻烦,我试过简单加上ActtivationTrackSignalReceiver也不行,所以还是要仔细比对。
  2. 通过做一个简单的Timeline资源,里面用到被裁剪的特性,然后把这个资源放在一个会被打包的Scene里(这个Scene不能放在AssetBundle),这样IL2CPP就能正确裁剪代码。(实测可行)

本文来自博客园,作者:agoo做独立游戏,转载请注明原文链接:https://www.cnblogs.com/agoo-indie/p/16775144.html