中EN
概念页

水体系统

Water System

更新于 2026-10-13 约 5 分钟UE5水体Water样条四叉树LOD

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:

Nquads(L+1)=14 Nquads(L)N_{\text{quads}}(L+1)=\tfrac14\,N_{\text{quads}}(L)

这与地形的 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 应该常驻还是随流送加载,官方没有给出建议,这一点仍未解决。
  1. Water System in Unreal Engine UE 5.8 文档
  2. Water Body Actors in Unreal Engine UE 5.8 文档
  3. Water Meshing System and Surface Rendering in Unreal Engine UE 5.8 文档
  4. unreal.WaterZone — Unreal Python 5.8 (Experimental) documentation Navigation index next Unreal Python 5.8 API
  5. unreal.WaterBody — Unreal Python 5.8 (Experimental) documentation Navigation index next Unreal Python 5.8 API

相关页面

游戏开发 · UE5地形系统LandscapeUE5 的 Landscape 把地形切成大小相同的正方形组件 (Component),组件是渲染、可见性计算和碰撞的基本单位;每个组件可以再分成 1 个或 2×2 个分段 (Section),分段是 LOD 计算的基本单位。分段的顶点数必须是 2 的幂(最大 256×256),这样不同 LOD 可以存进高度纹理的 mipmap。地形材质用 Landscape Layer Blend 节点按权重图混合多个图层。图形学细节层次Level of Detail细节层次 (LOD) 在物体对图像贡献变小时改用更简单的表示。LOD 系统由三部分组成:生成(简化或手工制作多个版本)、选择(按距离、投影面积等收益函数挑选)、切换(尽量减少跳变 popping)。LOD 主要减少顶点处理,也通过减少 quad 过度着色降低像素开销;进一步还可在预算约束下全局选择 LOD,实现时间关键(恒定帧率)渲染。游戏开发 · UE5世界分区World Partition世界分区 (World Partition) 是 UE5 的自动数据管理与基于距离的关卡流送 (Level Streaming) 系统:整个世界存为一个持久关卡,按可配置的运行时网格划分为单元格 (Cell),由流送源 (Streaming Source,默认是玩家控制器) 按距离加载/卸载。它配合一 Actor 一文件 (One File Per Actor, OFPA) 支持多人协作编辑,用数据层 (Data Layers) 按玩法状态切换内容,用分层细节层次 (Hierarchical Level of Detail, HLOD) 在远处以代理网格显示未加载的单元格。游戏开发空间分区Spatial Partition空间分区 (Spatial Partition) 把对象按位置存进空间数据结构,使“找出某位置附近的对象”这类查询不必遍历所有对象,把 O(n) 或 O(n^2) 的操作降下来。最简单的是固定网格;还可以选层次结构(四叉树、BSP、k-d 树、BVH),以及边界固定或随对象自适应的划分方式。代价是对象移动时要更新结构,并且要额外占用内存。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原