截至UEFN 25.20版本,我们只能使用SpawnProp来生成道具,而不能生成设备。不过……如果我们将设备放置在道具中会发生什么呢?没错:它们也会被生成!
这项技术很简单但非常隐蔽:制作一个包含设备的子级容器的自定义道具,添加一些游戏标签以在Verse中使用生成的设备,然后生成它。
1. 已知限制
无法生成自定义Verse设备(除非它们完全失效),只能生成内置设备。听起来很令人沮丧,但你可以轻松解决:制作一个单一的Verse设备,用数组管理所有生成的设备的“实例”。
生成的设备无法直接在Verse中查询,必须查询所有生成的设备。这意味着一旦调用SpawnProp,你就无法直接获取你生成的设备。相反,你只能访问所有你生成的设备(具有相同标签)。这有点烦人,但你可以创建一个Verse系统,将每个道具与其设备关联起来(例如使用映射)。
一旦将设备“转换”为道具,就无法编辑设备属性。这非常令人烦恼,唯一的解决办法是重复这个过程,并在每次想要更改设备设置时创建一个新的道具。如果你幸运的话,一些设置可以在Verse中设置,这样你就不需要这样做。
对于本教程,我们的目标是制作一个系统,生成篝火设备,并定期点燃和熄灭它们。
2. 创建游戏标签
一般来说,游戏标签对于标记场景中的对象很有用。为我们想要生成的设备分配一个游戏标签是必要的,以便在Verse中与生成的设备交互。如果你只需要生成一个设备并移动它,这一步是可选的。
让我们创建一个名为spawned_campfire_tag的游戏标签。你也可以查看UEFN文档中的游戏标签页面来完成这个步骤。我们将创建一个单独的Verse文件,其中包含我们所有的游戏标签。当然,你也可以按照自己的方式组织事物。
UEFN文档中的游戏标签页面:
https://dev.epicgames.com/documentation/en-us/uefn/gameplay-tags-in-verse
打开Verse浏览器窗口(位于顶部菜单中:Verse > Verse Explorer),通过右键单击你的项目名称,并使用“添加新的Verse文件到项目”选项创建一个新的Verse文件:
另一个窗口将出现,在这里你可以为包含游戏标签的文件选择一个名称。然后,请确保点击“创建空文件”,而不是创建设备。
完成后,双击打开该文件。然后,按照文档的说明填写文件以声明标签。如果需要,你可以更改标签的名称。
声明标签的文档说明:
https://dev.epicgames.com/documentation/en-us/uefn/gameplay-tags-in-verse#creatingagameplaytag
确保在UEFN中构建Verse代码,方法是按下Ctrl+Shift+B,或者通过菜单进入(Verse > Build Verse Code),这样我们就完成了!
3. 创建道具设备
为了生成一个设备,我们需要将它放入一个道具中,并添加我们创建的游戏标签。我们可以使用子级容器选项来完成这个操作。
警告:这种方法不能很好地与Verse设备配合使用,如果你尝试这样做,可能会在地图中留下故障和无法删除的设备!
首先,将设备拖放到你的世界中。根据你的喜好配置其属性,然后单击“添加”按钮,选择“Verse标记标记”组件(在搜索栏中键入“verse”)。
添加完Verse标记标记组件后,单击它。然后,点击“编辑...”按钮,通过勾选旁边的复选框来添加spawned_campfire_tag。
我们的设备现在已经准备好转换为道具了!点击“从选择中创建蓝图”按钮,就在“添加”按钮旁边:
会弹出一个窗口,显示新创建的道具。如果您之前没有使用过虚幻引擎,这可能会看起来有些混乱。我来总结一下其中发生的事情:
道具由一个静态网格和用于碰撞的边界框组成。在这里,我们有一个没有静态网格的道具。
我们还有另一个名为“Device_Campfire_C”和一堆数字的神秘组件。尽管默认名称不太好看,但这是一个子级容器组件,它将生成一个设备容器(篝火),并附加到道具上。
您可以尝试使用这种技术,并做更有趣的事情!您可以向道具添加网格;在道具内部移动设备;甚至在单个道具中放置多个设备,只需在单击“从选择中创建蓝图”按钮之前选择多个设备即可。
请记住,移动道具也会移动附加到其中的设备,设备不能引用世界对象,您无法编辑设备属性(除了位置、旋转、比例和可见性)。
如果您不再需要,现在可以删除世界中的道具设备了。
4. 生成设备
现在是时候在Verse中生成设备了!在本示例中,我们只想在游戏开始时生成一个篝火。
为了生成设备,我们需要获取到道具资产的引用。我们可以使用creative_prop_asset类型的变量来实现这一点。然后,我们只需调用 SpawnProp,传入道具资产和变换(平移、旋转、比例)。
我们将创建一个名为campfire_spawner的设备。您可以像往常一样创建一个Verse文件(使用“创建”而不是“创建空文件”),或者只需阅读代码以了解其工作原理。
重新构建Verse代码,并将生成器设备放入世界中。然后,用我们想要生成的道具设备填写道具变量:
现在启动游戏,稍等片刻,然后...篝火设备就出现在你面前了!太棒了,这就是UEFN的巅峰体验!
回到Verse,SpawnProp函数返回一个元组,类型为tuple(?creative_prop, spawn_prop_result)。你可以使用元组的第一个值来获取生成的道具,下面是一个示例:
然后你可以操作这些道具:将它们传送,沿着样条线移动... 这也会移动任何附加到它的设备。检查Verse API,看看你可以用prop做些什么。
5. 在Verse中访问生成的设备
这很酷,但如果我们想在Verse中使用这个设备呢?这就是我们创建的Gameplay Tag发挥作用的地方。目前,这是查询世界中对象的唯一方式;当然,SpawnProp不会返回生成的设备。
使用GetCreativeObjectsWithTag函数,我们可以获取所有带有给定标签的对象。因此,我们可以获取所有带有spawned_campfire_tag标签的对象,并找到我们已经生成的所有营火!看看这个示例:
使用这种方法(并编写更多代码),我们现在可以让所有的篝火在点燃和熄灭之间交替。效果很好!
6. 更进一步
这基本上就是你需要了解的有关生成设备的全部内容了。不过,仍然很烦人的是,我们必须查询所有生成的设备,而不是只获取我们生成的设备。你可以建立一个系统来解决这个问题,通过消除已知的设备,将每个生成的 creative_prop与它们的creative_device相关联。也许有一天我会写一些代码来实现这一点并发布出来,但目前,这是给你的一个挑战!
你可以利用这种方法做很多事情,你可以使用任意数量的Unreal Engine组件!例如,你可以尝试制作一个带有网格、一些Niagara粒子和一个(隐形的)爆炸装置的炸弹;或者使用广告牌设备在移动网格前面显示一些文本。
尽情享受动态内容吧!
近期焦点