虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)

开个新坑详细分析一下虚幻官方发布的《CropOut》,文章会同步发布到我在知乎|CSDN的专栏里

文章目录

  • 概要
  • Create Island
    • 几何体生成部分
      • 随机种子
      • Step 1
      • Step 2
      • Step 3
      • Step 4
      • Step 5
      • Step 6
    • 岛屿材质部分
      • 动态为草地设置颜色
  • 程序设计的小技巧
  • 其它
    • Platform Switch函数

概要

《CropOut》的技术亮点之一就是全部关卡都是随机生成的,本篇文章将重点解析游戏中岛屿的随机生成方式,先列举几个技术关键字:

  • 用Geometry Script构造几何体
  • 为Geometry Script几何体赋材质
  • 依赖倒转

文件位置:E:/MISC_UE/Cropout示例项目/Plugins/IslandGenerator/Content/BP_IslandGen.uasset

Create Island

岛屿生成的逻辑并不复杂,可以视为Geometry Script应用的一个范例,它包含了几何体的生成和优化,以及针对本项目特点采取的一种巧妙的贴图方式。

几何体生成部分

随机种子

SeedRandom Stream类型并保存在BP_SaveGM中,每一个关卡的随机数都是由同一个Seed通过Random Unit Vector from Stream以及Random Float in Range from Stream等方法获得,这样就能够确保游戏存档再开启以后还原之前的岛屿。

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第1张图片

Step 1

随机生成一些平顶的圆锥体Cone

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第2张图片

Step 2

在几何体底部添加一个添加Box

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第3张图片

添加Box主要是为了后面做平滑的时候,让斜面有一定弧度,看起来更自然,下面是未添加Box和添加Box的效果对比


Step 3

为几何体整体做平滑处理

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第4张图片

  • Apply Mesh Solidify :对DynamicMesh所有的子物体进行体素化,然后获得外表网格,实际上相当于对所有子物体进行了布尔并集运算,在本例中针对还性能平台和低性能平台使用了设置了不同的精度即体素颗粒的大小。

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第5张图片

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第6张图片

  • Set Mesh To Per Vertex Normals :平滑法线

  • Apply Iterative Smoothing to Mesh :对DynamicMesh进行整体平滑

  • Apply PNTessellation :对DynamicMesh进行细分,同样针对不同性能的平台使用不同的细分级别

Step 4

用平面切掉底部的没用的部分

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第7张图片

Step 5

先定义一个平面将山顶切掉,然后再用平面投影的方式设置几何体的UV

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第8张图片

Step 6

释放Compute Mesh以及向GameMode发出岛屿生成完毕的通知
虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第9张图片

岛屿材质部分

材质文件位置:E:/MISC_UE/Cropout示例项目/Plugins/IslandGenerator/Content/Misc/M_Landscape.uasset

岛屿材质的材质实现使用了简单粗暴而又巧妙的方式,直接使用Absolute World Position坐标系来定义材质。岛屿的上方是草地,下方是土地。并且通过RenderTarget实现了表面动态阴影的效果。

草地和土地的材质
虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第10张图片

通过RenderTarget实现草地上的动态效果

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第11张图片

动态为草地设置颜色

草的颜色是使用Material Parameter Collection定义的,因为草是绿色的,所以它的随机HSV色相也需要在绿色区间。

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第12张图片

程序设计的小技巧

IslandGenerator在《CropOut》中以插件形式存在,这就意味着它不应该依赖Game中的任何逻辑,但是在IslandGenerator的逻辑中还要调用Game里的方法,这种情况如何来处理呢?方法很简单,在IslandGenerator定义一个蓝图接口BPI_IslandPlugin,在Game中让需要的类实现这个接口。
虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第13张图片

这样在IslandGenerator中就只需要调用接口就可以了。

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第14张图片

其它

Platform Switch函数

移动平台使用低精度,PC等平台使用高精度。为后续多平台发布打下基础。
虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)_第15张图片

你可能感兴趣的:(虚幻引擎官方案例详解合集,虚幻引擎图文笔记,虚幻,ue5,虚幻5,游戏引擎,游戏开发,官方案例)