UGUI--背包系统之二--------Inventory

using UnityEngine;
using System.Collections;
using System.Text;
public class Inventory : MonoBehaviour {
    protected Slot[] slotArray;
    private CanvasGroup canvasGroup;
    private float targetA = 0;
    private float smothing = 6;
    public  virtual void Start()
    {
        slotArray = GetComponentsInChildren<Slot>();
        canvasGroup = GetComponent<CanvasGroup>();
    }
    void Update()
    {
        if (canvasGroup.alpha != targetA)
        {
            canvasGroup.alpha = Mathf.Lerp(canvasGroup.alpha, targetA, smothing * Time.deltaTime);
            if (Mathf.Abs(canvasGroup.alpha - targetA) < 0.01f)
            {
                canvasGroup.alpha = targetA;
            }

        }
    }
    public bool AddItem(int id)
    {
        ItemBase item = InventoryManager.Instance.GetItemById(id);
        return AddItem(item);
    }
    public bool AddItem(ItemBase item)
    {
        if (item == null)
        {
            Debug.Log("你增加的物品ID不存在");
            return false;
        }
        if (item.maxStack == 1)   //叠加数量为1,所以给他找一个空的物品槽
        {
            Slot emptySlot = FindEmptySlot();
            if (emptySlot == null)
            {
                Debug.Log("物品栏中的槽已经满了,不能再增加物品了");
                return false;
            }
            else
            {
                emptySlot.AddItem(item);
            }
        }
        else
        {
            Slot slot = FindSameTypeSlot(item);
            if (slot!= null)
            {
                slot.AddItem(item);
            }
            else
            {
                Slot emptySlot = FindEmptySlot();
                if(emptySlot!=null){
                    emptySlot.AddItem(item);
                }
                else
                {
                    Debug.Log("物品栏中的槽已经满了,不能再增加物品了");
                    return false;
                }
            }
        }
        return true;
    }
    private Slot FindEmptySlot()
    {
        foreach (Slot slot in slotArray)
        {
            if (slot.transform.childCount == 0)
            {
                return slot;
            }
        }
        return null;
    }
    private Slot FindSameTypeSlot(ItemBase item)
    {
        foreach (Slot slot in slotArray)
        {
            if ((slot.transform.childCount >=1)&&slot.GetThisItemID()==item.ID&&slot.isFull()==false)
            {
                return slot;
            }
        }
        return null;
    }

    public void DisplaySwitch()
    {
        if (targetA==0)
        {
            targetA = 1;
            canvasGroup.blocksRaycasts = true;
        }
        else
        {
            targetA = 0;
            canvasGroup.blocksRaycasts = false;
        }
    }


    public void SaveInventory()    //频繁的更改字符用stringbuilder
    {
        StringBuilder sb = new StringBuilder();
        foreach (Slot slot in slotArray)
        {
            if (slot.transform.childCount > 0)
            {
                Item itemUI = slot.transform.GetChild(0).GetComponent<Item>();
                sb.Append(itemUI.itemBase.ID + "," + itemUI.Amount+"-");
            }
            else
            {
                sb.Append("0-");
            }
        }
        PlayerPrefs.SetString(this.gameObject.name, sb.ToString());
    }
    public void LoadInventory()
    {
        if (PlayerPrefs.HasKey(this.gameObject.name))
        {
            string str = PlayerPrefs.GetString(this.gameObject.name);
            string[] itemArray = str.Split('-');
            for (int i = 0; i < itemArray.Length-1; i++)
            {
                string s = itemArray[i];
                if (s != "0")
                {
                    string[] temp = s.Split(',');
                    int id = int.Parse(temp[0]);
                    int amount = int.Parse(temp[1]);
                 ItemBase itemInfo=InventoryManager.Instance.GetItemById(id);
                 slotArray[i].AddItem(itemInfo);
                 slotArray[i].GetComponentInChildren<Item>().SetAmount(amount);
                }
            }
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值