02 - 编写BP_Bot蓝图类
接下来想做几个蓝图项目练练手,并将其以系列文章的形式记录到我的博客上,这里继续第一个蓝图项目Bad Bot
。
本篇文章将简要描述蓝图类BP_Bot
的逻辑实现,包括如下内容:
- 让
BP_Bot
找到玩家Pawn
实例,并设置为TargetPawn
; - 让
BP_Bot
一直朝向TargetPawn
,并通过使用插值让朝向过程更加流畅; - 让
BP_Bot
朝向玩家发射投射物子弹的前置准备;
找到玩家实例
找到玩家实例的蓝图逻辑如下:
在BP_Bot
实例化后,游戏开始时的BeginPlay
事件中,该实例尝试获取玩家Pawn
数组并获取第一个元素(因为目前只有一个玩家),如果成功获取,就将其设置为TargetPawn
。
蓝图使用小技巧:
- 要想为蓝图添加注释,需要框选被注释的节点,然后按C即可;
- 要想让蓝图变得更美观,除了调整对齐方式外,还能放置
Reroute Node
(就是Branch
节点下的蓝色节点)让走线更美观,它的快捷键是R;
朝向玩家实例
简单实现
接下来实现让BP_Bot
无时不刻朝向TargetPawn
的功能,简单实现如下:
在每帧更新的Tick
事件中,通过获取BP_Bot
实例自身和TargetPawn
的位置,用Find Look at Rotation
节点加工为让机器人转向目标玩家的Rotator
,并应用到机器人实例上。
使用插值让转向过程更流畅
为了体现出转向过程,要先在BeginPlay
事件中使用Delay
节点让“找到玩家实例”这一操作延迟2s。但这样做了之后,在前2s中TargetPawn
是空的,因此在执行转向操作前还要对它进行判空。有两种判空逻辑:
使用
Is Valid
宏:选中
Get TargetPawn
节点,右键将其转换为Validated Get
:
可以发现在2s后机器人一下子就旋转好了,比较突兀。此时我们可以通过插值的方式实现机器人从原位置旋转到新位置的流畅过渡。UE5提供对Vector
插值的VInterp To
节点和对Rotator
插值的RInterp To
节点,我们使用后者:
RInterp To
节点的入参解释如下:
Current
:当前的Rotator
;Target
:最终的Rotator
;Delta Time
:当前的Delta Time
,将根据此数据进行插值;Interp Speed
:插值的速度;
发射投射物子弹前置
利用Socket确认发射子弹位置
接下来我们要让BP_Bot
朝玩家发射子弹,首先要确认发射子弹的位置。UE5提供Sockets
让开发者访问网格体模型上的特定位置。
要想创建一个Socket
,需要到SM_Drone
的Socket Manager
中创建。这里创建了两个Socket
,分别是SM_Drone
的两侧枪口:
要想访问这些Socket
,需要使用Get Socket XXXX
节点,例如Get Socket Location
。
在下一篇文章中,我们将通过UE5提供的建模模式创建机器人发射的子弹静态网格体,并通过创建蓝图类的方式让机器人把它发射出去。
参考资料
- Course: Unreal Engine 5 Blueprints - The Ultimate Developer Course | Udemy