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_DroneSocket Manager中创建。这里创建了两个Socket,分别是SM_Drone的两侧枪口:

要想访问这些Socket,需要使用Get Socket XXXX节点,例如Get Socket Location

在下一篇文章中,我们将通过UE5提供的建模模式创建机器人发射的子弹静态网格体,并通过创建蓝图类的方式让机器人把它发射出去。

参考资料

  • Course: Unreal Engine 5 Blueprints - The Ultimate Developer Course | Udemy