这是一篇根据视频教程内容总结的UE5学习笔记,原视频内容见:UE5C++基础教程
使用蓝图制作WarehouseWreckage游戏
WarehouseWreckage游戏是一个利用UE5物理引擎破坏房间的游戏,游戏使用纯蓝图制作.
一切的开始,HELLO WORLD
同许多C++程序一样,第一个蓝图程序相当于HELLO WORLD
.
点击红色方框处,在展开的菜单中打开关卡蓝图
在关卡蓝图中,使用Event BeginPlay和Print String打印第一个HELLO WORLD
.
此时编译运行,会在游戏左上角打印HELLOWORD
.
初试物理引擎
在场景凳子上方加入一个Cube,并在细节面板打开Simulate Physics和Enable Gravity.关闭Cube下方凳子的Enable Gravity.此时运行程序,Cube将落向地面,击中凳子.凳子受到力的作用反弹并漂浮在空中.
引用Actor
在世界中选中Cube
打开关卡蓝图,点击鼠标右键,再点击Create a Reference to Cube即可获取这个Cube的引用并调用Cube相关的所有函数.
Add Impulse(添加冲量)
添加键盘输入Space Bar,获取Cube的Static Mesh Component的引用,并为其添加冲量.使用Add Impulse添加冲量.
bool类型Vel Change表示是否直接影响速度,将其设置为true会让Cube获得一个值速度的改变.设置为false则是让Cube获得一个冲量的改变.二者之间相差了一个质量因素.
冲量
=
力
×
时间
=
质量
×
变化的速度
冲量= 力 × 时间= 质量 × 变化的速度
冲量=力×时间=质量×变化的速度
在关卡蓝图中添加了上面的逻辑后,运行游戏,按下空格,Cube将会向上跳跃.
在World中添加Actor并将其创建为蓝图
添加一个Sphere在世界中,调整它到适当的Scale.选中这个Actor,在右侧Details面板中找到红色框选中的按钮,就可以将它创建为一个新的蓝图类.将其命名为BP_Projectile.
在蓝图类中启用模拟物理并设置小球的质量.
在关卡蓝图中Spawn Actor
打开关卡蓝图,使用SpawnActor函数创建BP_Projectile的实例,Class选择BP_Projectile,展开Spawn Transform设置Spawn Actor实例的出生点.最后为每一个新产生的对象设置一个冲量.
可见,小球被正确Spawn并成功设置初始冲量.
从Player Pawn的位置Spawn Actor
上一节,能够实现从固定位置Spawn一个小球,本节将从Player Pawn的位置生成小球.在关卡蓝图中,使用Get Player Pawn获取当前玩家,Player Index 0表示当前玩家0,并利用Get Actor Location获取Player Pawn的位置.将此位置设置为生成小球的位置.
至此,能够从玩家位置向X轴方向发射小球.接下来,希望实现让小球发射的角度也跟随玩家旋转的角度.根据规律,很容易想到利用Get Actor Rotation节点来.所以我们试一试.
然而,实际上这个操作并不正确,小球并没有按照预期跟随玩家朝向改变发射角度.按F8从Player Pawn弹出,可以观察,通过相机视角旋转并没有改变Player Pawn的Actor Rotation.这是由于虚幻引擎并没有设置Player Pawn的Actor Rotation跟随相机视角旋转.
获取相机的Rotation方式是使用Player Pawn的Get Control Rotation.
然而,经过如此操作之后依然不能实现产生小球的方向跟随相机方向.实际上不论是小球的出生位置还是小球的出生方向都已经设置正确了,然而却没有给小球的初始冲量设置正确的方向,小球的初始冲量始终是[400,0,0],所以无论控制器怎么转向,尽管初始位置和初始旋转均正确,但是小球始终朝着一个方向发射.
如果有什么方法能够获取到控制器朝向的向量就好了.
- Actor的Root Component的Get Forward Vector函数可以获取到这个向量.
- Actor的Get Actor Forward Vector函数可以获取到这个向量.
这个向量的方向是视口朝向的方向,向量的大小为单位向量.因此,想要给要发射的小球一个初始冲量,需要将这个向量放大.
至此,已经可以通过按下空格键并通过鼠标i控制控制器朝向来向不同的方向发射小球了!
导入资源
在虚幻商场中下载免费资源Factory Environment Collection.在库中搜索Industry Props Pack 6并添加到你的工程WarehouseWreckage中.添加后可以在Content Browser中看到这些导入的资源.
使用BSP
创建一个新的Map,选择Basic.
点击Quickly Add To The Project按钮(灰色六边形,右下角是一个小小的绿色加号).删掉场景中默认的地板.再次点击Quickly Add To The Project按钮并选择Place Actors Pannel.向场景中拖入一个Box,命名为Walls,并在细节面板的Brush Settings中设置其XYZ分别为3600,2900,7900.重置其位置到原点.再次拖入一个Box命名为WallsSubtract,设置其位置到原点,XYZ分别为3400,2700,760.在细节面板中的Brush Settings中,设置Brush Type为Subtractive,减掉一个Box.同理,创建适当大小的Box,同样设置为Subtractive作为窗户.
材质和照明
将喜欢的材质拖动到Box的表面即可为其添加材质.在Outliner中选中DirectionalLight,旋转它可以实现太阳光的角度变化.
为架子添加架子平板组件
将架子的平板放置在架子上.方法是将架子平板的静态网格体作为架子的child,并调整合适的位置.
将桶子放入场景并将其制作成蓝图类
像这样将几个桶子沿着Z方向放置并启用物理模拟,运行游戏发现桶子没法稳定的叠放在一块,而是很快的倒塌.造成问题的原因在于桶子的碰撞.将View Mode切换到Player Collision可以观察到,桶子的上表面碰撞凹凸不平,因此开启模拟物理后几个叠放在一起的桶子无法稳定放置.双击桶子的Static Mesh文件,先Remove Collision,然后再Add 100OP-Z Simplified Collision,这样桶子的上表面将具有平整的碰撞,因此可以稳定的叠放在一起.
在场景中,选中其中一个桶子,在Details面板中点击Edit The Blueprint For This Actor按钮.将这个Static Mesh保存为一个Actor蓝图类.
在场景中添加一些桶子并打击.
向桶子射击.
在蓝图中添加变量
打开关卡蓝图,打开My Blueprint面板添加整型变量AmmoNum.
创建函数
同C++一样,也应该给蓝图做好抽象,将固定的逻辑抽象封装成为一个函数.选中想要封装为函数的全部蓝图节点,右键并选择Collapse To Function.
封装之后的EventGraph,将原来的一堆节点封装成函数SpawnProjectile并调用.
同理继续将弹药减少的逻辑封装成函数.
最终蓝图如下:
创建自定义函数
在关卡蓝图的My Blueprint面板中,点击Functions右边的+号.创建函数HasAmmo.这个函数用于判断是否还有子弹剩余.
纯函数
HasAmmo函数从逻辑上并不需要白色执行引脚,应该将它设置为Pure函数.打开这个函数的蓝图,在Details面板选中Pure.现在执行流程变得更加合理了.
将关卡蓝图中的代码转移为类的成员函数
将关卡蓝图中给小球添加冲量的代码转移到BP_Projectile中作为成员函数,命名为Lauch.
延迟并重新加载关卡
当子弹用光后,应该重新加载关卡.使用Delay函数延迟若干秒,并用OpenLevel(By Name)开启新关卡.使用Get Current Level Name获取当前关卡的名字.
RestartLevel函数.
至此,由蓝图制作的游戏WarehouseWreckage完成了!
Obstacle Assault
项目所需资源设置
- Unreal Learning Kit:Games.(中文,虚幻学习工具包)
- Stylized Character Kit:Casual 01.