美文网首页UE4制作沙盒RPG
RPG游戏开发日志6:拾取列表的实现

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

作者: 李维民0512 | 来源:发表于2019-05-10 22:52 被阅读0次

    本项目同步上传于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:拾取列表的实现

        本文链接:https://www.haomeiwen.com/subject/fmwwnqtx.html