Unity-背包系统与Json文本解析

1.简单背包系统设计思路

物品类Item:包含物品的所有属性

Json信息存储文本:根据物品类的属性录入数据

储物总控制类InventoryManager:解析Json文本获取物品信息,并根据物品id获取物品

格子类Slot:对将进入背包格子的物品进行设置

物品UI类ItemUI:设置格子中物品UI显示

格子管理类Knapsack:找空格子,并进行存储

设计思路:设置物品属性,根据设定的物品编写Json文本文件,设定一个ItemList集合,通过Json解析工具,解析Json文本,并将其存入ItemList,通过ItemList中已添加的Item的id判断物品,并存入背包中的空格子中(需找到空格子),在空格子中添加代表物品的UI图片。

2.具体代码实现

Item(此处简单设置两个物品属性id与存放路径)

using UnityEngine;

public class Item
{
    public  int ID {get;set;}
    public   string Sprite { get; set; } 

    public Item( int id,string sprite)
    {
        this.ID = id;
        this.Sprite = sprite;
    }
}

Json文本文件(可在记事本中编写后将后缀改为.json再导入unity中,放在Resources文件夹下,方便读取,物品UI也同理)

[
  {
    "id": 1,
    "sprite": "Picture/fork"
  },
  {
    "id": 2,
    "sprite": "Picture/cake"
  },
  {
    "id": 3,
    "sprite": "Picture/paper"
  },
  {
    "id": 4,
    "sprite": "Picture/match"
  },
  {
    "id": 5,
    "sprite": "Picture/key"
  }
]

Json解析工具,可在Asset Store中下载,导入工程

在场景添加空物体,并挂载脚本InventoryManager

using System.Collections.Generic;
using UnityEngine;

public class InventoryManager : MonoBehaviour 
{
    #region 单例模式
    private static InventoryManager _instance;
    
    public static InventoryManager Instance
    {
        get
        {
            if(_instance==null)
            {
               _instance = GameObject.Find("InventoryManager").GetComponent<InventoryManager>();
            }        
                return _instance;   
        }
    }
    #endregion
    private List<Item> itemList;
    private void Start()
    {
        ParseItemJson();
    }
    /// <summary>
    /// 解析物品信息  
    /// </summary>
     void ParseItemJson()
    {
        itemList = new List<Item>();
       TextAsset itemText= Resources.Load<TextAsset>("Item");
        string itemsJson = itemText.text;
        JSONObject j = new JSONObject(itemsJson);
        foreach (JSONObject temp in j.list)
        {
            Item item = null;
            int id = (int)(temp["id"].n);//得到Json中物品id的值
            string sprite = temp["sprite"].str;//得到Json中的物品路径
            item = new Item(id, sprite);
            itemList.Add(item);
        }
    }

    public Item GetItemById(int id)//通过id获取物品
    {
        foreach (Item item in itemList)
        {
            if(item.ID==id)
            {
                return item;
            }
        }
        return null;
    }
}

在背包的格子中添加Slot脚本,并给ItemPerfab添加以创建好的UI预制体

using UnityEngine;


public class Slot : MonoBehaviour 
{
    public GameObject itemPrefab;
    public void TheStoreItem(Item item)
    {
        GameObject itemGameObject = Instantiate(itemPrefab) as GameObject;
        itemGameObject.transform.SetParent(this.transform);
        itemGameObject.transform.localPosition = Vector3.zero;
        itemGameObject.GetComponent<ItemUI>().SetItem(item);
    }
}

给UI预制体添加脚本ItemUI并给itemImage赋值

using UnityEngine;
using UnityEngine.UI;
public class ItemUI : MonoBehaviour
{
    public  Image itemImage;

    public Item Item {get;set;}

    public void SetItem(Item item)
    {
       
        this.Item = item;
        itemImage.sprite = Resources.Load<Sprite>(item.Sprite);
        
    }
}

给背包添加Knapsack脚本

using UnityEngine;


public class Knapsack : MonoBehaviour 
{
    private Slot[] slotList;
    private static Knapsack _instance;
    public static Knapsack Instance
    {
        get
        {
            if(_instance==null) 
            {              
                _instance = GameObject.Find("KnapsackPanel").GetComponent<Knapsack>();
            }
            return _instance;
           
        }
        
    }

     void Start()
    {
        slotList = GetComponentsInChildren<Slot>();//得到所有含有Slot组件的子物体      
    }

    public bool StoreItem(int id)
    {
        Item item = InventoryManager.Instance.GetItemById(id);
        return StoreItem(item);
    }

    public bool StoreItem(Item item)
    {
        if(item==null)
        {
            Debug.LogWarning("要存储的物品的ID不存在");
            return false;
        }
        else
        {
            Slot slot = FindEmptySlot();
            if(slot==null)
            {
                Debug.LogWarning("没有空的物品槽");
                return false;
            }
            else
            {
                slot.TheStoreItem(item);//存储物品到空槽
            }
            return true;
        }
    }

    private Slot FindEmptySlot()//找空格子
    {
        foreach (Slot  slot in slotList)
        {
            if(slot.transform.childCount==0)
            {
                return slot;
            }
        }
        return null;
    }
}

至此简单的背包管理业务逻辑(无拖拽,同物品累计添加功能)就完成了,最后就可以根据实际情况(鼠标点击获取物品,按键获取物品,完成任务获取物品)调用Knapsack中的StoreItem(int id)函数,根据id来往背包中的空格子进行物品的添加了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值