前言

在去实现复杂的背包系统的时候,我们先会做一个简单的背包系统,然后通过一系列的问题,慢慢的引导出复杂的背包系统。

那么什么是复杂的背包系统呢?笔者认为,一定需要遵循开闭原则(对修改关闭,对扩展开放),为了实现这种效果。我们的思维应该是依赖抽象,而不是依赖实现。

数据设计

一个简单的背包系统,要考虑背包中的格子需要存放哪些数据,取决于具体的项目是如何规划的。

所以我们思考的第一个问题就是:什么物品可以存放在背包中?

以一个农场经营内游戏来说:食物(苹果、鸡蛋等)、工具(稿子、斧头等)、种子(土豆种子、玉米种子等)都可以作为物品存放在背包中。

玩过我的世界的游戏来说:各种各样的方块,工具(斧头、稿子等)、床、食物等都可以作为物品存放在背包中。

所以我们需要提取他们的共同行为:唯一的标识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信息