UE5山地场景制作全流程:从地形雕刻到光照叙事
2026/9/8 6:36:48 网站建设 项目流程

在 UE5.7.4 里创建“山地日记”这个山地场景时,最考验人的不是某个按钮在哪,而是如何把地形、植被、光照、雾气和叙事串成一条逻辑线。很多人打开空项目后第一反应是刷地形,结果山是堆出来了,拍照也还行,但角色一走进去会发现草木比例不对、光影发灰、视线被挡死,整个场景没有“日记感”。这篇文章会把一条完整的制作链路拆开讲:从项目创建、地形雕刻、植被铺装,到光照后期、交互日记点、运行验证和性能优化,最后给你一张可以直接拿去对照的检查清单。上手前先记住一个观念:环境制作不是拼资产,而是布置一条让玩家愿意活动的路线。

1. 先理解“山地日记”这个环境要解决什么问题

1.1 环境叙事:为什么不是随便摆一座山

“山地日记”这个名字本身包含着一条叙事线索:一个在山里活动的人,沿途留下日记,玩家通过环境来发现这些记录。所以场景不能是均匀的山坡加满地图的树,而应该设计成“一段可被发现的路径”:山谷入口、溪流边、半山平台、悬崖观景点、废弃木屋,每一处都要有朝向和视野。

环境叙事的地图设计目标和纯竞技射击地图不一样:竞技地图要求结构对称、路线清晰、交战距离可控;而叙事场景要求地形有主次、有遮挡、有收放。雕刻山体的时候,优先考虑“玩家的视线在哪里被挡住,在哪里突然打开”,而不是“哪个顶点更陡峭”。

做这个场景之前,先在纸上画一张粗略路线图:从山脚营地的日记出发,沿溪流上行,翻过一处山脊,到达能看到整片山谷的日记点。之后的所有地形雕刻、植被摆放、光照方向,都围绕这条路线安排。

1.2 UE5 环境制作涉及的核心系统

在 UE5.7.4 中做一个室外场景,需要用到的系统比室内场景更复杂。户外环境的视觉表现不再是靠单盏点灯和一堵墙反射,而是由多个系统共同决定:

  • 地形 Landscape:负责大范围地表高度和颜色分层。
  • 植被 Foliage:负责树木、灌木、草和岩石的分批摆放。
  • 天空与大气 SkyAtmosphere:决定天空颜色、太阳方向、大气散射。
  • 体积云 VolumetricCloud:负责云层形状和光线遮挡。
  • 指数高度雾 ExponentialHeightFog:控制远处空气透视和大气层次。
  • 体积雾 VolumetricFog:控制光影穿透过云雾时的散射效果。
  • 光照 Lumen + 定向光:决定全局光照和间接光。
  • 后期处理 PostProcess:负责曝光、泛光、色调映射和颜色风格。

这些系统不是独立开关,而是互相影响的。比如你把雾调浓,山体远近层次会好很多,但光照和曝光也会随之变化;你把云调成浓积云,体积光会变强,但场景整体亮度又会下降。所以环境制作最好按“先结构、后光照、再效果、最后调色”的顺序推进,不要一开始就堆特效。

1.3 版本和项目类型怎么选

标题写的是 UE5.7.4,但下面这组流程在 UE5 整个 5.x 系列里基本通用。不同版本的主要差异在于菜单名称、默认开启的功能和一些新工具的入口,核心工作流没有本质变化。

项目类型上,如果你只做环境展示和简单的日记交互,选择“Blank”蓝图项目就够了。蓝图项目启动快,不用编译 C++,适合雕刻地形和摆放资产。如果后续要写复杂的天气系统、多人同步或自定义渲染逻辑,可以创建 C++ 项目,或者先蓝图后迁移代码。名字建议用英文MountainDiary,避免中文项目名引发路径和编译问题。

注意:创建项目时不要勾选“Starter Content”也可以,但建议至少保留基本的Mannquin和移动控制器用于测试,方便后期跑进场景里检查比例和碰撞。

2. 创建项目和基础配置:先搭一个干净的地基

2.1 新建项目

从 Epic Games Launcher 打开 UE5.7.4,选择 New Project。游戏模板选择“空白 Blank”,项目命名为MountainDiary,目标平台选桌面 Desktop,项目位置放到一个不含中文和不含空格的根目录下,例如D:\UnrealProjects

