手部控制

手部模型

导入模型

先创建一个../assets文件夹,导入手部模型

image-20220902212141569

再创建一个Animations文件夹,导入动画

image-20220902212209816

注意这里的导入选项

image-20220902212350803

添加材质

创建一个材质M_QK_Hand,导入的三个贴图放到材质里,并按照如下排布

image-20220902212522098

image-20220902212532650

把这个材质应用到手上

image-20220902212615864

更换模型

添加两个操作映射

image-20220913231241051

接下来开始调试手部模型,打开VRPawn

image-20220914222945834

选中MotionControllerLeft和Right,添加骨骼网格体组件,并对其命名

image-20220914223110485

image-20220914223055453

分别对左右网格体进行如下设置

image-20220914223207642

image-20220914223224065

关闭HMD的可视

image-20220914223255454

禁止MotionControllerLeft和Right显示设备模型

image-20220914223314511

然后编译保存,你将会发现你的控制器变成了手部模型,效果如下

image-20220914223507426

手部动画

接下来开始创建动画,创建动画蓝图,并命名为BP_HandAnim

image-20220914223917119

创建一个枚举,命名为Enum_HandAnim

image-20220915223839389

image-20220915224043617

再创建一个枚举,命名为Enum_ObjectType

image-20220915224223880

双击进入BP_HandAnim,创建两个变量,注意命名和变量类型

image-20220915224537647

配置状态和状态转换规则

image-20220915225640993

依次双击每个状态机,配置相应资产,以下以Open为例

image-20220915225828753

配置每个状态之间的过渡规则,这里以Open到Grip的状态过渡规则为例,双击那个双箭头的小图标,然后添加如下规则

image-20220915225737449

image-20221026232938410

接下来双击VRPawn,设置左右手的动画类

image-20220915230106362

给VRPawn设置一些蓝图(注意变量提升之后要重命名和更改类别为HandAnimations,是类别不是变量类型)

image-20220915230925562

创建下面6个布尔变量

image-20220915231209637

添加如下蓝图

image-20220915231622319

image-20220915231806224

image-20220915231945419

最后打开BP_HandAnim,我们来写一些状态转换的蓝图控制代码

先转换类型,创建序列

image-20220915234844748

下面是控制动画的蓝图,看起来复杂,但实际还挺容易理解的,注意状态转换的细节和左右手,别弄错了

image-20220915235125803

然后编译保存运行,你就发现你的手已经有了动画,并且能够抓取物体了

使用武器

导入模型

创建文件夹并导入武器文件,导入砍刀

image-20220917094640122

image-20220917094822849

image-20220917094957437

导入手枪

image-20220917095117272

导入之后你会看到这些文件,按照不同的颜色设置贴图,这里以蓝色为例

image-20220917095420812

在设置好上面这些纹理贴图之后,你的枪应该看起来很正常

image-20220917095803414

添加碰撞

开始给枪设置碰撞体

image-20220917100135384

image-20220917100149962

然后给每一个部件设置碰撞体,这里以手柄为例(每次都是右键Root_Bone创建)

image-20220917100300465

移动位置成这样

image-20220917100407635

然后开始给左边的每一个部件设置碰撞体,最终得到这样的效果

image-20220917101201971

新增GrabType枚举

image-20220917101443650

设置插槽

打开手部骨骼模型,为拿枪的动作添加一个插槽

image-20220917101716773

image-20220917102024065

把枪放进来

image-20220917102050421

把枪移动到合适的位置

image-20220917102434347

然后把这个资产移除掉

image-20220917102529059

然后再创建一个近战插槽,选择握刀的动画,再把刀放进来

image-20220917102737108

调整姿势如下

image-20220917103012828

然后把资产移除,并把动画换成默认

image-20220917103106881

使用插槽

打开GrabComponent,编写如下蓝图

image-20220917103844547

注意,上面的每一次SET都是一次变量提升,记得修改它的变量名,跟上图保持一致。这些蓝图的意义是让我们在每一次Grab的时候能够调用对这些变量的引用

然后创建一个宏,方便获取插槽的位置和旋转,注意命名要保持一致

image-20220917105459673

接下来编辑TryGrab函数,将红色框的蓝图复制两份到蓝色框的位置,并分别连接Pistol和Melee

image-20220917105635747

