效果
步骤
1. 新建一个Actor蓝图,这里命名为“BP_程序化网格体”
打开“BP_程序化网格体”,添加一个静态网格体组件,再添加一个程序化网格体组件
选中程序化网格体组件,取消勾选“将复杂性用作简单碰撞”选项
选中静态网格体组件,给其赋予一个模型
在构造函数中,将静态网格体的“New Mesh”引脚提升为变量,变量命名为“CustomMesh”
变量“CustomMesh”,勾选可编辑实例,和生成时公开
在构造函数中继续设置
在事件图表中,创建一个自定义事件,这里命名为“网格体切片”,首先添加一个“将程序化网格体切片”节点,这个节点就是将网格体切割的核心。该节点的引脚“Plane Position”和“Plane Normal”分别表示切面上任意一点的位置和切面法线。引脚“Create Other Half”表示网格体切下来之后是否还需要保留被切下来的一半。引脚“Cap Material”表示切面的材质。输出引脚“Out Other Half Proc Mesh”表示被切下的另一半(类型也是程序化网格体组件的对象引用)
在自定义事件“网格体切片”中添加两个输入的参数,这两个参数分别表示切线位置和法线,连接到“Plane Position”和“Plane Normal”引脚,勾选Create Other Half”,“Cap Option”引脚选择“新建上限的分段”,“Cap Material”引脚选择随便选择一个材质。
上面的逻辑此时已经能够实现将静态网格体切分的功能,但是被切后的网格体如果没有外力影响,是看不出这个网格体已经被切开了。
为了让被切后的网格体能够顺利的分开来,我们首选需要选中“程序化网格体”组件,勾选“模拟物理”选项。
让被切下来的另一半也开启碰撞和模拟物理
对分割后的两个物体分别施加法线方向的力
此时我们切割的逻辑已经完成,接下来我们希望通过鼠标触发切割事件,然后通过鼠标点击将网格体切割为两个部分。
2. 我们希望只有指定的物体可以被切割。打开项目设置,点击“新建检测通道”按钮
命名为“可切割物”,默认响应设置为“Ignore”,然后点击接受
3. 回到“BP_程序化网格体”中,这里设置程序化网格体组件的碰撞预设为自定义,碰撞响应中可切割物为阻挡
4. 打开关卡蓝图,首先显示鼠标光标
当点击鼠标后发出一条射线检测
判断射线检测到的物体的类型是否是“BP_程序化网格体”
如果是的话就调用自定义事件“网格体切片”
5. 将“BP_程序化网格体”拖入场景中,设置公开参数“Custom Mesh”为一个网格体模型
此时运行效果如下,发现有一部分无法切割
6. 回到“BP_程序化网格体”,添加如下节点
自定义事件添加一个输入,命名为“被检测组件”,变量类型为“基元组件”
然后将输入的“被检测组件”类型转换为程序化网格体组件,再设置给蓝图的程序化网格体组件
此时运行游戏发现切下来的所有部分都可以进行切割了:
参考视频:
https://www.bilibili.com/video/BV1KM411473p/?spm_id_from=333.999.0.0&vd_source=36a3e35639c44bb339f59760641390a8