水体系统
Water System
UE5 的 Water 插件用样条 (Spline) 定义海洋、湖泊、河流和自定义水体,它们会自动通过 Landscape 笔刷在地形上挖出河床和湖底。所有水体共用由 Water Zone 生成的同一套瓦片网格,因此相互衔接无缝。网格 LOD 每帧遍历四叉树生成,相邻 LOD 之间平滑变形过渡,远处用一块远景网格填补到地平线。
启用与定位
Water 系统是一个独立插件,用基于样条的流程创建与 Landscape 地形协同工作的河流、湖泊和海洋。它统一了着色和网格渲染管线,水面支持物理交互,也支持与玩法结合的流体模拟,例如脚步激起的涟漪、船后的尾流。在 Plugins 中启用 Water 并重启编辑器;插件自带的材质和示例在 Water Content 目录下(需要勾选显示引擎和插件内容)。(Water System in Unreal Engine)
水体 Actor
Water Body Actor 定义水面的位置、形状和相互过渡,同时决定波浪运动、水面着色和水下后处理;每个水体都带有深度和流向信息。(Water Body Actors in Unreal Engine)
| 类型 | 样条 | 特点(官方) |
|---|---|---|
| Ocean | 闭合样条构成海岸线 | 所有点高度相同,水面一直渲染到远处 |
| Lake | 闭合样条 | 所有点高度相同,挖出下方地形 |
| River | 开放样条,有起点终点 | 点的高度可以不同,沿路径挖出河床 |
| Custom | 有样条供查询,但形状由静态网格定义 | 自定义水面 |
另有一种只用来抬高样条区域内地形的类型,可以做出玩法上不算在水下的水下区域。水体通过 Landscape 笔刷自动在地形上挖出下方区域,前提是 Landscape 启用了 Edit Layers。(Water Body Actors in Unreal Engine)地形见 地形系统。
水面网格与 Water Zone
Water 系统有自己基于样条的网格系统。必须在场景中放置 Water Zone 才能生成水面;Water Zone 本身不渲染任何东西,它为关卡中所有水体统一设置网格属性。样条决定在哪里绘制水面瓦片,只渲染相机视野内可见的瓦片。所有水体使用同一个网格,因此能无缝融合;r.Water.WaterMesh.ShowWireframe 1 可以查看线框。(Water Meshing System and Surface Rendering in Unreal Engine)
LOD 生成方式:每帧遍历一棵四叉树,得到屏幕上可见的一组优化瓦片,并尽可能按 LOD 合并,把密度集中在离相机近的地方。与静态网格按屏幕尺寸突然切换 LOD 不同,水面瓦片在 LOD 之间变形过渡:降一级时 4 个四边形变形为 1 个,升一级时变为 16 个。(Water Meshing System and Surface Rendering in Unreal Engine)每降一级,边长方向的四边形数量减半,面积方向减为原来的 1/4:
这与地形的 Chunked LOD 思路一致,通用理论见 细节层次。
flowchart TB
A["每帧遍历四叉树"] --> B{"瓦片在视野内?"}
B -->|"否"| C["跳过"]
B -->|"是"| D["按距相机远近选 LOD"]
D --> E["相邻 LOD 平滑变形 4 合 1"]
E --> F["Extent in Tiles 之外: Far Distance 远景网格"]图中最后一步对应海洋的远景:Water Mesh Actor 的 Tile Size(默认 2400)决定单块瓦片大小,Extent in Tiles(默认 64)决定瓦片数量,Far Distance 网格填补最远瓦片到地平线之间的空隙。它位于海洋基准高度略下方以避免裁切和接缝,并且使用单独的 Far Distance Material。(Water Meshing System and Surface Rendering in Unreal Engine)
取舍
- 水体与地形挖掘依赖 Edit Layers,旧地形需要先开启。
- 增大 Tile Size 会整体放大瓦片,覆盖更远但精度下降;Extent 越大瓦片越多(据官方参数说明归纳)。
- 与 世界分区 配合:官方没有专门的说明页,只能依据 5.8 Python API。WaterZone 和 WaterBody 都有
is_spatially_loaded:为 true 时 Actor 在流送源范围内才加载(如果属于数据层,还要求数据层启用),为 false 时只看数据层;还有runtime_grid,用来指定放进哪个分区网格。WaterZone 还有enable_local_only_tessellation:开启后,WaterInfoTexture 只覆盖观察点周围的一个滑动窗口(大小由 LocalTessellationExtent 决定),水面信息纹理和水面四叉树都在运行时重新生成,适合超大世界。overlap_priority决定多个 Water Zone 重叠时,没有手动指定 Zone 的水体归属哪一个。(unreal.WaterZone — Unreal Python 5.8 (Experimental) documentation Navigation index next unreal.WaterBody — Unreal Python 5.8 (Experimental) documentation Navigation index next)Water Zone 应该常驻还是随流送加载,官方没有给出建议,这一点仍未解决。
出处
- Water System in Unreal Engine UE 5.8 文档
- Water Body Actors in Unreal Engine UE 5.8 文档
- Water Meshing System and Surface Rendering in Unreal Engine UE 5.8 文档
- unreal.WaterZone — Unreal Python 5.8 (Experimental) documentation Navigation index next Unreal Python 5.8 API
- unreal.WaterBody — Unreal Python 5.8 (Experimental) documentation Navigation index next Unreal Python 5.8 API