Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: z3nth10n en 28 Diciembre 2013, 15:14 pm



Título: [C#] The given key was not present in the dictionary en Sistema de Inventario
Publicado por: z3nth10n en 28 Diciembre 2013, 15:14 pm
Hola muy buenas, pues estoy haciendo un juego, creo que ya lo he dicho, pero lo recuerdo, y bueno pues ya voy por el sistema de Inventarios... Y pues me encontre un snippet de 64kb en JS y lo pasé a C# y he aquí mi pregunta, una parte del sistema que he hecho que es el sistema de Items (bueno lo he vuelto a hacer porque no me gustaba para nada la forma en la que se creaban los items)

Así que me puse manos a la obra he hice esto:

Código
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. //ItemDataBase
  5.  
  6. public class ItemScript : MonoBehaviour {
  7.  
  8.    private GameObject LoadItemPrefab(string name) {
  9.       return (GameObject)Resources.Load ("prefabs/Items/"+name);
  10.    }
  11.  
  12.    private Texture LoadItemTex(string name) {
  13.       return (Texture)Resources.Load ("textures/Items/"+name);
  14.    }
  15.  
  16.    void Start() {
  17.  
  18.       Inventory inv = new Inventory();
  19.  
  20.       InventoryItem preset;
  21.  
  22.       preset = new InventoryItem();
  23.       preset.id = 1;
  24.       preset.itemname = "Ring2";
  25.       preset.DisplayName = "Ring of Gods";
  26.       preset.itemtex = LoadItemTex (preset.itemname);
  27.       preset.worldObject = LoadItemPrefab (preset.itemname);
  28.       inv.AddNewItem(preset, preset.itemname); //Aquí se supone que es donde se crea el Item, esto es llamado antes que la clase GameGUI para que el se inserten los Items en el Diccionario....
  29.    }
  30.  
  31. }
  32.  
  33. //Item Class
  34.  
  35. public class InventoryItem
  36. {
  37.    public GameObject worldObject;
  38.    public int id;
  39.    public string itemname;
  40.    public string DisplayName;
  41.    public Texture itemtex;
  42.    public string itemtype;
  43.    public string equipmenttype;
  44.    public string usable;
  45.    public float itemweight;
  46.    public bool droppable;
  47.    public Transform itemmodel;
  48.  
  49.    public int itemstacksize;
  50.    public int itemstacklimit;
  51.    public bool showStack;
  52.  
  53.    public int bagsize;
  54.    public bool showBag;
  55.    public InventoryItem[] BagItem;
  56. }
  57.  
  58. public class Inventory {
  59.  
  60.    private Dictionary<string, InventoryItem> itemsBase = new Dictionary<string, InventoryItem>();
  61.  
  62. public void AddNewItem(InventoryItem item, string name) {
  63.  
  64.    itemsBase.Add (name, item);
  65.  
  66. }
  67.  
  68. public InventoryItem FindItem(string name) {
  69.  
  70.    return itemsBase[name];
  71.  
  72. }
  73.  
  74.  
  75. }
  76.  
  77. public class GameGUI : MonoBehaviour {
  78.  
  79. public void Start() {
  80.  
  81. InventoryItem[] InventorySlots = new InventoryItem[5]; //Se crea un inventario con 5 slots
  82.  
  83. //Y en el slots 3 se añade el Item Ring2...
  84. InventorySlots[3] = FindItem("Ring2"); //Aquí es donde salta la excepción de que no se encontró la Key en el Diccionario.
  85.  
  86. }
  87.  
  88. }

Tampoco le puedo hacer debug al Diccionario por que mi IDE (la que viene por defecto con Unity) es Mono-Develop, y bueno paso de cambiar de IDE al Unity porque es un montón de movidas porque tiene sus propias clases Inheritadas y es un follón.... Cambia mucho el code, y si tengo alguna duda, pues tengo que ir a lo Hardcore sin poder poner Ayuda en la comunidad oficial...

Así que, porque se supone que no encuentra la Key si la función start de la clase ItemScript se llama antes de que se pida la información sobre dicho diccionario.... ??



Un saludo.