项目创建后,会自动生成ConfigContentSource(蓝图项目没有 Source)等目录。先把Content下的目录结构建好,不要等到资产多了再整理。

Content/ Maps/ Environments/ MountainDiary/ Assets/ Meshes/ Textures/ Materials/ Foliage/ Audio/ Blueprints/ UI/ Data/

这个结构不是硬性规定,但环境项目资产量会很快增长。地形材质、植被网格、UI 资源、蓝图脚本各放一个顶层目录,后面修改和移交都会轻松很多。目录名尽量和项目名一致,例如在Environments/MountainDiary下放这个场景专属资产,避免和测试地图混在一起。

2.2 项目设置里需要先改的地方

打开Edit > Project Settings,先检查三处:

第一个是 Maps & Modes。把 Editor Startup Map 和 Game Default Map 都设置成你新建的主关卡,例如MainMap。否则每次打开编辑器都会进入默认空白关卡,还要手动切换。

第二个是 Rendering。如果你不熟悉具体参数,可以直接使用默认项目设置。但环境展示通常希望开启 Lumen 全局光照和虚拟阴影贴图,可以在控制台里确认状态:

r.Shadow.Virtual.Enable=1 r.Lumen.DiffuseIndirect.Allow=1 r.VolumetricFog=1 r.VolumetricCloud=1

这些命令可以直接输入到输出日志旁边的控制台命令行中。如果希望每次启动都强制开启,可以把它们放到DefaultEngine.ini[SystemSettings]小节里。不同 UE 版本的默认渲染后端不一样,比如在某些 5.x 版本中 DX11 下无法开启 Virtual Shadow Maps,需要用 DX12 或 Metal。如果你在控制器栏弹出“该功能需要 DX12”的提示,就到项目设置的 Platform > Windows 里把默认 RHI 改为 DX12。

第三个是把默认场景关闭。创建项目后关卡里通常有一个定向光、天空球和玩家出生点,这些可以全部删掉,从干净场景开始搭建,避免旧参数干扰判断。

2.3 导入资产前的检查清单

环境项目会导入大量外部资产,可能是 Quixel 下载的扫描模型,也可能是自己制作的植被。导入前按这张表筛选,能省很多返工时间:

检查项要求常见问题
网格体碰撞能自动生成或已有简单盒体碰撞大量植被没有碰撞会导致寻路和物理异常
树冠透明度透明或不透明模式统一树木叶子显示黑边,多数是透明模式或双面设置问题
LOD至少 3 层,距离切换合理远景树被裁剪成大块色斑,是因为 LOD 距离过近
贴图尺寸优先 2K,超大远景可用 1K4K 贴图过量使用会把显存吃满
材质数量尽量合并到同一材质实例每棵树都独享一整套材质会造成 Draw Call 飙升
世界比例模型尺寸和 UE 默认单位一致草比人高,通常是把外部软件模型的单位弄错了

3. 用 Landscape 雕刻出山体:地形是环境的地基

3.1 创建 Landscape 的尺寸和分辨率

Place Actors面板里搜索Landscape,拖到场景中后会进入地形模式。新建地形时有三组参数:Overall Resolution、Section Size、Component Size。

直接给一组适合“山地日记”场景的经验值:整体分辨率选择 1008x1008 左右,Section Size 选择 63x63 或 127x127,Component Size 根据画布提示保持 1x1。这套参数大约对应 1 到 1.5 公里的活动范围。如果你只是想快速看效果,选 512 级别也行,但山体和路径会缺少细节。

分辨率不是越高越好。地形分辨率高意味着顶点数量多,刷材质和刷植被时容易卡,而且光源烘焙和运行时性能都会受影响。先按较低的精度把大范围山体走势刷出来,再决定要不要用更高分辨率重建。地形分辨率只是决定网格密度,不决定世界大小;世界大小由缩放值控制。千万不能把“分辨率”当成“尺寸”,否则会出现地形碰撞与视觉不同步的问题。

3.2 雕刻山脊、山谷和步行路径

进入 Landscape 模式后,左侧会出现工具面板。第一个阶段用选择(Select)确定编辑区域,然后用雕刻(Sculpt)工具刷高度。

针对“山地日记”,建议按这个顺序操作:

  1. 先整体压低山谷:使用大笔刷、低强度,把地形刷成一个大碗状,让主活动区域低于周围山脊。
  2. 再堆起两侧山脊:笔刷大小设为场景宽度的一半,强度不要打满,逐层叠加。
  3. 确定溪流路径:沿着设计图上的路线,用 Flatten 工具把路径刷成一个缓慢下降的斜坡。
  4. 最后用手抓笔刷补充细节:在山的交接处做出小的突起和凹陷,避免地形看起来像是蛋糕被切了一刀。

Sculpt 工具有几个关键参数值得理解。Brush Size 控制笔刷半径,这个不用解释。Brush Falloff 控制笔刷边缘的过渡范围,数值越高边缘越虚,模拟自然坡地时建议保持 0.5 以上。Strength 控制每次刷的高度增量,刷大结构时用 0.2 到 0.4,补细节时降到 0.05,否则地形会很快变成坑坑洼洼。

注意:雕刻时不要用强度拉满去刷同一块区域。即使 Brush Falloff 很大,连续点击也会形成明显台阶。正确做法是设置较低的 Strength,然后用压感笔或鼠标反复轻扫。

3.3 通过噪声和样条工具让地形更自然

纯手刷容易出现两个极端:要么太规律、像梯田;要么太破碎、像月球表面。一个实用的方法是使用 Landscape 模式里的ErosionNoise工具。Noise 工具会给地形增加一层随机扰动,适合模拟风化后的岩面。Erosion 模拟水流冲刷,适合在溪流路径上做出河床凹陷。

不过这些工具也是“放大器”:地形基础结构不好时,噪声会把错误放大,而不是修正结构。正确的顺序是先把走势刷对,再用低强度噪声做细节微调。刷完如果发现某条山脊线上有奇怪的尖峰,用 Smooth 工具沿着山脊方向刷一次,让表面重新连贯起来。

如果你希望路径和山脊是精确曲线控制,也可以使用样条工具把路径做出来,再通过 Landscape Spline 把地形自动“贴”到样条上。这个方案适合需要精确对齐道路或水利设施的场景,但对于自然山地,手刷加噪声通常效率更高,也更自然。

3.4 分层材质:草地、岩石、泥土和雪如何混合

地形刷好后,需要在 Landscape 材质里做分层。新建一个 Material,节点类型选择 Landscape Layer Blend。在材质的 Layer Parameters 里添加 4 层:

  • Grass:草地,适合山谷和平缓区域。
  • Rock:岩石,适合山脊和崖壁。
  • Soil:泥土,适合路径和裸露地。
  • Snow:雪,适合高海拔区域。

使用 Landscape Sample Color 或 TextureSample 节点把每层的颜色贴图、法线贴图和粗糙度连上去。最常用的连接方式是 Layer Blend 输出连接到 BaseColor、法线、Roughness。然后在材质细节面板里勾选Used with Landscape,否则地形材质不会生效。

材质创建完成后,进入 Landscape 模式,切换到你创建的地形材质,通过 Paint 工具给不同区域绘制权重。刷权重时要注意过渡:不要在山脊和山谷之间用一条硬线分隔,而是用低硬度笔刷在两个区域之间反复扫,让草地逐渐过渡成岩石,让岩石逐渐过渡成雪。

分层材质只解决地表颜色和法线,还没有解决物理材质和脚印。后续如果角色走在地面上要产生不同的脚步声音或泥泞脚印,需要再给每层添加 Physical Material 映射。这个可以排在主场景完成后再做。

4. 植被与细节:从“空山”变成“有人活动过的山”

4.1 导入并创建 Foliage 类型

植被在 UE5 中使用 Foliage 工具摆放。先把树木、灌木、草和岩石的静态网格导入项目,然后在静态网格右键选择Create Foliage Type,生成对应的 Foliage 资产。

Foliage Type 的作用是把 Static Mesh 转成受密度控制、可批量实例化的植被对象。普通静态网格如果不转 Foliage Type,直接大量复制会造成严重的 Draw Call 上升;Foliage 工具会将相同网格实例化渲染,大幅提高同一个区域内摆几千棵草的性能。

