物品的UML类图
创建Item 物品基类:
再开发它的消耗品类、装备类、武器类
接着,设计消耗品类的JSON文件:http://www.bejson.com/jsoneditoronline/
创建一个物品管理类做成单例模式,将脚本放在“InventoryManager”(场景中新建的GameObject)中 :
然后用JsonObject解析Json,unity商城Asset Store里有,并将其存入List<Item>中
private void Awake()
{
ParseItemsJSON();
}
/// <summary>
/// 解析JSON
/// </summary>
private void ParseItemsJSON()
{
itemList = new List<Item>();
TextAsset ta = Resources.Load<TextAsset>("items");
JSONObject j = new JSONObject(ta.text);
foreach (JSONObject temp in j.list)
{
string itemType = temp["type"].str;
Item.ItemType type =
(Item.ItemType)System.Enum.Parse(typeof(Item.ItemType), itemType);
int id = (int)temp["id"].n; //公用物品解析
string name = temp["name"].str;
//string Quality = temp["quality"].str;
Item.ItemQuality quality =
(Item.ItemQuality)System.Enum.Parse(typeof(Item.ItemQuality), temp["quality"].str);
string description = temp["description"].str;
int capacity = (int)(temp["capacity"].n);
int buyPrice = (int)(temp["buyPrice"].n);
int sellPrice = (int)(temp["sellPrice"].n);
string sprite = temp["sprite"].str;
Item item = null;
switch (type)
{
case Item.ItemType.Consumable:
int hp = (int)temp["hp"].n;
int mp = (int)temp["mp"].n;
item = new Consumable
(id, name, type, quality, description, capacity, buyPrice, sellPrice, sprite, hp, mp);
break;
case Item.ItemType.Equipment:
break;
case Item.ItemType.Weapon:
break;
case Item.ItemType.Material:
break;
}
itemList.Add(item);
Debug.Log(item);
}
}
设计一个背包,使用Grid Layout Group对Slot(物品槽,可添加Button组件使其有拿取的动画效果)进行排版(可对不交互的UI取消射线交互的勾选项)
创建一个Item:放置物品图片和数量,将Item和Slot做成预制体,并给Item、Slot、Knapsack添加对应脚本
创建一个Inventory类,让Knapsack继承与它;
15)Inventory类中,创建一个Slot(物品槽)类的数组,Start时获取Slot身上的Slot脚本;
申明一个存储物品方法(需在Inventory中写一个获取Item的ID的方法),参数为Item,
当Item的容量为1时:申明一个找空物品槽Slot 的方法(foreach遍历Slot的子物体是否为0),
若有空物品槽(先在Slot中写入储存物品的方法),则调用Slot中储存物品的方法;
当Item的容量不为1时:先申明一个找相同类型物品槽的方法(参数为Item,返回值类型为Slot),用foreach遍历Slot的子物体,当
slot的子物体大等于1 且 容量还没满 且 类型 相同 ,返回当前slot。当容量不为1时,若slot不为空,则调用Slot类中的存储方法,若为空,则调用容量为1的方法。
Slot中储存物品的方法:把Item放在自身下面,如果自身一下已经有Item了,amount++,
如果没有,根据ItemPrefab 去实例化一个Item,放在下面
Slot类:
ItemUI类:
更新ItemUI的UI显示:
将Knapsack做成单例类
创建一个空节点,挂上一个脚本进行测试: