(文件夹会最先编译)
(文件夹会最先编译)
第一层:取物品时,物品栏是否为空
第二层:放物品时,pickeditem是否为空
第三层:放物品时,物品栏是否为空
第四层:物品栏不为空时,与pickeditem是否为同类物品
第五层:是否按了ctrl
如果采用寻找相同类型来存储可堆叠物品,而不是采用ID,那么会导致获取得HP时却增加了MP存量而不是获取HP。
同时如果采用StoreItem方法来直接存储可堆叠物品会导致一个对象拥有多个子对象,一个格子对象可能带着四五个子对象,而且这个现象是无穷叠加,捡到多少次消耗品,就会给那个格子添加多少个子对象。
利用类型来储存消耗品是不合适的,应该采用根据ID来寻找,这样精确的储存可以确保玩家获取到的不同的消耗品都可以正确的进入背包。
首先更改findtype方法为findId。
public SlotUI FindSameIdSlot(Item item)
{
int id = item.ID;
foreach(SlotUI slot in slotlist)
{
if(slot.transform.childCount != 0)
{
if(slot.GetItemId() == id)
{
if(slot.IsFull() != true)
{
return slot;
}
}
}
}
return null;
}
其次更改Slot内的方法。
public int GetItemId()
{
return transform.GetChild(0).GetComponent<ItemUI>().item.ID;
}
以及添加一个新的方法,来给获取得的相同消耗品增加存储量,而不是再次给储物槽提供一个新的子对象。
public void StockMore()
{
transform.GetChild(0).GetComponent<ItemUI>().number++;
}
最终玩家取得到的不同消耗品,会正确的堆叠。
SlotUI slot = FindSameIdSlot(item);
if(slot != null)
{
slot.StockMore();
return true;
}
else
{
slot = FindEmptySlot();
if(slot == null)
{
return false;
}
slot.StoreItem(item);
return true;
}
如果父类没有空的构造方法
而子类只需要父类自己没有任何东西
则必须在
推荐直接使用 JSON .NET 来解析json 直接json 映射obj 代码量会小很多
https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347
public void ParseItemJson(){
TextAsset itemAsset = Resources.Load("Items") as TextAsset;
ArrayList wrapList = JsonConvert.DeserializeObject<ArrayList>(itemAsset.text);
foreach (var wrap in wrapList)
{
Item item = JsonConvert.DeserializeObject<Item>(wrap.ToString());
switch (item.ItemType)
{
case Item.ItemTypeEnum.Consumable :
item = JsonConvert.DeserializeObject<Consumable>(wrap.ToString());
break;
case Item.ItemTypeEnum.Weapon:
item = JsonConvert.DeserializeObject<Weapon>(wrap.ToString());
break;
case Item.ItemTypeEnum.Equipment:
item = JsonConvert.DeserializeObject<Equipment>(wrap.ToString());
break;
case Item.ItemTypeEnum.Material:
item = JsonConvert.DeserializeObject<ItemMaterial>(wrap.ToString());
break;
default:
break;
}
if (item != null) itemList.Add(item);
}
Debug.Log(itemList.Count);
}
使用 JSON .NET For Unity 解析json
toString 方法可以简写
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}