虚幻背包系统制作教程-01

9,592 阅读3分钟

年前项目被裁了,我也顺利的失业了,想着这段时间也不好找工作,就打算写一个demo练手,年后求职用。大致想法是战斗类似自走棋自动战斗,玩法类似LoopHero的RogueLike游戏,因此就需要一个背包和装备系统,那么干脆把我的想法和实现写出来,希望可以帮助到有需要的人。

首先我的思路来源于虚幻商城的插件Arc Inventory以及官方的Lyra示例,链接放在下方,有需要的可以自己去看,推荐lyra,受益良多。话不多说,下面正式开始

Lyra示例游戏​docs.unrealengine.com/5.0/zh-CN/lyra-sample-game-in-unreal-engine/

www.unrealengine.com/marketplace…

整体思路

首先既然是背包系统,那么我们一定需要一个InventoryComponent作为物品的仓库,仓库中会有一个个格子ItemSlot去存放物体

然后考虑放入Slot的物品Item。一个物品应该有两部分组成,一部分游戏内是不变的,比如物品名,价值,图标,设定好的攻击力,防御力等等;另一部分是动态的,在游戏中产生的,比如持有item的人,动态的属性等等。因此我们需要将item分为两个部分,一部分是ItemDefinition,一部分是ItemInstance。

ItemInstance可以理解为某种物品的实例,他们的关系有点类似于Class和object的关系,仓库中存放的永远是ItemInstance,definition决定Instance的属性。

接下来是物品的属性,这里我吸取了Lyra的代码,就不使用派生来创建多个种类的物品了,物品的属性使用类似于Actor-Component的关系,通过定义抽象的基类fragment来决定物品的属性。Item上带有fragment的数组。

比如武器就具有Fragment_Equipment,如果希望物品具有图标,那么就创建一个Frangment_Icon去给予属性。

如下图就通过两个fragments决定了一个护甲的属性。

整体的思路如上

代码

先创建对应的类

背包仓库基类InventoryComponent

物品定义InventoryItemDefinition

物品实例InventoryItemInstance

物品属性InventoryItemFragment

最后创建一个空文件用来存放一些物品系统的数据结构InventoryItemTypes,都创建完成后如下

InventoryItemFragment

物品属性代码,本身没什么,主要的功能通过派生类去实现

InventoryItemDefinition

物品定义,因为物品的属性不会发生改变,所以基类为DataAsset。

项目使用了GAS系统,那么正好就用GameplayTags去说明物品的类别和属性,比如武器带有Equipment和weapon标签。

物品的属性就由Fragment数组去进行配置。函数FindFragment可以根据输入的Fragment类找到对应的属性

函数实现

InventoryItemInstance

物品实例。实例中存着物品定义的引用,和动态的fragment,好让物品的一部分属性可以在实例中修改,比如耐久度等等。

根据fragment类获取对应的属性

设置instance的物品定义

实例同样也需要GameplayTags去判断类别和属性

InventoryComponent相对比较复杂,就放到下一期来写了