Blink

纸上得来终觉浅,绝知此事要躬行

Unity:实现背包系统(一)

背包系统是大多数游戏中必不可少的功能,以前在网上也看过一些教程实现过背包系统,但是总感觉教程中的背包系统逻辑和UI表现联系太过于紧密,而且背包数据存档不方便,这两天闲来无事,就想自己尝试一下实现一个逻辑与表现分离并且数据出来进行存档的背包系统,完成的效果如下,虽然还是有很多的缺陷,但是基本功能也算实现了

效果

《Unity:实现背包系统(一)》

核心类

下图所有的类都不继承MonoBehaviour
《Unity:实现背包系统(一)》

物品基类

  • 这个类的作用是存储从配置文件中读取的物品数据,每一个物品对应一个对象
  • 这里面的一些属性只是定义了一些物品常用的基础属性,如果有不同类型的物品可以继承此类扩展
/****************************************************
 *  文件名称:BaseItem.cs
 *  作    者:Blink
 *  邮    箱:1614283998@qq.com
 *  创建日期:2019/11/11 16:46:58
 *  功    能:物品基类
 ****************************************************/
public class BaseItem
{
    public BaseItem(int id, string name, int capacity, string icon, string des)
    {
        ID = id;
        Name = name;
        Capacity = capacity;
        Icon = icon;
        Des = des;
    }

    /// <summary>
    /// 物品ID
    /// </summary>
    public int ID { get; protected set; }
    /// <summary>
    /// 物品名称
    /// </summary>
    public string Name { get; protected set; }
    /// <summary>
    /// 容量: 每个格子能够容纳该物品的数量
    /// </summary>
    public int Capacity { get; protected set; }
    /// <summary>
    /// 图标路径
    /// </summary>
    public string Icon { get; protected set; }
    /// <summary>
    /// 物品描述
    /// </summary>
    public string Des { get; protected set; }

    public override string ToString()
    {
        return string.Format("ID:{0},Name:{1},Capacity:{2},Icon:{3},Des:{4}", ID, Name, Capacity, Icon, Des);
    }
}

背包格子类

  • 这个类是对应的背包中的格子数据,每一个背包格子对应一个该类的对象
/****************************************************
 *  文件名称:BagGrid.cs
 *  作    者:Blink
 *  邮    箱:1614283998@qq.com
 *  创建日期:2019/11/11 16:45:44
 *  功    能:物品格子
 ****************************************************/

public class BagGrid
{
    protected int mIndex = -1;
    /// <summary>
    /// 格子索引,默认为-1
    /// </summary>
    public int Index
    {
        get
        {
            return mIndex;
        }
    }

    protected BaseItem mItem = null;
    /// <summary>
    /// 格子下的物品对象,没有物品是为空
    /// </summary>
    public BaseItem Item
    {
        get
        {
            return mItem;
        }
    }

    protected int mAmount = 0;
    /// <summary>
    /// 格子里的物品数量,没有物品时为0
    /// </summary>
    public int Amount
    {
        get
        {
            return mAmount;
        }
    }

    /// <summary>
    /// 格子是否为空
    /// </summary>
    public bool IsEmpty
    {
        get { return mItem == null; }
    }

    public BagGrid(int index)
    {
        mIndex = index;
        Clear();
    }

    /// <summary>
    /// 设置物品
    /// </summary>
    /// <param name="item">物品对象</param>
    /// <param name="amount">数量</param>
    public void SetItem(BaseItem item,int amount)
    {
        if (item != mItem)
            mItem = item;
        mAmount = amount;
    }

    /// <summary>
    /// 添加数量
    /// </summary>
    /// <param name="amount">增加的个数</param>
    /// <returns>格子中的物品数量</returns>
    public int AddAmount(int amount)
    {
        mAmount += amount;
        return mAmount;
    }

    /// <summary>
    /// 减少数量
    /// </summary>
    /// <param name="amount">减少的个数</param>
    /// <returns>格子中剩余的物品数量</returns>
    public void SubAmount(int amount)
    {
        mAmount -= amount;
        if(mAmount <= 0)
            Clear();
    }

    // 清空格子
    protected virtual void Clear()
    {
        mItem = null;
        mAmount = 0;
    }

    public override string ToString()
    {
        return string.Format("Index:{0}, Item [{1}], Amount:{2}", mIndex, mItem.ToString(), mAmount);
    }
}

背包数据存储类

  • 这个类的作用是方便背包数据进行游戏存档,因为存档是我们一般会对数据序列化,所以这个类我们需要加上[System.Serializable]特性
/****************************************************
 *  文件名称:BagData.cs
 *  作    者:Blink
 *  邮    箱:1614283998@qq.com
 *  创建日期:2019/11/11 16:43:04
 *  功    能:背包物品数据(用于存储)
 ****************************************************/

[System.Serializable]
public class BagData
{
    /// <summary>
    /// 背包格子索引
    /// </summary>
    public int Index;
    /// <summary>
    /// 物品id
    /// </summary>
    public int ID;
    /// <summary>
    /// 物品数量
    /// </summary>
    public int Amount;
}

下篇继续

点赞

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注