在“山地日记”这个项目里,建议准备以下植被资产:

植被资产作用摆放区域
高针叶树远景山脊的主轮廓山腰到山顶
中低灌木路径边缘遮挡山谷、溪流边
草簇地面覆盖开阔草地、缓坡
岩石块打破地面均匀感山脊、溪流岸、转折处

4.2 摆放密度、随机旋转和缩放参数

选择 Foliage 工具后,左侧会列出所有 Foliage Type。点击需要摆放的类型,右侧会显示数量、密度、缩放范围等参数。

需要重点关注的参数有三个:

  • 密度/间距:控制每平方米摆放数量。大范围远景树密度可以低到 0.2 以下,近景草密度可能要到 20 以上。密度过高会直接卡死场景。
  • 随机缩放:给每个实例一个缩放范围。注意不要把缩放范围拉得太随机,森林里的树通常只是小范围变化,如果缩放从 0.5 到 2.0,看起来会像不同年龄的树堆在一起,在近景处会显得突兀。
  • 随机旋转:树木和灌木建议旋转范围 0 到 360,让朝向自然。草和岩石的旋转影响不大,但也要打开,否则所有元素看起来像复制粘贴。

摆放时先用低密度大范围刷一遍远景树,把山的轮廓建立起来,再缩小笔刷在路径附近种灌木和草。节奏上要“近密远疏”,靠近玩家走路路径的地方密度高、种类丰富,远处的山脊只需有足够剪影。

4.3 用 Procedural Foliage 做自动生成

手摆 Foliage 很直观,但如果你需要在一片很大的山地上快速生成符合规则的植被,可以使用 Procedural Foliage Volume。

它的工作方式是:在场景里放置一个 ProceduralFoliageVolume,设置需要在其中生成的 Foliage Type,然后配置每个类型的 Density、Tilt、Scale 等生成规则。运行 Generate 后,工具会在范围内按规则摆放实例。

这个方案适合作为“第一遍铺装”。先生成全局植被,再删除路径附近太密集的部分,最后手工补充关键位置的造型植物。如果直接手动刷整个 1 公里地图,既慢,也容易造成密度分布不均匀。

注意:Procedural Foliage 生成的是独立实例,仍然会占用场景资源。如果要在大世界地图中使用,还需要配合 HLOD 和 World Partition 考虑加载范围,学习环境下直接使用即可。

4.4 Nanite 和植被的兼容问题

UE5 中很多高模资产可以用 Nanite 做自动 LOD,但植被有特殊性。树叶通常包含半透明或双面材质,传统 Nanite 网格对半透明支持有限制。不同 5.x 版本对 Nanite Foliage 的支持程度不同。

如果发现树木在特定角度闪烁或者出现阴影错误,优先检查树的材质是否开启双面,以及是否强制触发了 Nanite 的可见性计算。不要一遇到树叶问题就关掉 Nanite,先确认是不是 LOD 距离和材质透明模式的问题。

地形材质本身不是 Nanite,Nanite 主要针对静态网格。在环境项目里,Nanite 适合岩石、地面大石块和建筑结构,不适合所有细小枝条和叶片。让 Nanite 负责大型不透明物体,让传统 Foliage 负责树叶和草,往往是最稳定的组合。

5. 光照、天气与后期:决定“山地日记”的情绪

5.1 搭建天空、大气和体积云

在场景中创建三类 Actor:DirectionalLight、SkyAtmosphere、VolumetricCloud。

DirectionalLight 是太阳主光。把 Mobility 设置为 Movable,这样它能在运行时改变方向,支持白天黑夜循环。在细节面板里,其旋转角度决定太阳高度。Light Source Angle 控制阴影的锐利度,数值越小阴影越硬,适合正午;数值越大阴影越柔和,适合清晨或黄昏。

SkyAtmosphere 负责大气散射。它与 DirectionalLight 一起决定天空颜色。你可以在Place Actors中直接创建 SkyAtmosphere,它会根据此时太阳位置计算大气效果。如果是雨雾天气,可以降低大气密度,让天空看起来灰一些。

VolumetricCloud 负责云层。默认云层是低高度层积云,要调高云层高度和厚度来配合山地场景。云层对光源方向的反馈非常敏感,设置云层厚度较大时,太阳投射下来的光会形成明显的天光柱。

5.2 指数高度雾的参数逻辑

场景里添加 ExponentialHeightFog,这是室外环境最容易被忽略但影响最大的系统。它的核心参数有:

参数作用调大效果调小效果建议
Fog Density雾的整体浓度远景发白,山体轮廓消失场景干硬,缺乏空气感从 0.01 开始试
Fog Height Falloff雾随高度衰减速度低处浓、高处清晰雾平均分布在山间0.2 附近比较自然
Volumetric Fog体积雾总开关光穿过雾产生体积感大气效果减弱室外开 1
Volumetric Fog Distance体积雾计算范围远处细节下降更费性能4000 到 8000 合适

雾不要一次拉满。理想状态是:站在山脚看远方树木,能看到隐约的空气透视,但还能分辨山体轮廓;站在山顶看向山谷,雾应该集中在谷底,而不是覆盖太阳。

5.3 后期处理体积:曝光、泛光和色调映射

在场景中创建 PostProcessVolume,设置 Infinite Extent(Bounds 无限范围),然后调整参数。

最先要处理的是曝光。打开 Auto Exposure,把 Min EV100 和 Max EV100 控制在一个合理范围内。室外场景常用范围是 -2 到 14。如果过曝,说明 Max EV 太高,导致相机在强光下自动提高感光度;如果画面太灰,把 Exposure Compensation 向下调。

接下来是泛光 Bloom。山地场景里阳光穿过树木和云层时,适度的泛光会增强氛围,但调太大会像手机滤镜。建议把 Bloom Intensity 保持在 0.5 左右,然后通过 Threshold 控制只让高光区域发光。

色调映射是影响最终颜色的重要一步。UE5 默认 ACES 色调映射器通常是安全选择。如果想让画面偏冷,可以在 Color Grading 的 Shadows 里往蓝色调一点,在高光的 Color 里加一点暖黄色。这个步骤放到整个环境搭建完成后再做,因为光照和雾的任何修改都会影响最终调色结果。

5.4 做一个简单的白天黑夜循环

如果想给“山地日记”加上时间流逝感,可以写一个非常简单的日夜循环逻辑。蓝图或 C++ 都可以,核心思路是:把一天 24 小时映射成定向光旋转角度,然后每小时更新天空和雾。

C++ 版本的关键帧代码可以这样写:

// AMountainDiaryEnvironmentActor.cpp void AMountainDiaryEnvironmentActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (!SunLight) return; TimeOfDay += DeltaTime * TimeScale; if (TimeOfDay >= 24.0f) TimeOfDay -= 24.0f; // 将 24 小时映射到 360 度,6 点在地平线,12 点在头顶 float SunYaw = 0.0f; float SunPitch = (TimeOfDay - 6.0f) / 24.0f * 360.0f; FRotator SunRotation; SunRotation.Yaw = SunYaw; SunRotation.Pitch = SunPitch; SunRotation.Roll = 0.0f; SunLight->SetActorRotation(SunRotation); // 根据时间调整光照颜色 FLinearColor Color = GetSunColorForTime(TimeOfDay); SunLight->SetLightColor(Color); }

这只是说明思路的片段。实际项目里,你还需要给 SkyAtmosphere 和 VolumetricCloud 设置太阳高度参数,否则太阳转动时天空的颜色和云层不会联动变化。如果是蓝图实现,逻辑相同:在 Tick 中用 SetActorRotation 改变定向光角度,再用 Lerp 在黑夜和白天颜色之间做插值。

注意:日夜循环会影响整个场景曝光和雾的颜色。建议先固定一个最舒服的黄金时间段完成地形和植被制作,再在最后加入日夜循环。否则边刷地形边调光照,你会被时间和颜色变化干扰判断。

6. 加一点叙事:日记收集点怎么做

6.1 放置可交互的日记点

在场景里创建BP_DiaryPage蓝图 Actor。这个 Actor 由三部分构成:

  • StaticMesh:一张纸张或者一本小册子的模型。
  • Box Collision:可重叠范围,用于触发交互提示。
  • Rotating Movement:可选,让日记页在场景中轻微旋转,作为视觉提示。

日记点不要藏在太多犄角旮旯里。它应该出现在视线自然引导的位置:路转角、木屋门口、悬崖边。碰撞范围建议 150 到 200 厘米,太小玩家走偏一点就触发不到;太大则会被远处的玩家提前触发,失去“走近发现”的仪式感。

6.2 用 UMG 制作日记弹窗

创建一个 Widget Blueprint,比如WBP_Diary。在面板里添加一个 Border 作为背景,里面放一个 TextBlock 显示标题,一个 MultiLine TextBlock 显示正文。把控件的 Is Focusable 设为 true,这样键盘按键才能正确响应。

BP_DiaryPage里,把日记内容和 UMG 绑定起来。建议给 Actor 添加两个字符串变量:DiaryTitleDiaryContent。当玩家进入碰撞体时,调用CreateWidget生成日记 UI,把这些变量传进去。没有数据驱动时也可以用 DataTable 管理日记内容,具体做法在 6.3 说。

6.3 用 SaveGame 记录收集进度

日记只有三五条时,用一个 GameInstance 的数组就能解决。假设你的日记有 20 条以上,就引入 SaveGame 系统,把已经收集的日记 ID 保存下来。

先创建一个 UDataAsset 或 DataTable 来管理日记条目:

USTRUCT(BlueprintType) struct FDiaryEntry { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 ID = 0; UPROPERTY(EditAnywhere, BlueprintReadWrite) FText Title; UPROPERTY(EditAnywhere, BlueprintReadWrite) FText Content; UPROPERTY(EditAnywhere, BlueprintReadWrite) FVector Location = FVector::ZeroVector; };

再创建 SaveGame 类:

UCLASS() class UDiarySaveGame : public USaveGame { GENERATED_BODY() public: UPROPERTY() TSet<int32> CollectedDiaryIDs; };

在玩家碰到日记点时,把 ID 添加进 TSet。这样即使玩家重复进出一块区域,也不会重复收集。加载场景时遍历所有BP_DiaryPage,如果它的 ID 已经在已收集列表里,就把该日记点隐藏或标记为已读。

在“山地日记”这个环境里,日记收集点是给玩家一个“继续探索”的理由。你可以把日记点数量和地形节点绑定:每条日记对应一处新的视野点。这样玩家收集完日记,也就看完了整座山最精华的风景。

7. 运行验证与常见问题排查

7.1 用地形和角色移动做基础验证

场景搭建完成后,先不要急着拍视频。进入 PIE(Play)模式,使用第三人称模板或直接打开默认角色控制,从入口开始沿设计路线走一遍。

检查顺序是:角色能不能穿过路径和坡地,植物会不会阻挡视野,树根和岩石的碰撞是否合理,日记点的触发器是否正常弹出 UI。每一步都要确认,不只是“看到树了”就算通过。如果角色卡在某块石头上,那说明这块石的碰撞盒过于复杂或角度过于垂直;如果角色直接从树叶穿过去,那说明树叶的碰撞响应设置成了忽略。

7.2 常见问题排查表

打开一个 1 公里级别的室外场景,下面这些毛病几乎都会出现一遍:

现象常见原因检查方式处理建议
场景黑屏或全暗没有定向光、曝光锁定异常检查场景中是否有 DirectionalLight,检查 PostProcess 曝光参数开启 Auto Exposure,确保定向光存在且角度在可照亮区域
材质显示紫色或绿色材质编译失败或贴图丢失看输出日志,打开材质编辑器确认节点是否有红色报错修复丢失贴图路径,重新编译材质
地形刷颜色不生效Landscape 材质没有勾选 Used with Landscape进入地形模式查看当前选中的材质打开材质详情,勾选 Used with Landscape
植被密度过高导致卡顿Foliage 密度参数太大在 Foliage 工具里选中对应类型,查看实例数量降低密度,或缩小刷取范围,或分批手动摆放
远处山体闪白或灰蒙蒙指数高度雾浓度过高把 Fog Density 降到 0.005 以下试看重新调整雾浓度和 Volumetric Fog 距离
树影闪烁或出现黑块LOD 切换过快、材质双面设置不对使用r.Shadow.Virtual.Enable=0临时关闭虚拟阴影测试检查树冠材质,调整 LOD 距离或使用 Nanite 替代
日记点触发不上碰撞体范围太小或玩家胶囊体外层忽略碰撞查看 BP_DiaryPage 的 Box Collision 范围调大碰撞体范围,设置 Enabled Collision 响应为 Overlap

