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赋值![](https://img-blog.csdnimg.cn/2021070522483657.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2poZ3NkY2ZnaGprbA==,size_16,color_FFFFFF,t_70)
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来往背包中的空格子进行物品的添加了。