Суббота, 23 Ноября 2024, 14:43

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Инвентарь и подбор вещи с пола
ZekkinДата: Среда, 20 Апреля 2016, 21:29 | Сообщение # 1
частый гость
Сейчас нет на сайте
Доброе время суток. Делаю инвентарь, и столкнулся с проблемой - никак не могу сделать подбор предметов. Пока сделал так:
Код
using UnityEngine;
using System.Collections;

public class Item001 : MonoBehaviour {
    private Inventory inv;

    // Use this for initialization
    void Start () {

    }
    void OnMouseDown () {
  inv = GetComponent<Inventory>();
  for (int i=0; i<=25; i++)
  {
   if (inv.InventoryPlayer[i] == null)
   {
    inv.InventoryPlayer.Add(i, ItemData._ItemData.ItemGen(0));
    break;
   }
  }
    }
    

}


И при попытке подбора пишет ошибку:

Код
NullReferenceException: Object reference not set to an instance of an object
Item001.OnMouseDown () (at Assets/Items/ItemScripts/Item001.cs:15)
UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)


С чем связано и как исправить? Спасибо.
LertmindДата: Среда, 20 Апреля 2016, 21:43 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Похоже компонент Inventory не найден, он должен быть на объекте с Item001.

Добавлено (20 апреля 2016, 21:43)
---------------------------------------------
Должен быть, в смысле чтобы работало. Тебе скорее всего надо иметь ссылку на игрока и делать так inv = player.GetComponent<Inventory>();

ZekkinДата: Четверг, 21 Апреля 2016, 19:01 | Сообщение # 3
частый гость
Сейчас нет на сайте
Поправил, и теперь случается другая ошибка - пока копаю её, но может и тут что посоветуют)
Код
using UnityEngine;
using System.Collections;

public class Item001 : MonoBehaviour {
    private Inventory inv;
    public GameObject Cam;

    // Use this for initialization
    void Start () {

    }
    void OnMouseDown () {
  inv = Cam.GetComponent<Inventory>();
  for (int i=1; i<=25; i++)
  {
   if (inv.InventoryPlayer[i] == null)
   {
    inv.InventoryPlayer.Add(i, ItemData._ItemData.ItemGen(0));
    break;
   }
  }
    }
    

}

Если что - Inventory висит на камере, которая висит на игроке.
Код
ArgumentException: An element with the same key already exists in the dictionary.
System.Collections.Generic.Dictionary`2[System.Int32,Item].Add (Int32 key, .Item value) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:404)
Item001.OnMouseDown () (at Assets/Items/ItemScripts/Item001.cs:19)
UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)


Добавлено (21 апреля 2016, 16:30)
---------------------------------------------


Добавлено (21 апреля 2016, 16:44)
---------------------------------------------


Добавлено (21 апреля 2016, 18:34)
---------------------------------------------


Добавлено (21 апреля 2016, 19:01)
---------------------------------------------


Сообщение отредактировал Zekkin - Четверг, 21 Апреля 2016, 19:01
berilДата: Четверг, 21 Апреля 2016, 19:06 | Сообщение # 4
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата Zekkin ()
Методом тыка выяснил что проблема в строке

Что там "тыкать" то? dry Указана же строка где ошибка и написано, что за ошибка: element with the same key already exists in the dictionary(переведи переводчиком)

Цитата Zekkin ()
Как еще можно проверить ячейку "на пустоту"?


Код

for (int i=0; i<=24; i++)
  {
   Debug.Log("Wooow");
   if (!inv.InventoryPlayer.ContainsKey(i)))
   {
       inv.InventoryPlayer.Add(i, ItemData._ItemData.ItemGen(1));
       Debug.Log("Wooow");
       break;
   }

  }




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
ZekkinДата: Четверг, 21 Апреля 2016, 19:13 | Сообщение # 5
частый гость
Сейчас нет на сайте
beril, Работает, благодарю.
Правда не очень понял логику - Key это же номер ячейки? Получается что ячейки без значения не существует?
LertmindДата: Четверг, 21 Апреля 2016, 20:09 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Zekkin, key - это ключ, все элементы словаря имеют пару (ключ, значение), если удалить элемент, то не будет ни ключа, ни значения. Когда пишешь InventoryPlayer[key], то обращаешься по ключу. В твоём случае вообще нет необходимости в словаре, потому что если у тебя всегда 25 элементов в инвентаре, то проще иметь массив, тогда не придётся проверять содержится ли элемент в словаре. Кроме того, в словаре можно было заранее добавить элементы (0, null), (1, null), ... чтобы не проверять на существование ключа, но это по сути и получается массив.
ZekkinДата: Четверг, 21 Апреля 2016, 20:15 | Сообщение # 7
частый гость
Сейчас нет на сайте
Lertmind, Понял, спасибо) Маловероятно что буду переделывать под массив, все-таки теперь все работает)
  • Страница 1 из 1
  • 1
Поиск:

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