自制UE插件 – 体素锻造 (体素生成工具集)教程

内容目录

这是自己做的一个插件,可以在虚幻商城中下载(还没上传),主要是利用 C++ 制作了高效的类 Minecraft 体素渲染方式。

点此打开虚幻商城(未完成)

语言: >中文< | English(未完成)

前言:这是一个可以在 UE 中实现类 Minecraft 的体素世界工具,特别鸣谢:https://myredstone.top/

快速入门

如果想快速创建一个关卡,可以直接使用 Voxel Forge Subsystem 类,你可以通过调用此类中的 Create Level 函数快速创建关卡。
这个类可以在蓝图或者C++中使用,在使用这个创建关卡之前,需要进行一些配置。使用 Set Voxel Global Setting Override 来进行全局设置。
file

第一个是你需要的材质,在插件的内容文件夹中已经有了默认材质,直接使用插件内容中的 Material/M_VoxelChunkInstance 作为材质即可。
file
第二个是 Texture Resource Setting,这个涉及到你想要在蓝图中直接使用纹理2D数组还是从外部读取路径。
如果你想使用纹理2D数组,则可以传入 Texture Array 参数,并不勾选 Use Outside Directory Textures
在插件内容的 Material 文件夹中提供了一个纹理数组。
file

如果你希望使用外部纹理,也就是 PNG 形式的文件,则可以勾选 Use Outside Directory Textures,并在 Outside Directory Textures Path 中填写你纹理所存储的文件夹。
例如插件 Resource 文件夹中已经提供了一些我绘制的外部纹理,你可以直接通过输入类似于 D:\\Project\\AstralReactor\Plugins\\\VoxelForge\\Resources\\DefaultTextures\\ 的绝对路径来读取他们,这是我在我的硬盘上的目录,使用时需要根据需求修改成你自己的。
当然这里也可以使用相对路径,但要确保路径正确。
Outside Texture Size XOutside Texture Size Y 分别代表外部纹理的大小,需要确认的是,外部的所有纹理必须是相同大小的,例如其中一个是16x16,则其他的应当为16x16。
Outside Filter 是指纹理采样,如果想要类 Minecraft 的则可以使用 “Nearest”。
file

Blocks Register 中填入自己的方块注册器,在后续中会说明如何更改,这里可以直接我已经提供的,名字叫 BP_DefaultBlockRegister
file

当你完成基本设置后,则可以直接使用 Create Level 函数创建关卡,这里仍然需要关卡参数,第一个参数是存档路径,你可以设置在任意位置,第二个参数是关卡名字,可以随意,第三第四个参数是预生成的范围,这意味着在游戏开始的时候会生成或者读取这个范围内的所有区块。
file

然后直接进 PIE,可以看到已经加载出世界了。
file

玩家创建

因为整个世界涉及到区块加载相关功能,所以插件中提供了 Voxel Player Component,拥有它的 Actor 拥有视距能力,可以动态的加载和卸载周围的区块。
打开任何一个蓝图,并给蓝图添加 Voxel Player Component,在蓝图中调用 Voxel Player ComponentUpdate Surrounding Chunks 成员函数,这个函数可以不被每 Tick 调用,就算被每 Tick 调用,此函数也会聪明的区分什么时候应该加载卸载区块。
具体的示例在插件内容中的 Template 文件夹,里面有 VoxelPlayer
file
file
你也可以修改这个玩家的视距范围,在 Voxel Player Component 的细节面板中可以修改。
file

世界交互

插件中封装了一些可以快速与世界交互的功能,首先最重要的是 Voxel Line Trace,这个函数可以填入一个起始位置与一个结束位置,并返回触碰到的关卡,碰到的方块位置(世界),碰到的方块ID等等,这个函数有一个 Outside Pos 参数,当此参数勾选时,则返回触碰到的方块外侧一格距离的方块(放置时使用),当不勾选时,则返回触碰到的方块(破坏时使用)。
file
接下来是 Set Block Immediately 此函数会设置指定世界方块位置为指定方块ID并立刻渲染,默认的注册器中提供了 Vanilla::Air Vanilla::Grass Vanilla::Stone Vanilla::Log Vanilla::Leaf 五种ID,之后会将如何注册自己的方块并应用材质。
file

方块注册

在蓝图中,你可以继承自 Voxel Block Register 创建一个方块注册器,并在全局设置中重写你自己的方块注册器。
双击打开方块注册器,在细节面板中可以加入你想要的方块,每个方块有ID,方块类型与六个面的设置,由于世界生成需要依赖草,石头,所以方块注册器中最少要拥有这两个ID,而空气方块是内建的,所以不需要。
file

先看ID,ID拥有一个命名空间与一个名字,命名空间防止命名冲突,而名字指的是方块本身的名字,必须确保每个方块的ID是唯一的。
file
之后是 BlockType,它的意思是方块的类型,目前只有 BlockAir 两种类型,当类型为 Air 时不会渲染,当类型为 Block 时正常渲染。
file
这里虽然显示的是UV参数,但实际上目前只有X可以使用,X代表的是你的纹理在纹理数组中的下标。假设现在我们使用的是从外部加载,由于外部加载需要有一定顺序,可以使用 00001-GrassSide 等命名方式让插件以正确的顺序加载,例如现在 1-GrassSide 是第二个被加载的,所以它的下标应该是 1 ,如果我希望它的侧面是 1-GrassSide,则我需要将除了 CustomTopFaceUV 的其他X全部设置为1。
file
保存后先将全局设置修改为你的方块注册器,并在世界交互那里,将放置方块的ID设置为你自己创建的ID,例如我这里是 Vanilla::TestBlock,然后你会发现你已经可以放置方块了。
file

如果你希望在 C++ 中内建本来就有的方块类型,而无需每次都要把草和石头加入到方块注册器中,则可以在 VoxelForgeSubsystem.cpp line:133 中加入

    SetVoxelBlock({TEXT("Vanilla"), TEXT("Grass")}, FBlock_Grass());
    SetVoxelBlock({TEXT("Vanilla"), TEXT("Stone")}, FBlock_Stone());

并删除掉你使用的方块注册器如默认注册器中的 Grass 与 Stone。
file

滚动至顶部