UE4实现破碎效果


老师特别不推荐直接使用插件去完成实验,所以写了很多,很啰嗦。

一、实验要求

目的: 熟悉Mesh的概念,能自由利用Mesh数据。
要求: 编写一个脚本,实现对mesh的破碎效果。
Dalao作品示例↓:(不是我的!!不是我的—)
在这里插入图片描述

二、软件核心代码(算法+代码文本)

我先是使用apex destruction插件试了一下做出破碎效果,然后自己手动又用代码做了一下破碎效果。下面是实验过程记录,因为不算对ue4界面很熟,所以可能写的很详细。

  1. 使用插件制作破碎效果: 在ue4 StarterContent->Props文件夹里选中一个模型。
    在这里插入图片描述
    在设置面板里找到插件位置,选中Apex Destruction插件,在已启用处勾选。

在这里插入图片描述
选中一个静态网格体模型右键,点击“创建可破坏网格体”。

下面记录了一些我查到的参数作用:
Voronoi控制碎块的数目,Fracture Material Desc控制碎块生成的随机性。
“爆炸当量”能调整碎块之间的距离。
在这里插入图片描述
在这里插入图片描述
调节完毕后,点击“破碎网格体”得到效果如下的破碎。
在这里插入图片描述
按照官网上的教程,我想要给破碎体添加内外材质。(顺便学一下怎么在UE4里面自己做材质)
Ue4里制作简单材质的方法:
右键创建新的材质,重命名后双击点开。此时应该是下面的界面。

在这里插入图片描述
给材质添加constant和constant3Vector两个常量。
在这里插入图片描述
Constant控制材质的粗糙程度,constant3Vector控制材质的颜色。
在这里插入图片描述
因为材质要应用到骨架网格体上,所以需要勾选“使用骨架网格体选项”(后来我尝试了一下,不勾选也可以,u添加到骨架网格体上时ue4会自动给你勾上)
在这里插入图片描述
材质创建好了以后给要可破碎网格体添加上,0号材质是外面的一层材质,1号材质是里面的一层材质。我想跟着官网做那种破碎以后里外颜色不同的效果,但是失败了,ue论坛里有人说这个插件有一点问题。

最后在主界面打开可破坏网格体的模拟物理和模拟命中事件。
在这里插入图片描述
点击运行,得到效果如下:
在这里插入图片描述
然后我又试着下载了模型,导入UE4进行破碎查看效果。
UE4支持导入fbx和obj模型的导入,它会自动生成一些比如static mesh的文件,比较智能。
在这里插入图片描述

  1. 使用UE4代码和蓝图制作破碎效果:

Ue4的点开模型的界面可以显示出这个模型的mesh顶点,但想要自己用代码访问获取它的顶点数据还是得费点功夫的,在ue4官方论坛上有大神写了获取mesh顶点数据的教程。
在这里插入图片描述
找了很久的教程,获取mesh网格顶点数据的核心代码:(UE4的教程真的太少啦,这个还是科学上网到论坛上找到的)
在这里插入图片描述
在UE4里Tick( )函数是每帧都会被调用的函数。
接下来就要在Tick( )函数里把获取到的mesh顶点都画出来。
在这里插入图片描述
运行一下,顶点找到的效果如下。红色的就是找到的顶点位置。
在这里插入图片描述
在找到顶点以后。开始下一步操作。新建一个蓝图类fragment,给他设置添加上基本的static mesh 和material。并且在physics一栏勾选模拟物理。
在这里插入图片描述在这里插入图片描述
换了一个形状,现在更像破碎后的碎片了。
在这里插入图片描述
下面让它怎么碎我就找不到代码教程了,班里面一个做游戏的大佬教我用蓝图实现了,菜鸡落泪。

下面打开MyBreakingActor类的蓝图编辑器,开始用蓝图写出MyBreakingActor类的break函数。它的执行过程是这样的:

  1. 调用MeshData方法获取mesh顶点。
  2. 显示循环遍历获取的每一个顶点,在顶点位置处生成fragment。
  3. 循环执行完以后,销毁MyBreakingActor实例。其蓝图视图如下所示:
    在这里插入图片描述
    设置完break函数后,给要碰撞的breakingActor添加碰撞capsule,同时给地面也添加碰撞体以实现碰撞事件的触发。这样就可以实现碰撞后破碎的效果了。
    在这里插入图片描述
    右键单击世界大纲视图中的mybreakingactor类,在“添加事件”中选择“OnActorBeginOverlap”,这个函数的作用是在进入触发器时,触发事件。
    在这里插入图片描述
    接下来开始设置关卡。
    新建对象mybreakingactor的引用,然后通过这个引用拉出一条线调用break函数。连接OnActorBeginOverlap和break函数(也就是触发OnActorBeginOverlap时调用break函数)。
    在break函数后连接UE4自带的函数“在位置处生成发射器”,添加粒子效果进去。
    选好Emitter Template,然后执行完了需要记得销毁粒子效果,当然可以把烟的效果留下来。完整的关卡蓝图流程图如下所示:
    在这里插入图片描述

三、游戏运行效果(截图)

使用插件apex destruction实现的效果:
在这里插入图片描述
在这里插入图片描述
代码+蓝图实现的效果:
以前视频的逐帧截图:(石头掉下来把鹿砸碎了):
在这里插入图片描述

四、实验心得

惯例,还是记一下在实验过程中遇到的问题。
因为用的是UE4,它有很厉害的破碎插件,(破碎这个功能在ue4里面好像就特别底层)所以我查找到的大部分教程基本上都是用插件就实现破碎。
虽然用插件apex destruction破碎很简单,但毕竟我啥也不会,不试一下连插件也不会,就先试着用插件实现了一下破碎。

用插件做了一遍以后,接下来就是自己试着做一个破碎的效果了。

我检索了很久都找不到ue4怎么用代码访问StaticMesh顶点数据,我不熟悉StaticMesh类的数据结构,去找官方文档,ue4官方文档又写得太简短,对我这种小白实在太不友好。
就这样做了好几天的无用功后,我偶然间在ue4论坛找到了一篇文章,才终于找到了访问StaticMesh顶点数据的方法。(还是论坛靠谱,大佬也多)

最后吐槽一下,UE4编译是真的慢,慢的我一怒之下都想买个内存条了。如果有人退坑

UE4里的奇奇怪怪的报错:

1号选手:就突然不认识最基本的类了,我查了半天发现原来根本就不用理它,报这种错应该就是编译器抽了,可以编译成功的。
在这里插入图片描述
2号选手:
在这里插入图片描述
找到BuildConfiguration.xml文件,并且在里面修改关掉vs的Increment那个插件:在这里插入图片描述

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值