编写如下蓝图,它对应Pistol这一块(注意SocketName,一定要和前面的插槽名字保持一致。观察蓝图,其实很多地方都是一样的,多用复制粘贴)

image-20220917105756358

编写如下蓝图,它对应Melee这一块

image-20220917105827537

然后编辑TryRelease函数

image-20220917110003376

image-20220917110417952

创建砍刀资产

image-20220917110530044

image-20220917110718790

image-20220917110730356

把这把刀放进场景里

image-20220917110928401

创建枪

image-20220917111046376

image-20220917111450071

image-20220917111512486

image-20220917111543348

把枪放进场景里

image-20220917111714937

接下来你就可以运行测试了,你会发现你能够抓住这两个武器,并且有相应的物理碰撞和子弹发射

插入动画

还没完,我们还需要创建一个混合空间

image-20220917112626380

image-20220917112710490

命名为BS_Object_Anim,然后打开它

image-20220917113238166

打开BP_HandAnim,进入Object状态,删掉原来的ANIM_OK_Grip序列播放器,编写如下蓝图

image-20220917113603370

接着你可以再次运行查看效果,不出意外应该是一切正常(出意外了就好好检查一下过程吧,代码是不会骗人的,害)

image-20220917113951552

手部物理效果

配置样条

首先打开VRPawn,把设备和右手的可视关掉

image-20220919213934935

在左手上新建一个样条组件,并命名为L_ThumbArc

image-20220919224632201

在这根样条线上右键,添加一个样条点

image-20220920223419083

给三个样条点配置属性(注意关键帧)

image-20220920223500804

image-20220920223508240

image-20220920223518988

然后复制粘贴这个样条组件,命名为L_MiddleArc,在L_MiddleArc上再加一个样条点,一共四个点,属性分别如下

image-20220920223629276

image-20220920223634517

image-20220920223640436

image-20220920223647549

然后继续复制粘贴L_MiddleArc,命名为L_IndexArc,四个样条组件的属性如下

image-20220920223729004

image-20220920223734237

image-20220920223739301

image-20220920223745302

继续复制粘贴L_RingArc,命名为L_RingArc,四个样条组件的属性如下

image-20220920223803357

image-20220920223808879

image-20220920223814068

image-20220920223819238

继续复制粘贴L_PinkyArc,命名为L_PinkyArc,四个样条组件的属性如下

image-20220920223839253

image-20220920223843956

image-20220920223848877

image-20220920223853492

然后把这五个样条组件拖到LeftHand下面

image-20220920223918764

再分别配置他们的位置旋转和缩放

image-20220920223940637

image-20220920223950652

image-20220920224000582

image-20220920224008581

image-20220920224016372

搞完之后是这么个效果

image-20220920224038669

然后把样条复制到右手这边来,并改名

image-20221007120748552

如果发现样条都乱了,就再把对应的位置旋转和缩放也复制过来

最后大概是这么个样子

image-20221007121052192

配置抓取组件

接着创建两个变量

image-20221007152617001

image-20221007152859846

当用户拿起东西时,就设置对应的原始组件

image-20221007153941168

image-20221007153955114

放下时就设为空

image-20221007154355555

追踪手指位置

创建一个结构,命名为Finger_Data

image-20221007154427963

image-20221007154541234

在VRPawn中添加如下变量,注意类别

其中FingerSteps的默认值为4

image-20221007160454329

创建一个函数GetFingerSteps

在函数GetFingerSteps中创建两个局部变量

image-20221007161613294

蓝图如下

image-20221007161637914

检测手指碰撞

创建函数Trace Finger Segement

创建局部变量

image-20221007163646233

蓝图如下(有点长,分两段截取)

image-20221007163727421

image-20221007163747195

整合所有手指

在VRPawn中创建一个新的图表,FingerAnimationGraph

image-20221007171956880

创建自定义事件R_TraceFingerData 和 L_TraceFingerData

image-20221007172051456

image-20221007172110156

创建自定义事件Setup Finger Anim Data(截图不全,但都是重复性代码,可自行补全

image-20221007172224642

追踪数据变化

在VRPawn运行之初调用

image-20221007172333574

在GrabComponent的Try Grab中调用

image-20221007172301884

image-20221007173407325

image-20221007173448987

调用动画

修改BP_HandAnim

image-20221007174638939

image-20221007191832549