野外生存游戏【2. 快捷栏与物体拿放】

UE版本:5.2.1

本章实现效果预览

image-20230902161512279

总体设计

由于此游戏是设计为多人游戏,所以在某些方面的实现会比较繁琐,建议读者先通读掌握思路之后,再根据自己需求调整

本章是基于上一节的工程文件开发而来,保留了之前的目录结构,新增了快捷栏与物品相关逻辑,目前结构如下

image-20230902162212749

UI与动画

新增了一个 W_Hotbar

image-20230902162346174

将它加入到 W_MainWidget 中

image-20230902162449716

导入一个斧头模型

image-20230902162633541

配置插槽

image-20230902164050569

分别创建第一人称的动画蓝图与混合空间、第三人称的动画蓝图与混合空间、第一人称拿斧头和第三人称拿斧头的混合空间

这里之所以区分第一人称和第三人称,就是因为这个多人游戏,第一人称是给自己看的,第三人称是给别人看的

image-20230902162858982

混合空间内部就是一些静止与跑步动画的混合,这里以第一人称拿斧头为例展示,比较简单,其他的都类似

image-20230902163115970

第一人称的动画蓝图内容如下,目前为止比较简洁,核心就是根据不同的状态输出不同的混合空间

第三人称也是一样的,只不过输出的混合空间是第三人称的而已

image-20230902163243872

在事件图表中编写如下逻辑,根据速度和当前装备的状态来实时更新动画

image-20230902163547750

其中 E_EquipableState 的枚举如下,目前只用到了 default 和 hatchet

image-20230902163329986

然后打开 BP_FirstPersonCharacter,配置骨骼体和动画蓝图,第一人称的骨骼体也是类似

image-20230902164203033

但是要注意,这里的第三人称骨骼体是配置给其他玩家看的,我们自己的视角要隐藏起来,所以要勾选 owner no see

image-20230902164332573

新增物体

接下来编写逻辑,要求按下R键就新增一把斧头到快捷栏

首先打开 Items 文件夹,新增 BP_EquipableMaster 继承自 BP_ItemMaster

image-20230902164600390

然后在 Equipables 文件夹里新建如下两个蓝图,都继承自 BP_EquipableMaster

image-20230902164816732

接着在 Tools 文件夹下新增这两个蓝图,分别继承自 BP_FirstPersonEquipable 和 BP_ThirdPersonEquipable

但是要注意,第三人称的斧头(BP_TP_Hachet)的网格体,要勾选 Owner no see,因为是给其他玩家看的,自己的视角不用看,不然会错乱

image-20230902164935380

最后在 Hatchet 文件夹下新增这两个蓝图,也是分别继承自上级目录的第一人称和第三人称的斧头(这里之所以还要再分一层,是因为后面还可以扩展为铁斧头等其他类型的斧头)

image-20230902165130990

这些蓝图里面目前没有任何逻辑,只有一个斧头形状的静态网格体,并且关掉碰撞

image-20230902165527020

好了,斧头的蓝图创建好了,接下来编写相关逻辑

首先创建一个 BPC_PlayerHotbar 继承自 BPC_ItemsContainer

image-20230902165804934

然后打开 BP_FirstPersonCharacter ,补充新增物品到快捷栏的逻辑

image-20230902171849200

修改 BPC_ItemsContainer 里的UpdateUI逻辑

image-20230902172011109

修改Update Item Slot 函数

image-20230902172045582

image-20230902172105297

物体拿放

回到BP_FirstPersonCharacter ,并设置相关按键操作

image-20230902172206613

Use Hotbar Function 函数的具体逻辑如下

首先根据 index 找到快捷栏里面的物品信息,看这个物品是否有效。如果有效的话,就检查手上拿没拿东西,如果没拿就拿上,如果拿了就放下

image-20230902172241886

image-20230902172508311

其中 BPC_PlayerHotbar 的 Check Hotbar 逻辑如下

image-20230902172546240

SpawnEquipableThirdPerson 等事件的逻辑如下(注意 Replicates)

这里的核心思路是以第三人称为主,先绑定第三人称的斧头组件之后,再绑定第一人称

同时还要控制好运行位置(广播、server、client)与组件的owner,避免错乱

image-20230902172728266

image-20230902172745349

image-20230902172833569

物资交换

注:这部分的逻辑在工程文件的 SurvivalCraft_03 中实现

实现一个小功能,允许物体从快捷栏拖到库存,从库存拖到快捷栏

注意下面的 Select 是 ContainerType,不是下面的子类

image-20230903215458802

HotBar的相关接口也需要实现,但基本和 Inventory 的一致

image-20230903215619489

image-20230903215641044

在 Remove 的过程中,如果角色手上拿着东西,也需要移除

image-20230903215719569

image-20230903215931559