虚幻4笔刷刷植被后,如何让植物可破碎和压倒?
这是本人第一次发博客,如果有什么考虑不周,写的不好的,还希望能指点出来。
主要是分享一下平时遇到的一些问题和做法,仅供参考。
关键词:虚幻4、蓝图、植物交互、破碎、压倒
问题:虚幻4笔刷刷植被后,如何让植物可破碎和压倒?
实现思路:
通过设置一个扫描范围,将范围内的植物替换为经过处理可交互的植物;
1.笔刷刷完植物后,如何让植物可破坏?
A.在Content Browser(内容浏览器)找到想要可破坏的植物,鼠标右击
点击create destructible mesh(创建可破坏网格),此时会在同一个文件夹下生成一个同名但加上”_DM”的文件;
B.双击打开生成的”_DM”文件,进入编辑窗口,如下:
Fracture Setting标签页的参数说明如下图。
根据喜好对碎块数量和裂纹的走向进行设置(随机种子为改变裂纹走向,0值不一定要修改);
C.设置完碎块数量后,点击上边工具栏的Fracture Mesh按钮。
会看到预览窗口的物体出现了裂纹。
并可通过上方的Explode Amount滑动条滑动,查看内部破裂。
此处有三点需要注意,
第一是每次修改参数后,要点击Fracture Mesh按钮才可预览到新裂纹,
第二是如果窗口很暗,可鼠标右键进行旋转,然后鼠标中键移动,移动到亮光的一面预览,第三是Explode Amount滑动条滑动预览需要确定旁边的Preview Depth下拉框选中的是Preview Depth 1而不是Preview Depth 0;
D.Destructible Settings标签页的参数很多,可对破裂的损坏程度、发生碰撞的对象默认弹回、残骸分离一段时间后被破坏等等进行设置,具体的参数说明可参考官方文档:
此处我们会用到的是Skeletal Mesh这一块。
原本Materials只有一个0的数组元素,点击Fracture Mesh按钮后,会多生成一个1的数组元素,这个是产生裂纹后的那些横截面的Material,如果内部的横截面Material没有要求可用0的Material即可,如有要求,设置成相应的Material即可,设置并确认后,点击上边的工具栏Save按钮。需要进行破碎操作的植物,进行以上步骤后备用即可;
E.切回主窗口并将”_DM”文件拖动到场景中,点击World Outliner中的”_DM”标签,点击Details标签页的Blueprint/Add Script按钮(此处为给”_DM”文件增加蓝图进行控制,可根据自己喜好进行添加,先建立蓝图再添加”_DM”也可),选择保存路径,根据喜好对蓝图命名;
F.打开”_DM”的蓝图,点击Add Component,给物体添加一个合适的Collision(碰撞体),并在Viewport窗口调整Collision(碰撞体)的位置和大小;
G.切换到Event Graph窗口,点击左侧Components标签页中在F.步骤添加的Collision(碰撞体),在Details标签页,滑动到最下方的Event模块,点击On Component Begin overlap按钮后,会在窗口中生成一个Event(事件)。
此处为给物体被碰撞时的破碎,添加事件,具体做法可根据个人喜好进行调整,此处的第一张图为本人使用,后面两张为参考使用,经实验可使用。
第一张图通过验证碰撞的对象是否时名字叫做”BPP_XM_Car”,第二张图通过验证是否能够cast到”BPP_XM_Car”的对象,第三张图是比较碰撞的对象是否是”BPP_XM_Car” Object。方法有多种,此处用到的重要的方法是Apply Radius Damage。
其中的Base Damage、DamageRadius、Impulse Strength需要进行设置,否则碰撞后不会发生破碎效果,分别是基础破坏力、破坏半径、冲击力度,根据喜好进行设置;
H.设置完成物体后,还需要实现一个扫描空间的功能,来将范围内不可交互的笔刷刷出来的植被替换成我们设置好可以撞碎的物体,此处用的是官方的车子,给车子的周围生成一个扫描空间。
打开车子的蓝图,此处已经有一些控制移动的代码了。
因为车子类似长方形,所以此处使用MultiBoxTraceByChannel,可根据需要对自己的角色使用不同方法。
从Event Tick中引一条线连接到MultiBoxTraceByChannel的Exec入口。
本人此处的做法是车子坐标为扫描的Start点,End点的z值需要加上车子高度的一半,不然一半的扫描空间是在地下,并且z值加上5以免过于贴近地面,HalfSize点连上变量CarHalfSize的x和y各乘以2后的值,使左右前后扫描的范围是一个车子的长度和宽度,但高度不变,CarHalfSize如实填上车子的尺寸的一半即可,orientation点连上车子的角度让扫描空间跟着车子旋转,Draw Debug Type可下滑选择For One Frame,以方便运行时进行测试。
运行程序,可看到车子周围有一个红色的框,以车子的中心算,前后各一个车子长度,左右各一个车子宽度,高是车子的高度。
如果想查看自己的角色的尺寸,可在Content Browser(内容浏览器)中找到你的角色双击打开,可在窗口的左上角看到相关信息。
获取当前玩家角色,根据具体情况自行选择,不一定就是Get Player Pawn;
I.当扫描范围触碰到笔刷刷出来的植被时,线框会由红色变为绿色,在触碰之前需要将植物的属性进行设置。刷植物之前Collision Presets默认值是NoCollision,如果刷之前已经设置了Collision Presets则可跳过此步骤。
没有设置就刷了也没事,重新将场景中有的植物都拖动进这个小窗口,还在的就不必再重新拖动进来。
鼠标点击小窗口中空白地方,按下Ctrl+A,下方的小窗口会显示出很多参数,拖动到Collision Presets一行,根据需要选择collision类型,此处本人选择OverlapAll。
保存后,重新运行游戏,线框接触笔刷刷出来的植物,线框变成绿色,离开线框编程红色
J.接下来就是做替换植物操作了,做法如下,
用ForEachLoop接收并循环遍历触碰到的物体,然后Cast到Foliage Instanced Static Mesh Component,cast到说明它是植被,然后get一下它的Static Mesh并获取植被的名字也就是在Content Browser中显示的名字。
然后用Switch比较不同名字生成不同的对象来替换,替换后再Remove被替换的Instance,完成以上步骤后,就可以保存并运行游戏,开车撞碎植物了;
K.除了使用MultiBoxTraceByChannel来扫描范围,也可手动给角色添加Collision(碰撞体),并添加相应代码实现;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.笔刷刷完植物后,如何压倒植物?
A.实现思路一样,扫描范围内将植物替换为经过处理可交互的植物,扫描范围替换植物的实现参考1.中的H.~J.,压倒植物需要美术给植物添加骨骼和刷上权重,不需要做动画,只需加上骨骼和刷上权重即可,如果只有压倒的要求只要地下一个骨节,地上再连接一个骨节即可,如果穿越植物,扫开植物之类,可根据情况在植物的部位上加骨节;
B.拿到美术给的新的植物后,在要存放的文件夹右键,点击Import,导入进来。
导入后应有四个文件,分别是Skeletal Mesh、Material、Physice Asset、Skeleton。
双击打开Physice Asset,应在左侧的Hierarchy面板看到有Joint开头的骨节,中间窗口会看到一颗干净的植物或者带有两个collision的植物,
C.如果中间窗口显示的collision希望重建,可选择后删除。选择第一个joint即底部的那个骨节,右键点击New Body,点击Collision Geometry下拉框,选择需要的Collision,此处本人选择Sphere,其他选项可以不更改,点击Ok。
中间窗口会出现一个球型collision,选择窗口上方的三个调节按钮进行大小位置调整,此处是美术把骨节弄歪了,正常应该Z轴垂直指向上方才对。
调节使其在底部中心处。
点击该collision,并在Details面板中找到Physics中的Physics Type下拉并选择Kinematic。
对第2个joint进行相同操作,调整到合适大小、角度和位置,但是不需要选择Kinematic。
调整完成后,点击上方工具栏的ConStraints按钮。
中间窗口只显示collision。
点击Hierarchy面板中第2个joint,会看到中间窗口多出一个圆圈,这是这一节转动的支点。
将这个点,调整到要转动的位置,调整的时候同调整两个collision时一样,要注意旋转查看别的角度是不是对准了。
调整后,可以点击上方工具栏的Simulate按钮,模拟一下,会发现,植物直接顺着那个点倒了下来。
重新点击Constraints,并选中Hierarchy面板中的Joint2,在Details面板找到Angular Motor模块,并勾选上Target Orientation和Target Velocity下的Drives的Slerp,数值设置如下图
此处的设置是让植物被撞倒后,可以重新弹起,其他的参数设置和说明可参考官方文档:
设置完成后重新点击工具栏的Simulate按钮,可以看到植物一直挺着。
可以通过CTRL+鼠标右键在窗口中滑动,模拟外力作用在植物上时的表现,到这里,植物被拨倒,会重新立起来。
D.保存并回到主窗口,将刚刚完成的草拖动到场景中,点击World Outliner中草的Label,然后点击Details中的Blueprint/Add Script,选择储存路径并保存。
打开进入刚创建的Blueprint,点击Component面板中的SkeletalMeshComponent,然后在Details面板中找到Collision模块,并展开Collision Presets。
在Collision Presets下拉框中选择Custom,并勾选上WorldStatic的Ignore选项。
此处这么做的目的是,让collision忽略WorldStatic属性的地板,这样被车子压倒时可以部分倒入地下,而不至于抬起了车子。当然这部分可以根据自己需要进行处理。
E.接着要做替换植物的部分了,回到前面写过的扫描空间代码那里,在Switch上加多一个String(即加上要被压倒的植物的名字)
使用用Spawn Actor From Class,在原有的基础上添加进去,连上相应的线就可以了。
E.保存后,运行游戏,车子压过草时,草倒地。
如果草压过时没有倒地,请检查草刷子属性的Collision Presets是否已经改成非NoCollision的了。
有条件FQ可参考:
https://www.youtube.com/playlist?list=PLT4SeajOa6mbF_zINb7qE5yc7-g1FaqaP