在场景的艺术化制作过程中,会用到大量的粒子系统。就像现场的火炬一样。在我们的一个地牢场景中,美术师放置了很多火把。整个场景的各个地方大约有100个火炬。
在统一中3D角色,相机范围之外的粒子系统将不会被绘制。但是更新总是在进行。这也意味着 100 多个火炬正在更新,无论它们是否可见。
这种设计应该是很不合理的。在我见过的其他引擎中,会有一个开关来控制隐形粒子系统是否需要更新。一些粒子系统在不可见时需要更新unity场景灯光,例如爆炸。有些不需要更新unity场景灯光程序开发,例如火把。
为了避免不必要的更新开销,特别是最终游戏要发布到网页游戏平台(网页播放器只能使用一个cpu核心)。所以我写了一个脚本来控制隐形粒子系统而不是更新它。
该脚本主要使用了两个 MonoBehaviour 函数。OnBecameInvisible() 变为不可见时和 OnBecameVisible() 变为可见时。
这两个功能起作用的前提是 GameObject 绑定到 MeshRender 组件。因此,我们需要将粒子系统的GameObject放在一个GameObject下,并给GameObject绑定一个MeshRender和MeshFilter。MeshFilter 中的网格可以随意找到一个立方体。
在 Start() 处,将大多数 GameObject 的比例设置为非常小,以确保看不到立方体。其实就是遍历所有的children,设置active为false。
遍历 OnBecameVisible 中的所有子节点并将 active 设置为 true。
遍历 OnBecameInvisible 中的所有子节点并将 active 设置为 false。