美术制作场景中的各个地方有100来个火把吗?

美术制作场景中的各个地方有100来个火把吗?

在场景的艺术化制作过程中,会用到大量的粒子系统。就像现场的火炬一样。在我们的一个地牢场景中,美术师放置了很多火把。整个场景的各个地方大约有100个火炬。

在统一中3D角色,相机范围之外的粒子系统将不会被绘制。但是更新总是在进行。这也意味着 100 多个火炬正在更新,无论它们是否可见。

unity场景灯光_unity场景模型_unity加载大型场景

这种设计应该是很不合理的。在我见过的其他引擎中,会有一个开关来控制隐形粒子系统是否需要更新。一些粒子系统在不可见时需要更新unity场景灯光,例如爆炸。有些不需要更新unity场景灯光程序开发,例如火把。

unity场景灯光_unity加载大型场景_unity场景模型

为了避免不必要的更新开销,特别是最终游戏要发布到网页游戏平台(网页播放器只能使用一个cpu核心)。所以我写了一个脚本来控制隐形粒子系统而不是更新它。

unity加载大型场景_unity场景模型_unity场景灯光

该脚本主要使用了两个 MonoBehaviour 函数。OnBecameInvisible() 变为不可见时和 OnBecameVisible() 变为可见时。

unity场景模型_unity场景灯光_unity加载大型场景

这两个功能起作用的前提是 GameObject 绑定到 MeshRender 组件。因此,我们需要将粒子系统的GameObject放在一个GameObject下,并给GameObject绑定一个MeshRender和MeshFilter。MeshFilter 中的网格可以随意找到一个立方体。

unity加载大型场景_unity场景模型_unity场景灯光

在 Start() 处,将大多数 GameObject 的比例设置为非常小,以确保看不到立方体。其实就是遍历所有的children,设置active为false。

遍历 OnBecameVisible 中的所有子节点并将 active 设置为 true。

遍历 OnBecameInvisible 中的所有子节点并将 active 设置为 false。