前言
在去实现复杂的背包系统的时候,我们先会做一个简单的背包系统,然后通过一系列的问题,慢慢的引导出复杂的背包系统。
那么什么是复杂的背包系统呢?笔者认为,一定需要遵循开闭原则(对修改关闭,对扩展开放),为了实现这种效果。我们的思维应该是依赖抽象,而不是依赖实现。
数据设计
一个简单的背包系统,要考虑背包中的格子需要存放哪些数据,取决于具体的项目是如何规划的。
所以我们思考的第一个问题就是:什么物品可以存放在背包中?
以一个农场经营内游戏来说:食物(苹果、鸡蛋等)、工具(稿子、斧头等)、种子(土豆种子、玉米种子等)都可以作为物品存放在背包中。
玩过我的世界的游戏来说:各种各样的方块,工具(斧头、稿子等)、床、食物等都可以作为物品存放在背包中。
所以我们需要提取他们的共同行为:唯一的标识id、物品名称、物品的描述、UI图标、掉落在世界的图标
下面是一个通用的数据结构
using Enums;
using UnityEngine;
namespace Inventory
{
[System.Serializable]
public class ItemModel
{
/// <summary>
/// 唯一标识物品的ID。
/// </summary>
public int itemID;
/// <summary>
/// 物品的名称。
/// </summary>
public string itemName;
/// <summary>
/// 物品的UI图标。
/// </summary>
public Sprite itemIcon;
/// <summary>
/// 物品在世界中的显示图标。
/// </summary>
public Sprite itemOnWorldSprite;
/// <summary>
/// 物品的描述。
/// </summary>
public string itemDescription;
}
}
有了数据之后,我们怎么去创建这些物品呢?可以使用excel表,也可以使用xml、json。我们这里使用ScriptableObject来创建背包中的数据
using System.Collections.Generic;
using Details;
using UnityEngine;
namespace Inventory.Data_SO
{
[CreateAssetMenu(fileName = "ItemDataList_SO", menuName = "Inventory/ItemDataList_SO")]
public class ItemDataListSo : ScriptableObject
{
public List<ItemDetails> items;
}
}
我们想象一下,有了物品的数据,是不是需要背包来存储这些物品,而箱子也可以存储这些物品,只要是容器,都可以存储这些物品。
我们先做一个背包。
如果每个背包中,存放着大量的物品,又因为结构数据比较复杂,会造成内存的浪费。我们不妨在背包中只存放物品的id,然后可以通过id去查找对应的物品。
namespace Details
{
[System.Serializable]
public struct InventoryItem
{
public int itemID;
public int itemAmount;
}
}
接着,我们准备一个背包容器
using System.Collections.Generic;
using Details;
using UnityEngine;
namespace Inventory.Data_SO
{
[CreateAssetMenu(menuName = "Inventory/InventoryBag", fileName = "InventoryBag")]
public class InventoryBagSo : ScriptableObject
{
public List<InventoryItem> inventoryItems;
}
}
有了这些数据,我们可以对数据进行管理。
需要拿到所有物品的数据和背包的数据
主要功能有:
通过id拿到对应的物品信息
将物品添加到背包中
将物品从背包中移除
但是需要添加到背包中的哪一个槽位,所以说背包中的格子都有一个id信息
评论区