NullReferenceException: Object reference not set to an instance of an object Item001.OnMouseDown () (at Assets/Items/ItemScripts/Item001.cs:15) UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)
Похоже компонент Inventory не найден, он должен быть на объекте с Item001.
Добавлено (20 апреля 2016, 21:43) --------------------------------------------- Должен быть, в смысле чтобы работало. Тебе скорее всего надо иметь ссылку на игрока и делать так inv = player.GetComponent<Inventory>();
Если что - 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) ---------------------------------------------
Насколько я понял, в Dictionary нельзя поместить одинаковые элементы? // Хотя бред, в скрипте Inventory прекрасно добавляются одинаковые элементы -_- попробую добавить функцию добавления предмета в Inventory а в Item001 только вызывать оную.
Добавлено (21 апреля 2016, 16:44) ---------------------------------------------
Перевесил Inventory на самого игрока. Попытка что-то изменить приводит к тому же результату, Wooow`кает два раза - потом пишет ошибку.
Код
using System.Collections; using System.Collections.Generic;
public class Item001 : MonoBehaviour { private Inventory inv; public GameObject Player;
// Use this for initialization void Start () {
} void OnMouseDown () {
Player = GameObject.FindGameObjectWithTag ("Player");
inv = Player.GetComponent<Inventory>();
for (int i=0; i<=24; i++) { Debug.Log("Wooow"); if (inv.InventoryPlayer.ContainsValue(null)) Debug.Log("Wooow"); { inv.InventoryPlayer.Add(i, ItemData._ItemData.ItemGen(1)); Debug.Log("Wooow"); break; }
} }
}
Ошибка сменилась на такую:
Код
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:26) UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)
Точнее - изменилась строка с ошибкой
Добавлено (21 апреля 2016, 18:34) ---------------------------------------------
Методом тыка выяснил что проблема в строке
Код
if (inv.InventoryPlayer.ContainsValue(null))
тк без неё все прекраснейшим образом работает. Как еще можно проверить ячейку "на пустоту"?
Добавлено (21 апреля 2016, 19:01) ---------------------------------------------
Еще один эксперимент показал - такой скрипт:
Код
using UnityEngine; using System.Collections; using System.Collections.Generic;
public class Item001 : MonoBehaviour { private Inventory inv; public GameObject Player;
// Use this for initialization void Start () {
} void OnMouseDown () {
Player = GameObject.FindGameObjectWithTag ("Player");
inv = Player.GetComponent<Inventory>();
for (int i=0; i<=23; i++) {
if (inv.InventoryPlayer.ContainsValue(null)) { Debug.Log(i); }
} }
}
Просто перечисляет все i, будто они не заняты, хотя первые 4 (0, 1, 2 и 3) очень даже заняты...
Сообщение отредактировал Zekkin - Четверг, 21 Апреля 2016, 19:01
Что там "тыкать" то? Указана же строка где ошибка и написано, что за ошибка: 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; }
Zekkin, key - это ключ, все элементы словаря имеют пару (ключ, значение), если удалить элемент, то не будет ни ключа, ни значения. Когда пишешь InventoryPlayer[key], то обращаешься по ключу. В твоём случае вообще нет необходимости в словаре, потому что если у тебя всегда 25 элементов в инвентаре, то проще иметь массив, тогда не придётся проверять содержится ли элемент в словаре. Кроме того, в словаре можно было заранее добавить элементы (0, null), (1, null), ... чтобы не проверять на существование ключа, но это по сути и получается массив.