这是自己做的一个插件,可以在虚幻商城中下载(还没上传),主要是利用 C++ 制作了高效的类 Minecraft 体素渲染方式。
点此打开虚幻商城(未完成)
语言: >中文< | English(未完成)
前言:这是一个可以在 UE 中实现类 Minecraft 的体素世界工具,特别鸣谢:https://myredstone.top/
快速入门
如果想快速创建一个关卡,可以直接使用 Voxel Forge Subsystem
类,你可以通过调用此类中的 Create Level
函数快速创建关卡。
这个类可以在蓝图或者C++中使用,在使用这个创建关卡之前,需要进行一些配置。使用 Set Voxel Global Setting Override
来进行全局设置。
第一个是你需要的材质,在插件的内容文件夹中已经有了默认材质,直接使用插件内容中的 Material/M_VoxelChunkInstance
作为材质即可。
第二个是 Texture Resource Setting
,这个涉及到你想要在蓝图中直接使用纹理2D数组还是从外部读取路径。
如果你想使用纹理2D数组,则可以传入 Texture Array
参数,并不勾选 Use Outside Directory Textures
。
在插件内容的 Material
文件夹中提供了一个纹理数组。
如果你希望使用外部纹理,也就是 PNG 形式的文件,则可以勾选 Use Outside Directory Textures
,并在 Outside Directory Textures Path
中填写你纹理所存储的文件夹。
例如插件 Resource
文件夹中已经提供了一些我绘制的外部纹理,你可以直接通过输入类似于 D:\\Project\\AstralReactor\Plugins\\\VoxelForge\\Resources\\DefaultTextures\\
的绝对路径来读取他们,这是我在我的硬盘上的目录,使用时需要根据需求修改成你自己的。
当然这里也可以使用相对路径,但要确保路径正确。
Outside Texture Size X
与 Outside Texture Size Y
分别代表外部纹理的大小,需要确认的是,外部的所有纹理必须是相同大小的,例如其中一个是16x16,则其他的应当为16x16。
Outside Filter
是指纹理采样,如果想要类 Minecraft 的则可以使用 “Nearest”。
在 Blocks Register
中填入自己的方块注册器,在后续中会说明如何更改,这里可以直接我已经提供的,名字叫 BP_DefaultBlockRegister
。
当你完成基本设置后,则可以直接使用 Create Level
函数创建关卡,这里仍然需要关卡参数,第一个参数是存档路径,你可以设置在任意位置,第二个参数是关卡名字,可以随意,第三第四个参数是预生成的范围,这意味着在游戏开始的时候会生成或者读取这个范围内的所有区块。
然后直接进 PIE,可以看到已经加载出世界了。
玩家创建
因为整个世界涉及到区块加载相关功能,所以插件中提供了 Voxel Player Component
,拥有它的 Actor 拥有视距能力,可以动态的加载和卸载周围的区块。
打开任何一个蓝图,并给蓝图添加 Voxel Player Component
,在蓝图中调用 Voxel Player Component
的 Update Surrounding Chunks
成员函数,这个函数可以不被每 Tick 调用,就算被每 Tick 调用,此函数也会聪明的区分什么时候应该加载卸载区块。
具体的示例在插件内容中的 Template
文件夹,里面有 VoxelPlayer
。
你也可以修改这个玩家的视距范围,在 Voxel Player Component
的细节面板中可以修改。
世界交互
插件中封装了一些可以快速与世界交互的功能,首先最重要的是 Voxel Line Trace
,这个函数可以填入一个起始位置与一个结束位置,并返回触碰到的关卡,碰到的方块位置(世界),碰到的方块ID等等,这个函数有一个 Outside Pos
参数,当此参数勾选时,则返回触碰到的方块外侧一格距离的方块(放置时使用),当不勾选时,则返回触碰到的方块(破坏时使用)。
接下来是 Set Block Immediately
此函数会设置指定世界方块位置为指定方块ID并立刻渲染,默认的注册器中提供了 Vanilla::Air
Vanilla::Grass
Vanilla::Stone
Vanilla::Log
Vanilla::Leaf
五种ID,之后会将如何注册自己的方块并应用材质。
方块注册
在蓝图中,你可以继承自 Voxel Block Register
创建一个方块注册器,并在全局设置中重写你自己的方块注册器。
双击打开方块注册器,在细节面板中可以加入你想要的方块,每个方块有ID,方块类型与六个面的设置,由于世界生成需要依赖草,石头,所以方块注册器中最少要拥有这两个ID,而空气方块是内建的,所以不需要。
先看ID,ID拥有一个命名空间与一个名字,命名空间防止命名冲突,而名字指的是方块本身的名字,必须确保每个方块的ID是唯一的。
之后是 BlockType
,它的意思是方块的类型,目前只有 Block
与 Air
两种类型,当类型为 Air
时不会渲染,当类型为 Block
时正常渲染。
这里虽然显示的是UV参数,但实际上目前只有X可以使用,X代表的是你的纹理在纹理数组中的下标。假设现在我们使用的是从外部加载,由于外部加载需要有一定顺序,可以使用 00001-GrassSide
等命名方式让插件以正确的顺序加载,例如现在 1-GrassSide
是第二个被加载的,所以它的下标应该是 1
,如果我希望它的侧面是 1-GrassSide
,则我需要将除了 CustomTopFaceUV
的其他X全部设置为1。
保存后先将全局设置修改为你的方块注册器,并在世界交互那里,将放置方块的ID设置为你自己创建的ID,例如我这里是 Vanilla::TestBlock
,然后你会发现你已经可以放置方块了。
如果你希望在 C++ 中内建本来就有的方块类型,而无需每次都要把草和石头加入到方块注册器中,则可以在 VoxelForgeSubsystem.cpp
line:133
中加入
SetVoxelBlock({TEXT("Vanilla"), TEXT("Grass")}, FBlock_Grass());
SetVoxelBlock({TEXT("Vanilla"), TEXT("Stone")}, FBlock_Stone());
并删除掉你使用的方块注册器如默认注册器中的 Grass 与 Stone。