RPG游戏开发日志7:道具拾取与存放
本项目同步上传于github和coding上,国内读者可以通过在coding下载项目。
也欢迎你加入我的UE4学习交流QQ群:872537977。如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你想参与到这个项目的开发中来,唯一的要求是像我一样编写开发日志让更多的人看到并学习。
github地址:https://github.com/Liweimin0512/uRPG
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
这一期我们实现道具的拾取和存放
需求分析
上一期中我们设计了一个掉落物的列表。这一期我们继续处理当列表中的道具被点击后,将道具保存到玩家的背包中的操作。
我们首先制作一个极简的背包,它不需要通过主界面的图标跳转到专属的界面。而只是在主界面下方的一排“快捷栏”。因为其实现的原理是一致的。希望小伙伴们能举一反三吧。
首先,我们依然要客串策划的工作。策划同学突然灵光一闪,觉得道具和掉落物应该是一一对应的,而掉落物的参数是可配置的。
DropData与Item的对应关系
通过思考,我们对这部分代码进行了重构。首先是我们创建了一个DropData的结构体如下图所示,默认值就设置成之间的掉落物本来该有的值:![](https://img.haomeiwen.com/i14046630/092cb5129991178b.png)
这里设置比较简单,掉落物的模型、特效及拾取半径都是可以配置的。
![](https://img.haomeiwen.com/i14046630/0e0327ea92f8322d.png)
构建Bp_master_DropBase
我们在Bp_master_DropBase中,首先将相关变量都勾选成“可编辑实例”和“在生成时显示”。并且编写蓝图的构建脚本如下图所示:![](https://img.haomeiwen.com/i14046630/adde2b9450f6272d.png)
构建脚本,顾名思义就是在蓝图构建时调用的(大概),总之是比BeginPlay事件要早。
![](https://img.haomeiwen.com/i14046630/ff22ca7bfc5234c0.png)
![](https://img.haomeiwen.com/i14046630/eb8ec936264ede6b.png)
Drop函数的重构
再次改写Drop函数,其实是因为Bp_master_DropBase这个蓝图本身做了调整,它除开存放本身外显的一些参数外,还存放了一个s_ItemState的结构体变量:![](https://img.haomeiwen.com/i14046630/ee977087bc1e17fd.png)
![](https://img.haomeiwen.com/i14046630/02076220fddefa19.png)
UMG_PickupList的处理
UMG_PickupList主要是UpdateListView这个函数的实现,这也是目前比较关键的一步。首先,我们根据Add?判断是添加还是移除元素从ItemStatList这个集合中,同时对PickupListView进行一次清理操作![](https://img.haomeiwen.com/i14046630/bc73d67bb8c2bcb3.png)
![](https://img.haomeiwen.com/i14046630/bceafc593b1de296.png)
UMG_ItemInventory
上文的内容,都是对过往代码的重构,从这里开始,才进入本篇文章的主题。首先,我们创建一个主界面控件——快捷栏控件。它长这样:![](https://img.haomeiwen.com/i14046630/49f5202ad32e2763.png)
![](https://img.haomeiwen.com/i14046630/82978448a8c8d7ca.png)
![](https://img.haomeiwen.com/i14046630/6d9fc9ba13a0d4eb.png)
![](https://img.haomeiwen.com/i14046630/bcf47ab438d05dbf.png)
它由背景图片,道具图片和道具数量三部分组成,并且默认情况下(没有道具时)道具图标、道具数量都是隐藏的,只显示背景图片。(ps:写到这里突然感觉实现方式有问题,懒得改了,下期再说)
OnItemClicked事件
ListView很重要的一个事件,就是当列表中的某一项被点击时候调用的OnItemClicked事件。我们这里要用这个事件,当点击时,将掉落物添加到背包中并从拾取物列表中移除。![](https://img.haomeiwen.com/i14046630/5bc113683a34a264.png)
这里我们并没有直接处理,而是将操作权交给了Controller。不过,还是将干掉掉落物的操作直接在这里实现了。(似乎也是不合理的部分,之后优化吧。)
![](https://img.haomeiwen.com/i14046630/344e21edf4118cbb.png)
而UpdateItemInventory顾名思义,就是更新一下背包。这个函数可以再每次打开背包的时候调用,这里因为是直接显示在快捷栏中,因此当捡起道具时候就应该直接显式调用一次。
![](https://img.haomeiwen.com/i14046630/c0f8775f66bbff9b.png)
至此,将道具存放到背包中的功能就算是完成了。
下期预告
在之后的一段时间,我想研究一下任务系统的实现。至于道具系统更深入的开发,就留给任务系统之后来做。
或者说是制作一个简易的任务系统,然后补充这些基础系统的文档后。再重构更为精巧的技能、任务和道具系统。