双手持枪

视频教程已同步发布至B站:https://www.bilibili.com/video/BV1Jc411n7oZ

初始配置

UE版本:5.1

解压模型压缩包,拖到Content文件夹里

先创建一个BP_Gun的蓝图,然后把模型放进去,补充上弹夹,把手等组件。然后放上主控制器和次控制器,用于后面的逻辑计算

image-20230408124522714

直接将这个Actor放在默认的场景地图即可

image-20230408124611721

创建手部插槽

打开手部网格体,右键,添加插槽,命名为gun_main_socket

image-20230413213743449

选择使用特定动画,选中Grasp动画,将手和枪的位置调成这样即可

image-20230413213914476

创建Grab接口

接着创建一个接口,实现抓取和释放功能

image-20230408130751618

将接口挂载到BP_Gun上

image-20230408130925935

实现Grab

注意插槽的名称不要写错

这一段的主要逻辑如下

  1. 检测手是否在主抓握点内
  2. 在的话就将这把枪附加到手上
  3. 找到手部网格体里配置的插槽,获取对应的旋转和位置,然后应用到抢上
  4. 应用对应的抓枪动画

image-20230408133428645

image-20230408133440275

最后在Pawn里面调用这个Grab函数即可

核心逻辑是按下grab键的时候,检测手边是否有枪,枪是否实现了Grab接口,如果都满足,就直接调用Grab函数

image-20230408134023854

到此为止,你就可以测试一下了,如果一切顺利,就可以用右手抓起这把枪了

image-20230408134421204

实现Release

这一段逻辑比较简单,我们继续打开BP_Gun蓝图,来实现Release事件

核心逻辑是将主次控制器都设空,然后让枪和手脱离,并且让手恢复到正常的动作

image-20230409182020252

接下来去Pawn里面调用这个Release事件即可

image-20230409182144638

双手持枪

抓握插槽

我们先打开步枪的网格体,配置一个抓握的插槽,命名为GripSocket

它用于指示副控制器的抓握位置(就是你的左手应该抓在这个地方)

image-20230413220831987

副手抓握

新增副手抓握逻辑

这段逻辑会在主控制器不为空(右手已经抓到抢)的时候,将另一个手设置为副控制器,然后播放动画,切换状态

image-20230413213141917

核心逻辑

核心计算逻辑我们放在Tick函数中完成

在开始之前,我们需要了解一下,一个物体的姿态主要是由以下三个变量的控制的

pitch(俯仰)

yaw(航向)

roll(横滚)

我们拿到主副控制器的引用之后,就可以通过分析他们之间的位置和姿态,来计算出枪的状态

详细步骤如下:

  1. 检查此时是否是双手持枪状态,确认主副控制器有效
  2. 在第一帧算出主副控制器之间的相对旋转,将这个旋转体的pitch和yaw存起来,我们叫初始旋转姿态
  3. 存储第一帧时,主控制器的pitch和yaw,初始主姿态
  4. 在后面的每一帧都计算主副控制器旋转体的pitch和yaw,然后减去初始旋转姿态,再加上初始主姿态,就得到了步枪的实时姿态**(实时姿态 = 初始主姿态 + 旋转姿态的差值)**
  5. 将这个实时姿态应用到主控制器和副控制器上
  6. 获取步枪上抓取插槽的位置,然后应用到副控制器上

具体蓝图代码如下:

image-20230413221049656

image-20230413221105588

接着补充一下释放逻辑

image-20230414225038270

最后在VRPawn中应用一下左手就好啦

image-20230413222505158