【问题标题】:I have created an inventory System but i dont know how to proceed我已经创建了一个库存系统,但我不知道如何进行
【发布时间】:2020-09-10 15:58:56
【问题描述】:

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

这是库存代码:

// 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);

和项目脚本:

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;
}

问题是我不知道如何将我在库存中创建的项目设置到插槽。也许我需要清理我的代码,并一次检查这些东西而不是单独检查?

【问题讨论】:

    标签: c# unity3d inventory


    【解决方案1】:

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

    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 中的按钮或将项目拖动到插槽。

    【讨论】:

    • 是的,谢谢。所以你的意思是当一个项目应该被添加到一个插槽时触发一个事件。
    • 不,与事件无关。我只是确保您在 UI 中有一些东西可以让您将项目添加到插槽
    • 是的,我明白你的意思。我会实施它。我知道怎么做,但我不确定该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多