Unity Inventory не работает должным образом - PullRequest
1 голос
/ 02 апреля 2020

Я новичок в Unity.

Я пытаюсь создать систему инвентаризации, в которой, если вы скажете 4 дерева, она не будет занимать 4 пространства инвентаря, только 1 с номером 4 .

Когда я обычно получаю 4 дерева и открываю инвентарь, все работает нормально, со значком дерева и номером 4. Когда я добавляю с помощью инспектора в список публикуемых c, он просто дублирует Первая запись Вот о чем я говорю. Вот код:

public void OpenInventory()
{

    inventoryPanel.SetActive(true);
    Dictionary<string, int> stuff = new Dictionary<string, int>();
    stuff = new Dictionary<string, int>();
    //updating inventory slots on screen
    for (int i = 0; i < inv.Count; i++)
    {
        if (!stuff.ContainsKey(inv[i]))
        {
            stuff.Add(inv[i], 1);  
        }
        else
        {
            stuff[inv[i]] = stuff[inv[i]] += 1;
        }

    }

    for (int i = 0; i < stuff.Count; i++)
    {
        uiSlots[i].GetChild(0).gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>("Sprites/" + inv[i]) as Sprite;

        uiSlots[i].GetChild(1).GetComponent<Text>().text = stuff[inv[i]].ToString();

    }


}

Перед внесением изменений (работает нормально):

Before I make changes

still before but the graphical thingy

Теперь, когда я изменяю инвентарь в инспекторе и переосмысливаю sh экран инвентаря:

after I make changes

still after I make changes

Я действительно понятия не имею, что происходит, особенно потому что, если я делаю то же самое снова, ничего не меняется.

1 Ответ

1 голос
/ 02 апреля 2020

Давайте посмотрим на этот фрагмент кода.

for (int i = 0; i < stuff.Count; i++)
    {
        uiSlots[i].GetChild(0).gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>("Sprites/" + inv[i]) as Sprite;

        uiSlots[i].GetChild(1).GetComponent<Text>().text = stuff[inv[i]].ToString();

    }

В вашем случае, stuff.Count == 2, верно? Лес и тролль. Так что i в вашем for l oop будет повторяться по 0, 1, что означает, что inv[i] всегда будет деревом! Ты понял? Первый и второй элементы inv - оба дерева, поэтому неудивительно, что в вашем инвентаре есть два слота для дерева.

Вот мое предложение, используйте foreach:

int walker = 0; // which indicates the index of slot.

foreach (var item in stuff)
    {
        uiSlots[walker].GetChild(0).gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>("Sprites/" + item.Key) as Sprite;

        uiSlots[walker].GetChild(1).GetComponent<Text>().text = item.Value.ToString();

        walker++;
    }

foreach может повторять все виды коллекций. Процесс, в котором вы помещаете элементы в inv в stuff dict, также можно преобразовать в выражение foreach, например:

foreach (var item in inv)
    {
        if (!stuff.ContainsKey(item))
        {
            stuff.Add(item, 1);  
        }
        else
        {
            stuff[item]++;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...