年前项目被裁了,我也顺利的失业了,想着这段时间也不好找工作,就打算写一个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相对比较复杂,就放到下一期来写了