【问题标题】:Can't add items to inventory <List> - Unity C#无法将项目添加到库存 <List> - Unity C#
【发布时间】:2017-09-21 20:39:01
【问题描述】:

我基本上有这个问题,当我在 Start() 函数中尝试此代码 inventory.Add(database.Items[16]); 时,它确实将项目添加到我的库存中,但每当我在 buttonClick 或任何其他函数而不是 Start() 上尝试此代码时,它就像空气一样,没有任何作用......请帮助

Inventory.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Inventory : MonoBehaviour
{
    public List<Item> inventory = new List<Item>();
    public List<Item> slots = new List<Item>();

    public GameObject slotPreset;
    public GameObject parentInvetoryGridForSlots;

    public Text itemNameText;

    private ItemDatabase database;

    void Start()
    {
        database = GameObject.FindGameObjectWithTag("Item Database").GetComponent<ItemDatabase>();
        //Add item to invetory code - inventory.Add(database.Items[16]);

        for (int i = 0; i < inventory.Count; i++)
        {
            inventory.Add(new Item());
        }

        AddItem(1);
        AddItem(2);
        AddItem(3);
        AddItem(4);


        for (int i = 0; i < inventory.Count; i++)
        {
            GameObject spawnedSlot = Instantiate(slotPreset);
            spawnedSlot.transform.SetParent(parentInvetoryGridForSlots.gameObject.transform);

            itemNameText.text = inventory[i].itemName;
        }
    }

    void RemoveItem(int id)
    {
        for (int i = 0; i < inventory.Count; i++)
        {
            if (inventory[i].itemID == id)
            {
                inventory[i] = new Item();
                break;
            }
        }
    }

    void AddItem(int id)
    {
        for (int i = 0; i < inventory.Count; i++)
        {
            if (inventory[i].itemName == null)
            {
                for (int j = 0; j < database.Items.Count; j++)
                {
                    if (database.Items[j].itemID == id)
                    {
                        inventory[i] = database.Items[j];
                    }
                }
                break;
            }
        }
    }
}

