本项目同步上传于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”
UserObjectListEntry
这个接口GetListItemObject
如下图所示:Model_ItemData
文件,这个文件我们在之后说明。此外,就是实现OnListItemObjectSet
这个接口事件,这个事件简单说就是把接受的Item数据展示在各种UI控件上,我是这么写的拾取物列表(PickupList)
我们再创建一个Weiget,命名为“UMG_PickupList”,同理设置成“Desired On Screen”。它其实只包含一个“ListView”控件(之后可能添加“全部拾取”的按钮控件)Model_ItemData
关于Model_ItemData,首先是这个命名不咋地我之后很可能换掉。这个类继承自Object而不是Actor(敲黑板啊,这里崩溃了很多次)。里面只是存放了一个结构体S_PickupItem。是一个货真价实的数据类。
s_PikcupItem
结构体其实就是s_ItemData
结构体的扩展,保存了ItemID和Amount(数量),方便使用。drop逻辑重构
首先是击杀NPC获得产生掉落,这里我们将产生掉落单独作为一个函数。这个函数在之后很可能成为一个掉落组件(现在太懒了,就先不弄了。)同时我们也对drop逻辑做了一次简单的重构,主要是加入了数量随机的设定(依然是因为太懒,先写死为1~20之间随机)就是根据Item能否堆叠来判断数量,如果能堆叠就产生数量随机,否则数量就是1个。(在我写这篇日志的时候突然意识到这样也不太对,数量随机与否应该是看配置数据怎么定义的,能否堆叠只是决定如何显示,之后再改吧)
掉落物
上一期我们忘记介绍掉落物,新建一个Actor命名为Bp_master_PickupBase
,它由三部分组成,StaticMesh、特效和一个球形碰撞体(拾取范围),同时,它保存着一个s_PickupItem的结构体数据。
Bp_CharacterBase
中实现的updateListView
只是调用主界面UI上的同名方法UpdateListView
在UMG_PickupList
中写了真正的处理逻辑,这里比较重要的两个节点是ListView提供的清理和添加界面,逻辑简单讲就是先清理ListView,然后遍历列表中的数据添加到ListView中。
效果展示
之前一直都是在之后加入“运行,测试,完美”的句式感觉太不走心了,之后的开发日志中我尝试截取GIT图片分享给大家。
这里我们尝试击杀两个机器人然后看一下掉落效果。文件太大所以删除了开头和结尾并且删除了不少帧。将就看吧。
下一期我们实现道具的拾取保存。