Понедельник, 25 Ноября 2024, 18:45

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[Решено]Скрипт с List
BassPiraT92Дата: Среда, 27 Марта 2019, 18:50 | Сообщение # 1
участник
Сейчас нет на сайте
Предметы стакаются но за место сложения, они удваиваются

Итем:
Код
public class Item : MonoBehaviour {
    public int ID;
    public Sprite Icon;
    public string Name;
    public string Descript;
    public int Size;
}


Думаю что то тут...
Код
    public void AddItem(Item item)
    {
        if (Item.Count > 0)
        {
            for(int u = 0; u < Item.Count; u++)
            {
                if (Item[u].ID == item.ID)
                {
                    Item[u].Size += item.Size;
                }
                else
                {
                    Item.Add(item);
                }
            }
        }
        else
        {
            Item.Add(item);
        }
    }


Вот весь код.
Код

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

public class Inventory : MonoBehaviour
{

    public List<Item> Item;

    public GameObject TestItem;
    public GameObject TestItem1;

    public GameObject SlotsPref;
    public GameObject Inv;
    private GameObject Prefzone;
  
    private void Start()
    {
        Item = new List<Item>();
        Prefzone = Inv.GetComponentInChildren<GridLayoutGroup>().gameObject;
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            AddItem(TestItem.GetComponent<Item>());
            Debug.Log("Item+");
        }

        if (Input.GetKeyDown(KeyCode.E))
        {
            AddItem(TestItem1.GetComponent<Item>());
            Debug.Log("Item1+");
        }

        if (Input.GetKeyDown(KeyCode.I))
        {
           
            Inv.SetActive(!Inv.activeInHierarchy);
        }

        if (Inv.activeInHierarchy)
        {
            foreach (Transform child in Prefzone.transform) Destroy(child.gameObject);
            InvOn();
        }
    }

    public void AddItem(Item item)
    {
        if (Item.Count > 0)
        {
            for(int u = 0; u < Item.Count; u++)
            {
                if (Item[u].ID == item.ID)
                {
                    Item[u].Size += item.Size;
                }
                else
                {
                    Item.Add(item);
                }
            }
        }
        else
        {
            Item.Add(item);
        }
    }

    void InvOn()
    {
        
        for(int i = 0; i < Item.Count; i++)
        {

            GameObject Items = Instantiate(SlotsPref, Prefzone.transform);
            Items.GetComponent<Image>().sprite = Item[i].GetComponent<Item>().Icon;
            Items.GetComponentInChildren<Text>().text = Item[i].GetComponent<Item>().Size.ToString();
        }
    }

}



Сообщение отредактировал BassPiraT92 - Четверг, 28 Марта 2019, 08:48
drcrackДата: Среда, 27 Марта 2019, 19:02 | Сообщение # 2
старожил
Сейчас нет на сайте
Код
for(int u = 0; u < Item.Count; u++)
            {
                if (Item[u].ID == item.ID)
                {
                    Item[u].Size += item.Size;
                }
                else
                {
                    Item.Add(item);
                }
            }

попробуй написать комментарий к каждой строчке чтобы понять в чем ошибка, потому что это настока очевидно что я хз. этот код как бы кричит: "переделай меня, тут баг"


Сообщение отредактировал drcrack - Среда, 27 Марта 2019, 19:03
web_sstasДата: Среда, 27 Марта 2019, 19:07 | Сообщение # 3
частый гость
Сейчас нет на сайте
drcrack, ты когда-нибудь спишь?
BassPiraT92Дата: Среда, 27 Марта 2019, 19:09 | Сообщение # 4
участник
Сейчас нет на сайте
drcrack,
Код

for(int u = 0; u < Item.Count; u++)
            {
                if (Item[u].ID == item.ID) //если в списке ID совпадает с ID получаемого предмета
                {
                    Item[u].Size += item.Size; //добавляем в итеме из списка количество получаемого предмета
                }
                else
                {
                    Item.Add(item); // если нет то просто добавляем объект в список
                }
            }
web_sstasДата: Среда, 27 Марта 2019, 19:40 | Сообщение # 5
частый гость
Сейчас нет на сайте
del

Сообщение отредактировал web_sstas - Среда, 27 Марта 2019, 19:49
FlyOfFlyДата: Среда, 27 Марта 2019, 23:28 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Я может не прав, ну функция разве не такая должна быть:
Код
    public void AddItem(Item item)
    {
int countItem = Item.Count;
        if (countItem > 0)
        {
            for(int u = 0; u < countItem; u++)
            {
                if (Item[u].ID == item.ID)
                {
                    Item[u].Size += item.Size;
                }
                else
                {
                    Item.Add(item);
                }
            }
        }
        else
        {
            Item.Add(item);
        }
    }

Что бы он не прибавлял size, к объектам, которые были добавлены во время текущего прохода по циклу
drcrackДата: Четверг, 28 Марта 2019, 05:30 | Сообщение # 7
старожил
Сейчас нет на сайте
BassPiraT92, а теперь подумай как это будет работать если в списке скажем 3 предмета — у первых двух ID другой, а у последнего совпадает с добавляемым
что сделает твой код в этом случае?

не открывай спойлер, сначала подумай


Цитата
Что бы он не прибавлял size, к объектам, которые были добавлены во время текущего прохода по циклу

смотри спойлер выше
в твоем случае шагов 3 и 4 не будет, но первые две итерации все равно добавят предмет

а теперь правильный код:


и эт, как насчет переименовать Item в Items или Inventory? неудобное название же, сбивает с толку


Сообщение отредактировал drcrack - Четверг, 28 Марта 2019, 05:40
BassPiraT92Дата: Четверг, 28 Марта 2019, 08:48 | Сообщение # 8
участник
Сейчас нет на сайте
drcrack, все вкурил) спасибо! Просто учусь пока все правильно делать
web_sstasДата: Четверг, 28 Марта 2019, 09:03 | Сообщение # 9
частый гость
Сейчас нет на сайте
BassPiraT92, в таких случаях помогает добавление Debug.log функций в местах, где предположительно проблема, и изучаешь потом лог.
FlyOfFlyДата: Четверг, 28 Марта 2019, 16:56 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
Цитата drcrack ()
, но первые две итерации все равно добавят предмет

А это я не понял просто проблему и решение на другое добавил
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг