
1. 为什么偏要用World Creator生成地形而不是直接在UE里刷如果你做过开放世界或者大地图项目一定经历过在Unreal Engine里用Landscape模式手动刷地形的阶段。那个过程怎么说呢——不是不能做但效率低得让人抓狂。刷一座山的轮廓可能要调半天笔刷想要一条自然的河流侵蚀痕迹更是难上加难更别提做整张8km乘8km的地图了。World Creator这类程序化地形工具解决的就是这个问题。它用噪声算法、水力侵蚀模拟、沉积岩层堆积等模型在几分钟内生成一张看起来完全符合自然规律的地形。但这玩意儿生成出来之后格式是自家的要么是PNG灰度图要么是OBJ网格要么是专用的.terrain格式。你真正要在UE里做游戏需要的是Landscape系统里的Heightmap也就是高度图。所以整个流程的核心问题就一个如何把World Creator的高度场数据准确、无损、带比例地导入到UE的Landscape里。这个流程看起来简单无非是导出灰度图再在UE里Import Heightmap。但实际操作中你会撞上一堆问题高度图导进去后山体被压成饼、缩放比例对不上、坐标错位、边缘接缝撕裂、尺寸超出Landscape支持范围……这篇文章我就把这整条链路彻底盘一遍包括参数设置、原理分析和排错经验照着走一遍基本不会再踩坑。顺便说一句我之前也试过绕开灰度图直接导出.obj网格再转回Landscape但那个方式的精度损失和拓扑问题让你得不偿失。除非你需要的是特定单物体模型而不是地形否则灰度图路径始终是最正确的选择。2. World Creator导出端的参数直接决定了UE里会不会翻车先明确一件事World Creator导出的东西本质上不是地形文件而是一张记录了高度信息的图像。高度图的逻辑很像我们平时说的热力图——每个像素的明暗值代表那个位置的高低纯黑是地形最低点纯白是地形最高点中间的亮灰暗灰对应不同海拔。UE的Landscape系统吃的就是这张图。2.1 位深选择8bit还是16bit必须选16这是很多人第一个忽略的坑。在World Creator的Export Heightmap面板里格式一般会让你选8-bit还是16-bit。8-bit意味着用256级灰度来表示整个地形的高低差也就是说你的地形海拔会被切成最多256层。假设你的地形垂直范围是2公里那每一层的厚度就有接近8米。这意味着什么意味着一个3米高的陡坎、一段2米的断崖在导入之后直接就消失不见了被量化成了平地。这不是精度损失的问题是地形特征直接丢失的问题。而16-bit提供65536级灰度同样的2公里垂直范围每层的厚度只有大约3厘米。这种精度对于大多数游戏场景来说已经远远够用。所以导出的时候格式选择PNG或者RAW都行但颜色深度必须选16-bit。如果选错了回头在UE里看到的地形就是一片平缓得像沙盘一样的鬼东西怎么修改都没用。注意UE的Landscape导入支持16-bit PNG但如果你用的是Photoshop之类的工具对灰度图做过二次处理保存时一定要确认没有把它转回8-bit否则之前的工作等于白做。2.2 尺寸配置导出分辨率要匹配UE的Landscape网格结构World Creator里Generate面板中的Terrain Size相关选项控制的是地形的世界尺寸和像素分辨率。导出高度图的时候你需要确定一个核心参数最终灰度图有多少像素。UE的Landscape并不是随便拿一张图就能导入的它有严格的网格结构约束。如果你在UE里使用默认的Section Size 127、Subsection数量1x1那么高度图的像素尺寸要求是127乘以一个整数再加1。最常见的配置是1个Section每Section 127x127顶点需要128x128像素1个Section每Section 255x255顶点需要256x256像素4个Section2x2每个127x127需要255x255像素4个Section2x2每个255x255需要511x511像素看出规律没有公式很简单高度图尺寸 单个Section的Quad数量 × Section排列数量 1。129、257、513、1025、2049、4097、8193这些数字才是Landscape能正确接受的高度图尺寸。如果你导出的灰度图是2048x2048或者4096x4096这样的整数尺寸导入时UE会强行近似处理结果就是你看到的地形边缘出现接缝、细节错位。在World Creator导出前把分辨率改成匹配UE网格的值。我用的配置是1x1的255x255 Section加4个Section排列于是导出分辨率设置为513x513如果是更大范围就用1025x1025、2049x2049。2.3 高度范围与Z轴缩放的关系World Creator里有一个Height Range或者说Z Scale的选项用来控制地形的最低海拔到最高海拔的范围。这个值必须在导出前就想好因为它直接决定灰度图的对比度分布范围。举个例子你的场景设计需求是地形最低处海拔-50米最高处250米总高差300米。那么World Creator里的高度范围就应该设置为0到300或者-50到250看具体软件UI这样整个高度区间才会被拉伸到全黑到全白的范围。如果你设置了0到3000米的高度范围但地形的实际起伏只有300米那么导出的灰度图大部分像素都会集中在很窄的灰度区间里对比度低导入UE后相当于白白浪费了16-bit的精度。在UE里导入时Scale的Z值设置多少取决于World Creator里的Height Range和你想保持的缩放比例。如果你在World Creator里的高度范围是0到1000而UE里希望地形高度正好是1000米那Z Scale就填1。如果希望压扁一半就填0.5。这个对应关系后面导入部分我会详细说。2.4 别忘了关掉那些会破坏高度场连续性的后处理World Creator里有一些效果器比如雪线、植被覆盖、岩石纹理层这些是直接作用在表面材质上的。导出高度图时要确认这些效果没有影响地形的高度场本身——大部分情况下它们只影响Color Map或者说SplatMap不会改动Heightmap。但有一种情况会坑人如果你用了某些侵蚀效果或者山体滑坡模拟并且开启了模拟后更新高度那导出Heightmap时选错图层可能会把原本应该平滑的侵蚀堆积区变成一堆不合理的高低错落。保险的做法是在导出Heightmap时只选Height通道不要选HeightColor混合模式。Color信息单独导出成另外一张图就行后面做地形材质要用再导入。3. UE端的导入操作从Content到Landscape的正确姿势3.1 第一个大坑很多人把灰度图直接拖进Content Browser我先说一个非常常见的低级错误见过不下十个人犯过。他们把World Creator导出的PNG直接拖进UE的Content Browser然后问为什么我创建不了地形。原因很简单Content Browser里单独存在的PNG只是一张Texture资产它可以在材质里作为贴图采样但它本身不等于Landscape Heightmap。正确的方式是打开地形模式Landscape Mode在Manage标签页里找到Import Heightmap按钮然后在弹出的文件选择框里选中你导出的灰度图。UE读取这个文件时会把它作为Raw Heightmap数据来处理而不是作为一张普通贴图。3.2 Import Heightmap弹窗里的每一项参数代表什么点选导入之后UE会弹出Import dialog里面有Material、Location、Scale这几类关键参数。这几个参数不能随便填每一个都对应World Creator里的某个设定。Location坐标位置高度图导入后地形中心或角落位置。如果我们是第一次导入整张大地图直接保持默认的0,0,0就行。但是在分块导入或者后续要对位时这个地方需要精确计算。Scale里的X和Y这决定了地形的平面尺寸。灰度图的每个像素在UE里默认映射成一个顶点相邻顶点的间距就是这个X和Y值。假设World Creator里你的地形是世界范围8km x 8km导出高度图是1025x1025像素那么XY Scale应该设置为8000除以1024约等于7.8125。每个顶点间距7.8米才能让整张图铺满8公里。Scale里的ZZ值代表高度拉伸系数。刚才在World Creator里我们的高度范围是0到1000UE的Z Scale为1时导入后地形垂直方向也是1000米高。如果你的地形起伏在游戏里显得太小适当调大Z Scale就能放大高度差。3.3 草稿材质先随便填一个否则看不到地形导入的时候弹窗里Material那一栏可能要求你指定一个地形材质。很多教程说这里必须新建一个Material但第一次操作的人往往卡在这个环节——项目里还没有地形材质怎么办答案很简单先不管它或者新建一个默认的Basic Landscape Material。UE的Landscape在导入时如果没有任何材质你看到的地形会呈现为默认的半透明网格非常不利于检查地形形态。我习惯先创建一个最简单的无光照材质连什么贴图都不加只把颜色设成灰色或者浅黄色纯粹为了看清楚山体轮廓和整体比例。导入后确认地形形态没有问题再回头做真正的分层材质。提示如果地形导入后看起来是一片平滑的、完全没有细节的灰色高地先不要急着调整材质优先检查一下导入后的LODLevel of Detail设置。在编辑界面按L键Landscape LOD显示开关查看当前LOD等级如果LOD过高细节会被简化掉视觉上看起来像糊了一层雾。3.4 导入后立刻要做的三个检查项地形导入成功并不代表万事大吉。我在每次导入后都会依次做这几项检查第一检查Landscape模式里的分辨率信息。确保Component数和Section数与预期一致防止UE自动改变你的布局。第二放置一个已知尺寸的Cube或者Character站在地形上走一圈快速判断比例是否协调。比如把角色放到地形上如果角色只有山脚一块石头那么大说明XY Scale可能太大了如果角色比整座山还高那就是Scale设置反了。第三看地形边缘是否平整。如果是多块地形拼接检查接缝处有没有明显的高度跳变。灰度图本身没问题但两个相邻地形的分辨率或坐标设置不同就会出现悬崖边对不齐的情况。4. 坐标与尺寸对不上这是项目里最常见的隐形炸弹导入操作本身十分钟就能搞完真正让人头疼的是地形位置和尺寸与场景里其他对象对不上。热搜词里有一个地形点云配准这个词在测绘领域指空间点云数据对齐但其实在地形导入这活儿里我们面对的是同样的问题如何让不在一起生成的地形数据在UE的世界坐标里无缝对接。4.1 单块地形Origin Point怎么设置才合理World Creator里导出的高度图通常原始坐标原点在地形的一个角落。而UE的Level原点在场景中心。导入时Location不设置好地形就可能会偏到世界的边角去。我的习惯是这样先在World Creator里生成地形时就把范围中心放在坐标原点附近然后UE导入时Location填的坐标值就是中心点坐标。比如地形尺寸是8km x 8km那么导入时Location的X和Y填负数让地形的中心刚好落在世界坐标0,0点。不过更常见的情况是地形生成时是用Global Mapper这类工具从真实世界地理数据处理的原点可能是经纬度转换后的平面坐标比如某个县城附近的某个特定坐标值。那么导入UE时Location需要填上对应的World Offset。4.2 多块地形拼接从World Creator设置就要开始考虑做大地图的人绝对绕不开分块地形。UE的Landscape最大支持单块尺寸有限制8km x 8km以上基本就要切割成多个区块分别导入。World Creator这边有两种常见做法。第一种是World Creator内部就做好分块生成Tiled Generation输出多张高度图每张对应一个Tile。这种情况下World Creator里面设置的Tile范围必须严格对齐而且相邻Tile之间要有一定重叠区域否则后面UE拼接时接缝会缺东西。第二种做法是在World Creator里一次性生成整张大图然后在外部工具比如Photoshop或者Python脚本里切割成多张高度图。这种方式坐标更好控制因为你只需要按像素平均切块就行每块的像素尺寸仍然要满足Landscape的1规则。切完之后在UE里导入Location的坐标要按序排列。假设一张8km x 8km地形切成四块每块4km x 4km灰度图尺寸分别是2049x2049。那么左上一块导入后的Location应当是-2000, -2000, 0右上一块是2000, -2000, 0以此类推。4.3 接缝拼接时的高度差检查方法即使你在World Creator里生成地形时用的是无缝生成的Tile导入UE后仍可能因为相邻地块的Scale参数不一致出现高度差。检查方法很简单选中相邻两个Landscape看它们的Component的位置和大小是否完全对齐再看Z Scale是否一致。如果高度差确实存在优先检查两张灰度图在重叠区域的对应像素值是否一致。World Creator在生成Tile时有时会带边缘模糊效果Edge Fade这个会直接污染高度图边界。导出时一定要关闭一切边缘渐入渐出选项确保Tile边缘的灰度值是实际地形高度而不是过渡到某个固定值的渐变。4.4 size to content思路在地形检查上的应用热搜词里出现size to content在ue里这个功能本身是3D建模工具里常用的自适应缩放在UE里我们也有类似需求的场景——导入地形后快速对比地形范围与场景内容的关系。实操里我的习惯是在UE里选中导入后的Landscape Actor然后按F键聚焦看视角边界是否恰好贴合地形边缘范围。开启Landscape的Wireframe模式检查地块数量和分布。最后配合在Level里放置的动态物体比如飞行器、载具测试一下确认地形范围是否符合玩法设计预期。5. 高度图之外的那些配套资产颜色图、SplatMap和材质构建导入地形之后没有纹理这就是个泥巴山。World Creator的强项不只是高度场还有它生成的色泽图Color Map和材质分配图SplatMap。这些资产如果利用好可以省去你在UE里辛苦刷Layer材质的几周时间。5.1 World Creator导出的Color Map直接用能用但不好用World Creator可以导出一张Color Map说白了就是地形表面的漫反射颜色草是绿的、岩石是灰的、雪是白的。这张图直接作为Landscape的基础颜色贴图用效果非常直观而且不需要在Landscape里做任何Layer Blend。但它的缺点是Color Map是预焙的固定颜色它不带任何Material属性不会因为光照变化改变反光程度也没有法线细节。如果你做的是风格化游戏或者俯视角小地图完全够用。如果是写实3A项目这张图只能当作参考最后还是得手动画Layer。5.2 SplatMap的正确打开方式更有价值的是World Creator导出的SplatMap——通常是一张RGBA图其中R通道代表草地、G通道代表岩石、B通道代表泥土之类。UE的Landscape材质里用Landscape Layer Sample节点配合Layer Blend节点可以很自然地根据这些通道的值在多个材质层之间过渡。导入SplatMap的做法是把它作为一张Texture2D放进项目里然后在Landscape材质中用Texture Sample节点采样它再把采样后的RGBA分别连接到Layer Blend层的Alpha输入。关键细节World Creator导出的SplatMap如果和高度图尺寸一致那采样UV可以直接用默认的UV0。但如果你在UE里设置了Landscape的材质三平面映射Triplanar要确保SplatMap的采样不受三平面影响否则会得到一种被拉伸重复的混乱纹理。5.3 实操中我推荐的地形材质配置方案我试过好几套地形材质方案从最简单的单层材质到复杂的八层混合目前最顺手的是这套底层用World Creator的Color Map作为基础漫反射上面叠加两到三层Landscape Layer——一层是细节法线贴图用于岩石粗糙面一层是微细节法线用于草地和泥土最后一层是雪或沙地过渡。Layer Blend节点选择HeightBlend模式而不是简单的Alpha Blend。HeightBlend会让不同材质层在过渡区域产生基于高度的自然交错而不是那种生硬的贴图切换感。注意Layer Blend的HeightBlend模式对性能有一定影响Layer越多开销越大。移动端项目建议控制在3层以内PC项目也最好不要超过5层否则在材质复杂度高的地形上掉帧非常明显。6. 从灰度图到可玩地形后续还要处理的细节导入成功、材质就位这只是完成了地形管线的60%。剩下40%的精力要花在让地形可用上——碰撞、导航、LOD、以及与场景道具的交互。6.1 碰撞与导航网格UE的Landscape默认自带碰撞导入后你可以在上面行走、弹道检测。但要注意的是默认碰撞是简单盒体还是复杂体可能会影响性能。如果发现地形碰撞开销巨大在Landscape的细节面板里把Collision Complexity调到Simple Box即可。NavMesh导航网格方面如果游戏里有NPC或敌人需要在地形上寻路必须在Navigation Mesh的Bounds Volume覆盖整个地形后重新Build NavMesh。地形太大会导致导航网格生成时间极长建议先用RVTRuntime Virtual Texture或者缩小NavMesh覆盖范围来分层生成。6.2 LOD与流送设置大地形如果不做LOD和流送管理内存和显存会直接爆炸。在UE里地形LOD主要靠Landscape Component的LOD Distribution设置。导入之后我会先把NumberOfComponents检查一遍再调整LOD的Level Scale参数。如果发现远处地形疯狂掉帧适当增大每个Component覆盖的区域范围减少总组件数量。配合World PartitionUE5或Level StreamingUE4把地形按区块拆分成可流送的子关卡可以实现更平滑的大地形加载。6.3 地形篡改与Runtime编辑的兼容性如果你的游戏里有地形破坏机制比如炮弹炸坑、角色踩出脚印需要用到UE的Landscape Runtime编辑功能。这里有个隐藏坑从World Creator导入的Landscape在被Runtime修改后如果重载了高度图再次Import Heightmap所有运行时修改都会被覆盖回原始状态。所以需要同时支持程序化破坏和可重新加载的项目建议把修改后的高度数据单独存成RuntimeVirtualTexture或者用一个数据层来记录Delta。6.4 和fastnoiselite这类程序化地形的对比思考热搜词里有个fastnoiselite 生成地形c#如果你了解一点Noise算法就会明白World Creator本质上也是一个超大号的、封装良好的Noise和侵蚀模拟器。导入Ue之前用fastnoiselite在C#中生成的高度图其实和World Creator输出到UE的灰度图殊途同归——都要遵循同样的尺寸、位深、坐标规则。所以如果你手头没有World Creator用Godot或Unity里的FastNoiseLite加上实时修改也能生成同等规范的高度图导入UE。区别仅在于World Creator提供了更多的侵蚀模拟和分块管理让效果更接近自然地貌而纯Noise算法生成的地形会显得过于圆润、缺少碎石细节。7. 我踩过的几次坑直接列给你写了这么多最后把我真实项目中遇到过的问题按优先级列一遍这些都是我摔过跟头的地方。第一导出高度图时分辨率贪大。在World Creator里直接导出16385x16385像素的超大高度图结果UE导入时直接卡死半小时最后还报内存不足。建议从2049或4097像素开始确认流程无误后再放大。大地图优先方案是分块生成多个4097x4097而不是一个8193x8193。第二导入后地形方向不对。World Creator和UE的坐标轴约定有差异导出的灰度图可能在导入后旋转了90度。解决方法是在World Creator导出面板里找到Orientation或North Direction选项设置成匹配UE的方向。如果不确定先导出低分辨率试一次确认方向无误再导出正式版本。第三渐变色彩被当作高度信息。之前有一次导出时选错了文件把Color Map当Heightmap导入了。结果UE把彩色图按照亮度转换成了高度整个地形变成了一个完全和预期不符的波浪状烂泥坑。所以导出后一定要检查文件后缀和属性确认是单通道或者灰度格式后才导入UE。第四Z Scale设置后看起来没有变化。这个问题其实不是Scale没生效而是Landscape的LOD太粗糙顶点高度在低LOD下被跳过和简化了。调整View Mode到Lit后靠近看细节就正常了。如果是烘焙后的地形Build后的运行时地形LOD切换逻辑不同需要把Landscape的LOD Distribution参数设置为更大值才能在远处也看到明显地形起伏。所有这些坑没有一个是那种动辄需要写几百行代码或者做复杂逻辑的高深问题全都是参数理解、格式对齐、坐标习惯上的细节。但就是这些细节能把一个本应半小时完成的地形导入流程拖成三四天的噩梦。如果你正在做地形导入希望这篇能帮你把这条路的弯都提前绕过去。