开个新坑详细分析一下虚幻官方发布的《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应用的一个范例,它包含了几何体的生成和优化,以及针对本项目特点采取的一种巧妙的贴图方式。
几何体生成部分
随机种子
Seed
是Random Stream
类型并保存在BP_SaveGM中,每一个关卡的随机数都是由同一个Seed
通过Random Unit Vector from Stream
以及Random Float in Range from Stream
等方法获得,这样就能够确保游戏存档再开启以后还原之前的岛屿。
Step 1
随机生成一些平顶的圆锥体Cone
Step 2
在几何体底部添加一个添加Box
添加Box主要是为了后面做平滑的时候,让斜面有一定弧度,看起来更自然,下面是未添加Box和添加Box的效果对比
Step 3
为几何体整体做平滑处理
Apply Mesh Solidify
:对DynamicMesh
所有的子物体进行体素化,然后获得外表网格,实际上相当于对所有子物体进行了布尔并集运算,在本例中针对还性能平台和低性能平台使用了设置了不同的精度即体素颗粒的大小。
-
Set Mesh To Per Vertex Normals
:平滑法线 -
Apply Iterative Smoothing to Mesh
:对DynamicMesh
进行整体平滑 -
Apply PNTessellation
:对DynamicMesh
进行细分,同样针对不同性能的平台使用不同的细分级别
Step 4
用平面切掉底部的没用的部分
Step 5
先定义一个平面将山顶切掉,然后再用平面投影的方式设置几何体的UV
Step 6
释放Compute Mesh以及向GameMode发出岛屿生成完毕的通知
岛屿材质部分
材质文件位置:E:/MISC_UE/Cropout示例项目/Plugins/IslandGenerator/Content/Misc/M_Landscape.uasset
岛屿材质的材质实现使用了简单粗暴而又巧妙的方式,直接使用Absolute World Position坐标系来定义材质。岛屿的上方是草地,下方是土地。并且通过RenderTarget实现了表面动态阴影的效果。
草地和土地的材质
通过RenderTarget实现草地上的动态效果
动态为草地设置颜色
草的颜色是使用Material Parameter Collection定义的,因为草是绿色的,所以它的随机HSV色相也需要在绿色区间。
程序设计的小技巧
IslandGenerator在《CropOut》中以插件形式存在,这就意味着它不应该依赖Game中的任何逻辑,但是在IslandGenerator的逻辑中还要调用Game里的方法,这种情况如何来处理呢?方法很简单,在IslandGenerator定义一个蓝图接口BPI_IslandPlugin,在Game中让需要的类实现这个接口。
这样在IslandGenerator中就只需要调用接口就可以了。
其它
Platform Switch函数
移动平台使用低精度,PC等平台使用高精度。为后续多平台发布打下基础。