实验2.UE4实现破碎效果
老师特别不推荐直接使用插件去完成实验,所以写了很多,很啰嗦。
一、实验要求
目的: 熟悉Mesh的概念,能自由利用Mesh数据。
要求: 编写一个脚本,实现对mesh的破碎效果。
Dalao作品示例↓:(不是我的!!不是我的—)
二、软件核心代码(算法+代码文本)
我先是使用apex destruction插件试了一下做出破碎效果,然后自己手动又用代码做了一下破碎效果。下面是实验过程记录,因为不算对ue4界面很熟,所以可能写的很详细。
- 使用插件制作破碎效果: 在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的文件,比较智能。
- 使用UE4代码和蓝图制作破碎效果:
Ue4的点开模型的界面可以显示出这个模型的mesh顶点,但想要自己用代码访问获取它的顶点数据还是得费点功夫的,在ue4官方论坛上有大神写了获取mesh顶点数据的教程。
找了很久的教程,获取mesh网格顶点数据的核心代码:(UE4的教程真的太少啦,这个还是科学上网到论坛上找到的)
在UE4里Tick( )函数是每帧都会被调用的函数。
接下来就要在Tick( )函数里把获取到的mesh顶点都画出来。
运行一下,顶点找到的效果如下。红色的就是找到的顶点位置。
在找到顶点以后。开始下一步操作。新建一个蓝图类fragment,给他设置添加上基本的static mesh 和material。并且在physics一栏勾选模拟物理。
换了一个形状,现在更像破碎后的碎片了。
下面让它怎么碎我就找不到代码教程了,班里面一个做游戏的大佬教我用蓝图实现了,菜鸡落泪。
下面打开MyBreakingActor类的蓝图编辑器,开始用蓝图写出MyBreakingActor类的break函数。它的执行过程是这样的:
- 调用MeshData方法获取mesh顶点。
- 显示循环遍历获取的每一个顶点,在顶点位置处生成fragment。
- 循环执行完以后,销毁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那个插件: