我已经创建了一个库存系统,但我不知道如何继续



我已经准备好了所有东西,但在将库存中创建的项目设置为实际插槽时遇到了问题。我这样做是为了更好地了解这些项目。

这是库存的代码:

// Amount of Slots in inventory defined here!!!
[SerializeField]
private Slot[] slots = new Slot[10];
public List<Item> invItems = new List<Item>();


public void CheckSlot(Item item)
{
for (int i = 0; i < slots.Length; i++)
{
if (slots[i].isEmpty == false)
{
//call a method.
if (item.isStackable)
{
slots[i].amount = item.amount;
}
}
if (slots[i].isEmpty == true)
{
//call another method.
//run some code.

slots[i] = new Slot(item);
return;
}
}
}
public void UpdateAmount(Item _item,Slot _slot)
{
_slot.amount = _item.amount;
}
public void CreateItem(Item item)
{
Item invItem1 = new Item();
invItem1 = item.Copy();
invItems.Add(invItem1);
}

public void InventoryAdd(Item item)
{
//check if the item is already in the inventory
//if true check if it is stackable and the new amount is less than maxStackable amount
//if false add the item to the invItems list and set the slot to false            



if (invItems.Count != 0)
{
for (int i = 0; i < invItems.Count; i++)
{

if (invItems[i].ItemID == item.ItemID)
{

if (invItems[i].amount + item.amount <= invItems[i].maxStackable)
{

invItems[i].amount += item.amount;
CheckSlot(invItems[i]); //
return;
}
if (invItems[i].amount < invItems[i].maxStackable)
{
if (invItems[i].amount + item.amount > invItems[i].maxStackable)
{

int nextAmount = invItems[i].maxStackable - invItems[i].amount;
invItems[i].amount += nextAmount;

Item invItem1 = new Item();
invItem1 = item.Copy();
invItem1.amount = invItem1.amount - nextAmount;
invItems.Add(invItem1);

return;
}
}
}
}
}
Item invItem = new Item();
invItem = item.Copy();
invItems.Add(invItem);

和Item脚本:

public string name;
public  int ItemID;
public GameObject prefab;
public Sprite icon;
public int amount = 1;
public bool isStackable;
public int maxStackable = 5;
public Item()
{
}
public Item(string _name, int id,GameObject _prefab, int _amount, bool stackable,int maxStack)
{
name = _name;
ItemID = id;
prefab = _prefab;
amount = _amount;
isStackable = stackable;
maxStackable = maxStack;
}
public Item Copy()
{
Item copy = new Item();
copy.name = this.name;
copy.ItemID = this.ItemID;
copy.prefab = this.prefab;
copy.amount = this.amount;
copy.isStackable = this.isStackable;
copy.maxStackable = this.maxStackable;
return copy;
}

和插槽的代码:

public bool isEmpty=true;

public Slot()
{
}
public Slot(Item _item)
{
this.name = _item.name;
this.ItemID = _item.ItemID;
this.isStackable = _item.isStackable;
this.prefab = _item.prefab;
this.icon = _item.icon;
}

问题是我不知道如何将我在库存中创建的项目设置到插槽中。也许我需要清理我的代码,一次检查每一件事,而不是分开检查?

我从您的描述中了解到,您有多个插槽,每个插槽可以容纳一个或多个项目。因此,与其像下面这样通过构造函数添加它们:

public Slot(Item _item)
{
this.name = _item.name;
this.ItemID = _item.ItemID;
this.isStackable = _item.isStackable;
this.prefab = _item.prefab;
this.icon = _item.icon;
}

在slot类中维护一个项目列表,并有一个特殊的方法将项目添加到slot中。类似这样的东西:

public List<Item> ItemsInSlot {get;set;}
public void AddItems(IEnumerable<Item> items)
{
ItemsInSlot.AddRange(items);
}

我假设你已经有了一些机制来触发向插槽添加项目。就像UI中的按钮或将项目拖动到插槽中一样。

相关内容

最新更新