7.3 用性能分析命令找出卡点

环境场景最容易出现的性能问题是植被实例过多和阴影计算过重。运行游戏后打开控制台,使用下面这些命令:

stat fps stat unit stat gpu stat rhi

stat unit会显示 Frame Time 在 Game、Draw、GPU 三个部分的花费。如果 GPU 时间远大于 Game 和 Draw,说明瓶颈在渲染;如果 Game 很高,则可能是蓝图逻辑或物理碰撞问题。

要进一步定位,用profilegpu抓取一帧 GPU 报告,查看各渲染阶段的耗时,例如阴影、透明物体、体积雾分别消耗多少毫秒。修性能问题要抓主要矛盾:如果体积雾消耗最大,就降低r.VolumetricFog.GridPixelSizer.VolumetricFog.GridSizeZ;如果是阴影消耗最大,就缩短阴影距离或降低阴影贴图分辨率。不要一卡就关所有效果,先量化,再针对性调整。

8. 最佳实践与扩展方向

8.1 环境制作可复用清单

每次做一个新环境关卡,都按这份清单走,能减少大量返工:

[ ] 路线图确认:玩家从哪里进入,去哪里,看到什么 [ ] 项目命名与目录结构统一 [ ] 地形分辨率与缩放符合活动范围 [ ] 山地走势先刷完,再做细节噪声 [ ] 分层材质先铺完,再细化贴图和物理材质 [ ] 植被近密远疏,密度参数不激进 [ ] 光照和天空先搭基础,再调云和雾 [ ] 后期曝光、泛光、色调映射最后调 [ ] 交互类功能(日记点)使用数据驱动管理 [ ] PIE 全流程走测一遍,记录卡顿和报错 [ ] 用性能分析命令找到瓶颈,再优化 [ ] 存档、退出再加载,确认收集状态不丢失

这份清单里的每一项都不要跳过。多数环境项目返工,不是因为美术能力不足,而是步骤顺序乱了:还没定路线就开始刷山,还没调光照就开始摆草,结果联动起来互相影响。

8.2 学习环境和生产项目的差异

学习阶段可以为了效果把密度和特效都拉高,只要本机跑得动就行。但进入生产项目后,必须区分“测试用环境”和“发布用环境”。

测试环境可以使用全部高品质资产,方便看效果。正式项目要考虑:资产包体积、LOD 数量、纹理内存、移动端或主机性能、加载逻辑、远程资源管理。建议从项目最开始就把 Environment 分成DevOptimizedOptimized版本删掉不需要的高模资产,降低远景密度,减少相机裁剪距离。

优化不是等卡了才做。在刷地形和摆植被时,就要有“我以后会在低配机器上运行”的意识。比如高模岩石,可以先在近景放 Nanite 版本,在远景用低模替代;草地草簇尽量做成单个卡片,而不是动态物体的集合。

8.3 扩展方向:从静态场景变成可玩关卡

“山地日记”如果只做一个静态环境,完成的只是环境美术部分。下一步可以扩展的方向包括:

  • 天气系统:雨、雪、雾的动态切换,让同一个山地场景呈现不同情绪。
  • AI 角色:在山间巡逻或行走的 NPC,增加场景生命力。
  • 声音:溪流声、风声、鸟叫,根据玩家位置切换。
  • 世界分区:如果场景扩大到几平方公里,启用 World Partition 按地块加载。
  • 任务系统:将日记收集点扩展为支线任务,让环境和玩法结合。
  • 过场演出:在关键日记点触发摄像机序列,给玩家一段强制视角的叙事。

学习路线建议:先完整做一遍“从清空项目到可玩的地形环境”,再针对光照和植被各做一个专项深入练习。环境制作最容易积累经验的方式就是快速做小场景,而不是只在一个场景里无限制磨下去。每做完一座山,记录下自己在路线、密度、雾、光照上踩过的坑,下一次项目开始时直接把经验传过去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询