Вопрос по инвентарю

Программирование на Юнити.

Вопрос по инвентарю

Сообщение vovaU 17 июн 2018, 23:39

Делаю инвентарь создал скрипт для предметов ItemObj в нем находятся параметры предмета: ID, спрайт и количество единиц добавляемых в стак. В инвентаре создаю лист
Синтаксис:
Используется csharp
public List<itemObj> inventory_item = new List<itemObj>();
далее пускаю луч в объекты которые есть на сцене проверяю наличие скрипта ItemObj и нажата ли кнопка Е . Далее код проверки на наличие итема в листе и действия, если объект уже есть в листе то к его количеству добавляем N количество единиц, если нету его в листе то добавляем этот объект в лист. Вот код
Синтаксис:
Используется csharp
RaycastHit hit;
       
        if (Physics.Raycast(ray, out hit, 3.0f))
        {
            if (Input.GetKeyDown(KeyCode.E) && hit.collider.gameObject.GetComponent<itemObj>())
            {
                        if (inventory_item.Count > 0)
                        {
                            int counti = inventory_item.Count;
                    for (int k = 0; k < counti; k++)
                    {

                        if (inventory_item[k].Id == hit.collider.gameObject.GetComponent<itemObj>().Id)
                        {
                            Debug.Log("id = id");
                            inventory_item[k].Stack_Count += hit.collider.gameObject.GetComponent<itemObj>().Stack_Count;
                            Destroy(hit.collider.gameObject);
                            break;
                        }
                        else
                        {
                            Debug.Log("id != id");
                            inventory_item.Add(hit.collider.gameObject.GetComponent<itemObj>());
                            Destroy(hit.collider.gameObject);
                            break;
                        }

                    }

                }
                          else
                          {
                           
                            inventory_item.Add(hit.collider.gameObject.GetComponent<itemObj>());
                            Destroy(hit.collider.gameObject);
                          }
            }
        }

Проблема в том что мой код делает проверку только для первого объекта, всех следующих если они есть то не видит, и в место того что бы добавить к уже существующему количество единиц, добавляет как новый объект. Но циклом я перебираю элементы листа от 0 до inventory_item.Count.
vovaU
UNец
 
Сообщения: 3
Зарегистрирован: 17 июн 2018, 22:51

Re: Вопрос по инвентарю

Сообщение Friend123 18 июн 2018, 10:28

В чем проблема расставить брейкпоинты и отдебажить код? Явно где-то в коде ошибка
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Вопрос по инвентарю

Сообщение Anonymyx 18 июн 2018, 12:38

Синтаксис:
Используется csharp
inventory_item.Add(hit.collider.gameObject.GetComponent<itemObj>());
Destroy(hit.collider.gameObject);
 

Вы добавляете объект в лист, и сразу уничтожаете его. В листе его не будет.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Вопрос по инвентарю

Сообщение vovaU 18 июн 2018, 12:52

Anonymyx писал(а):
Синтаксис:
Используется csharp
inventory_item.Add(hit.collider.gameObject.GetComponent<itemObj>());
Destroy(hit.collider.gameObject);
 

Вы добавляете объект в лист, и сразу уничтожаете его. В листе его не будет.



Я добавляю скрипт который прикреплен к объекту. А как тогда правильно сделать добавление элементов с сцены их удаление после. Я в начале добавлял из другого листа в котором хранились все предметы, это не годится.
vovaU
UNец
 
Сообщения: 3
Зарегистрирован: 17 июн 2018, 22:51

Re: Вопрос по инвентарю

Сообщение Anonymyx 18 июн 2018, 13:06

Самое верное решение-просто запомнить ID объекта, и удалить. У вас же есть какая-то "база данных", массив (в идеале словарь <ItemObj/ID>, в котором хранятся все объекты, раз у вас есть параметр ID. Вот по ID и будете взаимодействовать.
А еще можно не уничтожать, а просто 'выключить', gameObject.SetActive(false);
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Вопрос по инвентарю

Сообщение vovaU 18 июн 2018, 16:07

Anonymyx писал(а):Самое верное решение-просто запомнить ID объекта, и удалить. У вас же есть какая-то "база данных", массив (в идеале словарь <ItemObj/ID>, в котором хранятся все объекты, раз у вас есть параметр ID. Вот по ID и будете взаимодействовать.
А еще можно не уничтожать, а просто 'выключить', gameObject.SetActive(false);


Я наверное нашел свою ошибку, у меня там цикл перебирает все объекты и если
Синтаксис:
Используется csharp
inventory_item[k].Id == hit.collider.gameObject.GetComponent<itemObj>().Id
значит такой объект уже есть, а если else то нету его. Так вот else почему то сравнивается не со всеми объектами листа, а только с первым. Так вот я добавил второй цикл
Синтаксис:
Используется csharp
for (int k = 0; k < inventory_item.Count; k++)
                    {
                       
                        if (inventory_item[k].Id != hit.collider.gameObject.GetComponent<itemObj>().Id)
                        {
                            Debug.Log("k = " + k);
                            inventory_item.Add(hit.collider.GetComponent<itemObj>());
                            Cell_id.Add(hit.collider.GetComponent<itemObj>().Id);
                            Destroy(hit.collider.gameObject);
                            break;
                        }


                    }

Но он также сравнивается не со всеми объектами листа, а только с первым.Получается что, цикл запустился и сравнивает первый элемент с элементом Х, они не совпадают и цикл остановился, а у меня второй элемент такой же самый как Х и если бы сравнился со вторым то условие в if не исполнилось. Как тогда правильно перебрать все элементы и сравнить с элементом Х к примеру, и если нет совпадений то выполнить следующие действия.
vovaU
UNец
 
Сообщения: 3
Зарегистрирован: 17 июн 2018, 22:51

Re: Вопрос по инвентарю

Сообщение seaman 18 июн 2018, 19:04

Уберите break из нужной ветки
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 6