我开发了 River Modeler 资产于 2024 年,以便使用 Unity Splines 和 MicroVerse 来创建装饰的河流。确定 Spline API 和网格生成、VFX 和所有内在挑战的优先级很高。这意味着几乎没有时间来探索和学习围绕 Burst 和 Job 系统的设计。

这意味着网格生成在长 Spline 上并不是足够快的。Unity 的 Mesh 类有很多内部的安全措施和内存复制,因此仅仅分配一组顶点就需要消耗处理能力。

工作 + 网格数据

版本 2 Seeing 全面的转换到工作/突发事件中,河流被分成段以并行处理。这本身产生了 x24 的性能提高。

工作系统的好伴侣是 MeshData API,它提供了设置网格顶点数据的直接内存的方式。这种交易是正确的数据需要。有很少的安全措施,这使其约 x17 快速!

总体而言,性能改进是显著的,并且使工具在使用中非常流畅,甚至在几公里长的河流中也如此。

分支河流

Spline 节点可以连接在一起,Spline API 提供了有关此信息的信息。我已经使用此信息来构造一个与进入/离开 Spline 的虚拟平面相垂直的平面。位于该平面的另一侧的顶点上会应用一个顶点颜色,shader 然后使用它来添加透明度。

这使得两条河流的表面融合得很好,没有依赖流动图。

VFX 图

版本 1 整洁地将粒子位置存储在 Nx1 分辨率的 `Texture2D` 中(n=粒子数量),并且可以使用 `VFX Graph` 来设置每个粒子的发射位置。

虽然在 `Texture2D` 上设置像素值相对较慢,这也会导致工具在河流很长且多个瀑布时变得笨拙。

版本 2 使用 `GraphicsBuffer`,它存储了一个 `ParticleEmitter` 结构的数组(位置/速度/尺寸)。如果你在任何结构上添加 `[VFXType(VFXTypeAttribute.Usage.GraphicsBuffer)]` 属性,它就可以用这种方式使用。

这是一个很大的胜利:每个粒子有更多的数据,并且直接数据分配!

音频

版本 1 在 Spline 上spawn了 Audio Sources,给了河流表面一个生动的感觉。然而,这可能会导致几百个独立 GameObject,负面地影响场景大小和加载时间。

创建河流音频的常见方法是使用“车”方法。即一个单独的 `Audio Source` 跟随着摄像机,同时被限制在 Spline 上。这通常有效,但如果 Spline 有大/强的转弯,Audio Source 就会跳到 Spline 曲线的另一侧。它也完全无法工作于分支河流。

版本 2 代替将音频 spawn 点分布在 Spline 上。每个点都定义了一个位置、半径和类型(流/急流/瀑布)。一个专门的 Audio Manager 检查哪些河流段落在/离开了可听范围,并且在每个 spawn 点上设置 Audio Sources。相比之下,只有几十个 GameObject 在运行时使用。

结果是高度优化的音频流媒体解决方案,可以适应巨大的世界!

与其他资产的集成

我还在进一步完善这个工具,以它作为 Stylized Water 3 的专门的河流工具扩展。它已经支持河流类型的着色和动画,只需要一个合适的河流网格来使用,这个工具可以提供。

地形雕刻和绘画完全委托给 MicroVerse,因为这需要一个非破坏性的过程。工具操纵 Spline Path 组件来创建河流岸边和河床。