RPG游戏开发日志6:拾取列表的实现

本项目同步上传于github和coding上,国内读者可以通过在coding下载项目。
也欢迎你加入我的UE4学习交流QQ群:872537977。如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你想参与到这个项目的开发中来,唯一的要求是像我一样编写开发日志让更多的人看到并学习。
github地址:https://github.com/Liweimin0512/uRPG
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
上篇文章中我们讲了一个非常粗糙的技能实现方式,本打算这一期做一个更复杂版本。但相比于一个模块一个模块的开发方式,我更喜欢将整个游戏需要的模块都用最便捷最粗糙的方式实现,然后再通过迭代优化。这样做的好处是可以迅速的做出原型,然后暴露问题,寻思调整。姑且就称之为我的敏捷开发方式吧。
好的,闲话少说,这期我们实现道具的拾取列表。

需求分析

类似《绝地求生:刺激战场》的效果,当我们靠近可拾取物时候,会出现一个列表,如下图所示:
拾取列表效果图

点击道具图标就可以“拾取”道具。
需要梳理的一个概念就是掉落物和道具的关系,当怪物死亡的时候会产生一个或多个掉落物。这些掉落物是怎么产生的呢?当道具可以堆叠的时候,就会堆叠成一项道具,并且标出堆叠的数量。而单个道具则不需要。所以在列表中显示的时候也是同理。
按照流程来思考整个功能的实现方式,应该分为两步:

  • 当玩家进入或者离开拾取物的拾取范围的时候,更新玩家的拾取列表;
  • 点选列表中的某项,触发拾取逻辑,将拾取物从列表中删除,存放在背包中(背包就是另一个列表);

拾取物UI(PickupItem)

我们创建一个新的Weiget,取名叫“UMG_PickupItem”,注意设置成“Desired On Screen”

Desired On Screen
整个控件由三部分组成:图标、名称和数量
UMG_PickupItem
需要注意的是,它需要实现UserObjectListEntry这个接口
应用UserObjectListEntry
这个接口的函数GetListItemObject如下图所示:
GetListItemObject实现
返回一个Model_ItemData文件,这个文件我们在之后说明。此外,就是实现OnListItemObjectSet这个接口事件,这个事件简单说就是把接受的Item数据展示在各种UI控件上,我是这么写的
接口事件OnListItemObjectSet的实现
首先把接收到的数据cast成Model_ItemData,之后把数据分别绑定给图标、名称和数量。啊,就这么简单。

拾取物列表(PickupList)

我们再创建一个Weiget,命名为“UMG_PickupList”,同理设置成“Desired On Screen”。它其实只包含一个“ListView”控件(之后可能添加“全部拾取”的按钮控件)
UMG_PickupList

关于ListView控件,需要特别说明的就是
ListView设置
这里,只有实现了UserObjectListEntry接口的Weiget才能设置在EntryWidgetClass中。这就回答了上文的一个疑问。

Model_ItemData

关于Model_ItemData,首先是这个命名不咋地我之后很可能换掉。这个类继承自Object而不是Actor(敲黑板啊,这里崩溃了很多次)。里面只是存放了一个结构体S_PickupItem。是一个货真价实的数据类。

Model_ItemData
s_PikcupItem结构体其实就是s_ItemData结构体的扩展,保存了ItemID和Amount(数量),方便使用。
s_PikcupItem
因为我们上文中说过,掉落物不但指定Item而且有堆叠数量的概念。所以通过ItemID和Amount进行一些堆叠操作是很必要的。

drop逻辑重构

首先是击杀NPC获得产生掉落,这里我们将产生掉落单独作为一个函数。这个函数在之后很可能成为一个掉落组件(现在太懒了,就先不弄了。)同时我们也对drop逻辑做了一次简单的重构,主要是加入了数量随机的设定(依然是因为太懒,先写死为1~20之间随机)
drop逻辑

就是根据Item能否堆叠来判断数量,如果能堆叠就产生数量随机,否则数量就是1个。(在我写这篇日志的时候突然意识到这样也不太对,数量随机与否应该是看配置数据怎么定义的,能否堆叠只是决定如何显示,之后再改吧)

掉落物

上一期我们忘记介绍掉落物,新建一个Actor命名为Bp_master_PickupBase,它由三部分组成,StaticMesh、特效和一个球形碰撞体(拾取范围),同时,它保存着一个s_PickupItem的结构体数据。

Bp_master_PickupBase
然后它的逻辑部分也比较简单,就是当有角色进出拾取范围时候,更新一下ListView
逻辑实现
Bp_CharacterBase中实现的updateListView只是调用主界面UI上的同名方法
updateListView
这里之所以没有在掉落物蓝图中直接调用主界面的逻辑,是想将可拾取物和主界面解耦,此外,可以在角色蓝图中做一些额外的处理。

UpdateListView

UMG_PickupList中写了真正的处理逻辑,这里比较重要的两个节点是ListView提供的清理和添加界面,逻辑简单讲就是先清理ListView,然后遍历列表中的数据添加到ListView中。

updateListView

效果展示

之前一直都是在之后加入“运行,测试,完美”的句式感觉太不走心了,之后的开发日志中我尝试截取GIT图片分享给大家。


效果展示

这里我们尝试击杀两个机器人然后看一下掉落效果。文件太大所以删除了开头和结尾并且删除了不少帧。将就看吧。

多测试几次,成功发现问题,就是开篇时图片所展示的。
重复道具
重复道具没有堆叠成一块,这个我们在之后再调整吧,今天懒癌发作,先逃了。
下一期我们实现道具的拾取保存。

你可能感兴趣的:(RPG游戏开发日志6:拾取列表的实现)