物品数据库.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemDatabase : MonoBehaviour {
    public List<Item> Items = new List<Item>();

    //Edit missing ItemType3 colors... Or wrong colors... And add missing colors to database...

    void Start()
    {
        //Wanderer Crate
        Items.Add(new Item("Bloody Combat Pants", 0, 0.12f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Gray));
        Items.Add(new Item("Blue Hi-top Trainers", 1, 2.12f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shoes, Item.ItemType3.Green));
        Items.Add(new Item("Boots (Punk)", 2, 0.19f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shoes, Item.ItemType3.Green));
        Items.Add(new Item("Cargo Pants (Beige)", 3, 0.19f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Gray));
        Items.Add(new Item("Cargo Pants (Blue)", 4, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Gray));
        Items.Add(new Item("Cargo Pants (Khaki)", 5, 0.06f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Gray));
        Items.Add(new Item("Dirty Tank-top (White)", 6, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
        Items.Add(new Item("Floral Shirt", 7, 10.19f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Blue));
        Items.Add(new Item("Glasses (Punk)", 8, 0.37f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Glasses, Item.ItemType3.Green));
        Items.Add(new Item("Hotpants (Blue)", 9, 138.12f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Purple));
        Items.Add(new Item("Long Sleeved T-shirt (Striped)", 10, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
        Items.Add(new Item("Long-sleeved T-shirt (Black)", 11, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
        Items.Add(new Item("Long-sleeved T-shirt (Light Blue)", 12, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
        Items.Add(new Item("Mandarin Jacket (Blue)", 13, 18.60f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Jacket, Item.ItemType3.Violet));
        Items.Add(new Item("Padded Jacket(Urban)", 14, 1.77f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Jacket, Item.ItemType3.Blue));
        Items.Add(new Item("Pleated Mini-skirt (Blue)", 15, 170.97f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Red));
        Items.Add(new Item("Ballistic Mask", 16, 19.02f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Mask, Item.ItemType3.Violet));
        Items.Add(new Item("Protective Glasses", 17, 45.43f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Glasses, Item.ItemType3.Purple));
        Items.Add(new Item("School Shirt (Open)", 18, 17.14f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Violet));
        Items.Add(new Item("School Shoes", 19, 17.14f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shoes, Item.ItemType3.Blue));
        Items.Add(new Item("Working Boots", 20, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shoes, Item.ItemType3.Gray));
        Items.Add(new Item("Slacks (Blue)", 21, 4.20f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Pants, Item.ItemType3.Blue));
        Items.Add(new Item("T-shirt (Red)", 22, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
        Items.Add(new Item("T-shirt (Striped)", 23, 0.04f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
        Items.Add(new Item("Tank - top(Charcoal)", 24, 0.09f, Item.ItemType1.Wanderer_Crate, Item.ItemType2.Shirt, Item.ItemType3.Gray));
    }

}

Opeed Item Seel Keep.cs(在此代码中 'inventory.Add(database.Items[itemID]);' 不起作用)

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class openedItemSellKeep : MonoBehaviour {

    public Text itemIDText;
    public Text moneyText;

    public GameObject openedCrateItemPanel;
    public GameObject backCoverPanel;

    private ItemDatabase database;

    public List<Item> inventory = new List<Item>();

    public void sellItem()
    {
        database = GameObject.FindGameObjectWithTag("Item Database").GetComponent<ItemDatabase>();
        int itemID = Convert.ToInt32(itemIDText.text);
        double doubleMoney = Convert.ToDouble(File.ReadAllText("money.txt"));
        float money = ToSingle(doubleMoney);
        Debug.Log(database.Items[itemID].itemPrice);
        money += database.Items[itemID].itemPrice;
        moneyText.text = money.ToString() + "$";
        File.WriteAllText("money.txt", money.ToString());
        openedCrateItemPanel.SetActive(false);
        backCoverPanel.SetActive(false);
    }

    public void keepItem()
    {
        database = GameObject.FindGameObjectWithTag("Item Database").GetComponent<ItemDatabase>();
        int itemID = Convert.ToInt32(itemIDText.text);
        inventory.Add(database.Items[itemID]);
        openedCrateItemPanel.SetActive(false);
        backCoverPanel.SetActive(false);


    }

    public static float ToSingle(double value)
    {
        return (float)value;
    }
}

【问题讨论】:

  • 您的班级openedItemSellKeepInventory 都有一个列表inventory。除非您在某个时候将它们的引用设置为彼此相等,否则我看不出添加一个会如何影响另一个?
  • it's just like air, it doesn't do anything 调试通过时发生了什么?
  • 它什么也没显示,一切都很顺利......那我应该改变什么,Serlite?
  • 正如@mjwills 建议的那样,您需要调试您的代码 以确定问题发生在哪里。 Stack Overflow 不是调试服务。如果您使用 Minimal, Complete, and Verifiable example 更新您的问题并总结您尝试调试问题的内容,我们可能会提供帮助。

标签: c# unity3d add


【解决方案1】:

您的每个函数都在创建 Inventory 对象的一个​​新实例。如果您想要一个可供多个脚本访问且始终是同一个实例的数据库,请考虑将其设为静态和全局并创建一次。还将所有内容添加到同一个列表中。根据您的命名约定,我假设这是单个玩家的库存?

如果您需要为多个玩家创建多个数据库实例,则只需创建一次并保留参考。

最后一个建议。看起来您正在使用昂贵的查找来检索信息和删除项目。考虑使用一个字典,将 ID 用作键,将 Item 用作值。这样你就不用去搜索了 每个项目。

void AddItem(int id)
{        
    inventory[id] = database[id];
}

void RemoveItem(int id)
{
    inventory.Remove(id);
}

【讨论】:

  • 你是什么意思?我应该如何使其全球化并在任何地方使用它?因为我不明白你的意思
  • 您应该只执行一次。保留对数据库的引用。 database = GameObject.FindGameObjectWithTag("Item Database").GetComponent();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多