双手持枪
双手持枪
鲸拓工作室视频教程已同步发布至B站:https://www.bilibili.com/video/BV1Jc411n7oZ
初始配置
UE版本:5.1
解压模型压缩包,拖到Content文件夹里
先创建一个BP_Gun的蓝图,然后把模型放进去,补充上弹夹,把手等组件。然后放上主控制器和次控制器,用于后面的逻辑计算
直接将这个Actor放在默认的场景地图即可
创建手部插槽
打开手部网格体,右键,添加插槽,命名为gun_main_socket
选择使用特定动画,选中Grasp动画,将手和枪的位置调成这样即可
创建Grab接口
接着创建一个接口,实现抓取和释放功能
将接口挂载到BP_Gun上
实现Grab
注意插槽的名称不要写错
这一段的主要逻辑如下
- 检测手是否在主抓握点内
- 在的话就将这把枪附加到手上
- 找到手部网格体里配置的插槽,获取对应的旋转和位置,然后应用到抢上
- 应用对应的抓枪动画
最后在Pawn里面调用这个Grab函数即可
核心逻辑是按下grab键的时候,检测手边是否有枪,枪是否实现了Grab接口,如果都满足,就直接调用Grab函数
到此为止,你就可以测试一下了,如果一切顺利,就可以用右手抓起这把枪了
实现Release
这一段逻辑比较简单,我们继续打开BP_Gun蓝图,来实现Release事件
核心逻辑是将主次控制器都设空,然后让枪和手脱离,并且让手恢复到正常的动作
接下来去Pawn里面调用这个Release事件即可
双手持枪
抓握插槽
我们先打开步枪的网格体,配置一个抓握的插槽,命名为GripSocket
它用于指示副控制器的抓握位置(就是你的左手应该抓在这个地方)
副手抓握
新增副手抓握逻辑
这段逻辑会在主控制器不为空(右手已经抓到抢)的时候,将另一个手设置为副控制器,然后播放动画,切换状态
核心逻辑
核心计算逻辑我们放在Tick函数中完成
在开始之前,我们需要了解一下,一个物体的姿态主要是由以下三个变量的控制的
pitch(俯仰)
yaw(航向)
roll(横滚)
我们拿到主副控制器的引用之后,就可以通过分析他们之间的位置和姿态,来计算出枪的状态
详细步骤如下:
- 检查此时是否是双手持枪状态,确认主副控制器有效
- 在第一帧算出主副控制器之间的相对旋转,将这个旋转体的pitch和yaw存起来,我们叫初始旋转姿态
- 存储第一帧时,主控制器的pitch和yaw,初始主姿态
- 在后面的每一帧都计算主副控制器旋转体的pitch和yaw,然后减去初始旋转姿态,再加上初始主姿态,就得到了步枪的实时姿态**(实时姿态 = 初始主姿态 + 旋转姿态的差值)**
- 将这个实时姿态应用到主控制器和副控制器上
- 获取步枪上抓取插槽的位置,然后应用到副控制器上
具体蓝图代码如下:
接着补充一下释放逻辑
最后在VRPawn中应用一下左手就好啦