Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda con script de inventario

Iniciado por Biarox1166, Diciembre 22, 2017, 08:57:57 AM

Tema anterior - Siguiente tema
Hola a todos! Les cuento que estoy teniendo un problema con una script de inventario que estoy utilizando de este video: 
 


   
tart=1723&feature=oembed" width="480">

 
Para que no tengan que ver todo el video les voy a indicar las partes puntuales. Verán mi problema es que en la función "AgregarAlgoAlInventario"(38:05) si bien se crea un "item" y si agrego otro de igual id se suman sus cantidades, solo pasa con el primer objeto de la lista(la lista de ObjetoInvId) ya que si agrego otro item con distinto id se crea un nuevo "slot",osea se adiciona un nuevo objeto en la lista(hasta ahí todo bien), pero al agregar otro item igual(mismo id que el segundo item) al segundo item se le suma la cantidad correcta, pero además se me crea otro slot y así sucesivamente. Ya que quizas lo explique medio para el tuje les dejo un gif:
 
El element 0 es el priemer item al cual al seguir agregandolo aumenta su cantidad y no se duplica. Ya los otros elementos como pueden ver tienen el mismi id pero se agregan en slots separados(aunque un detalle es que el Element 1 va aumentando su canidad en base a los nuevos duplicados de este)
 

 
Bueno ese es en sí el error les dejo toda la script por si las dudas, aunquecreo que el error debe estar en la función que nombre arriba(pareciera que no respeta el return : p):
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Inventario : MonoBehaviour {
[System.Serializable]
    public struct ObjetoInvId
    {
        public int id;
        public int cantidad;
        public ObjetoInvId(int id, int cantidad)
        {
            this.id = id;
            this.cantidad = cantidad;
        }
    }
    [SerializeField]
    Database data;
    [Header("Variables del Drag and Drop")]
public GraphicRaycaster graphRay;
private PointerEventData pointerData;
private List<RaycastResult> raycastResults;
public Transform canvas;
public GameObject objetoSeleccionado;
public Transform ExParent;
    [Header("Prefs y items")]
    public Transform Contenido;
    public Item item;
    public List<ObjetoInvId> inventarioo = new List<ObjetoInvId>();
    void Start () {
        ActualizarInventario();
   pointerData = new PointerEventData(null);
   raycastResults = new List<RaycastResult>();
}

void Update () {
   Arrastrar();
        if (Input.GetKeyDown(KeyCode.F))
        {
            AgrregarItem(1, 1);
        }
        if (Input.GetKeyDown(KeyCode.G))
        {
            AgrregarItem(3, 1);
        }
    }
    void Arrastrar () {
        if (Input.GetMouseButtonDown())
        {
            pointerData.position = Input.mousePosition;
            graphRay.Raycast(pointerData, raycastResults);
            if (raycastResults.Count > )
            {
                if (raycastResults[].gameObject.GetComponent<Item>())
                {
                    objetoSeleccionado = raycastResults[].gameObject;
                    ExParent = objetoSeleccionado.transform.parent;
                    ExParent.GetComponent<Image>().fillCenter = false;
                    objetoSeleccionado.transform.SetParent(canvas);
                }
            }
        }
           
   if(objetoSeleccionado != null){
      objetoSeleccionado.GetComponent<RectTransform>().localPosition = CanvasScreen(Input.mousePosition);
   }
   if(objetoSeleccionado != null)
        {
      if(Input.GetMouseButtonUp()){
         pointerData.position = Input.mousePosition;
         raycastResults.Clear();
         graphRay.Raycast(pointerData, raycastResults);
         objetoSeleccionado.transform.SetParent(ExParent);
         if(raycastResults.Count > ){
            foreach(var resultado in raycastResults){
            if(resultado.gameObject == objetoSeleccionado) continue;
            if(resultado.gameObject.CompareTag("Slot")){
                  if(resultado.gameObject.GetComponentInChildren<Item>() == null){
                     objetoSeleccionado.transform.SetParent(resultado.gameObject.transform);
                     Debug.Log("Slot libre");
                  }
               }
            if(resultado.gameObject.CompareTag("Item")){
                  if(resultado.gameObject.GetComponentInChildren<Item>().ID == objetoSeleccionado.GetComponent<Item>().ID){
                  Debug.Log("Tienen el mismo ID");
                  resultado.gameObject.GetComponentInChildren<Item>().cantidad += objetoSeleccionado.GetComponent<Item>().cantidad;
                  Destroy(objetoSeleccionado.gameObject);
               }else{
                  Debug.Log("Distinto ID");
                  objetoSeleccionado.transform.SetParent(resultado.gameObject.transform.parent);
                  resultado.gameObject.transform.SetParent(ExParent);
                  resultado.gameObject.transform.localPosition = Vector3.zero;            
                  }
               }
            }
         }                  
         objetoSeleccionado.transform.localPosition = Vector3.zero;
         objetoSeleccionado = null;
      }
      }
        raycastResults.Clear();
    }
    public Vector2 CanvasScreen(Vector2 screenPos){
   Vector2 viewportPoint = Camera.main.ScreenToViewportPoint(screenPos);
   Vector2 canvasSize = canvas.GetComponent<RectTransform>().sizeDelta;
   return(new Vector2(viewportPoint.x * canvasSize.x, viewportPoint.y * canvasSize.y) - (canvasSize/2));
}
   
public void AgrregarItem (int id, int cantidad){
        for (int i = ; i < inventarioo.Count; i++){
            if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
                return;
            }
            inventarioo.Add(new ObjetoInvId(id, cantidad));
            ActualizarInventario();
        }   
}
    public void EliminarItem(int id, int cantidad)
    {
        for (int i = ; i < inventarioo.Count; i++)
        {
            if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad - cantidad);
                if (inventarioo[i].cantidad <= )
                {
                    inventarioo.Remove(inventarioo[i]);
                    ActualizarInventario();
                    return;
                }
            }
            Debug.LogError("No hay nada que eliminar!");
        }
    }
    List<Item> pool = new List<Item>();
    public void ActualizarInventario ()
    {
        print("Inventario Actualizado");
        for (int i = ; i < pool.Count; i++)
        {
            if(i < inventarioo.Count)
            {
                ObjetoInvId o = inventarioo[i];
                pool[i].ID = o.id;                                                      //Aqui le asigno la id del objeto a mi script llamada Item
                pool[i].GetComponent<Image>().sprite = data.baseDatos[o.id].icono;
                pool[i].GetComponent<RectTransform>().localPosition = Vector3.zero;     //Esto lo hagoya que al utilizar slots y meter alli los items se me produce un error en la posicion
                pool[i].cantidad = o.cantidad;
                pool[i].gameObject.SetActive(true);
            }
            else
            {
                pool[i].gameObject.SetActive(false);
            }
        }
        if(inventarioo.Count > pool.Count)
        {
            for (int i = pool.Count; i < inventarioo.Count; i++)
            {
                Item it = Instantiate(item, Contenido.GetChild(i));         //Aqui el getchild(i) lo utilizo para crear el itemdentro del slot
                pool.Add(it);
                it.transform.position = Vector3.zero;
                it.transform.localScale = Vector3.one;
                ObjetoInvId o = inventarioo[i];
                pool[i].ID = o.id;                                          //Aqui le asigno la id del objeto a mi script llamada Item
                pool[i].GetComponent<RectTransform>().localPosition = Vector3.zero;//Esto es por lo mismo que aclare arriba
                pool[i].GetComponent<Image>().sprite = data.baseDatos[o.id].icono;
                pool[i].cantidad = o.cantidad;
                pool[i].gameObject.SetActive(true);
            }
        }
    }
}

 
En donde hice anotaciones es debido a que el sistema de drag and drop lo saque de otro canal y tuve que adecuarlo. Gracias de antemano : )

Tienes una función que recorre cada elemento de tu lista buscando una coincidencia, pero dentro de esta función agregas el elemento cuando el ID no coincide, ese es el problema, tienes que agregar el elemento solo si no hay ninguna coincidencia.
 
PD: Quita todos los return de dentro de los bucles

Hola!
 
Como dice Juanma. 
 
Te explico:
 

public void AgrregarItem (int id, int cantidad){
        for (int i = ; i < inventarioo.Count; i++){
            if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
                return;
            }
            inventarioo.Add(new ObjetoInvId(id, cantidad));
            ActualizarInventario();
        }   
}

 
Allí en ese trozo, si se da cuenta en esta parte: 
 

if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
                return;
            }
            inventarioo.Add(new ObjetoInvId(id, cantidad));
            ActualizarInventario();

 
Estaría diciendo: Si inventario[Numero del contador] tiene un ID que es igual al ID que me han pasado entonces agrega un nuevo objeto al inventario con la cantidad que tenia más la cantidad que me haz pasado, luego actualiza el inventario. (Quita el return, si quieres salir del bucle tienes que colocar break pero no te servirá en este caso).
 
Luego, aún si encontró un ID o no lo encontro, igualmente agregará un nuevo objeto y luego actualiza el inventario.
 
El punto es que estás utilizando el return como para salir del IF y de todo,pero no es así por lo que está siguiendo con el código abajo, para solucionarlo solo debes agregar un else al final de ese IF y meter en sus llaves el código que tienes abajo, quedando así:
 

         if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
            }else{
               inventarioo.Add(new ObjetoInvId(id, cantidad));
               ActualizarInventario();
      }

 
Prueba eso y cuentanos. Creo que debería funcionar porque es lo único que noto.
 
Suerte!!

Diciembre 23, 2017, 03:18:39 AM #3 Ultima modificación: Diciembre 23, 2017, 03:19:30 AM por francoe1
Cita de: UnityDevelopersXD date=1513984717Hola!
   
   
      Como dice Juanma. 
   
   
      Te explico:
   
   

public void AgrregarItem (int id, int cantidad){
        for (int i = ; i < inventarioo.Count; i++){
            if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
                return;
            }
            inventarioo.Add(new ObjetoInvId(id, cantidad));
            ActualizarInventario();
        }   
}

   
      Allí en ese trozo, si se da cuenta en esta parte: 
   
   

if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
                return;
            }
            inventarioo.Add(new ObjetoInvId(id, cantidad));
            ActualizarInventario();

   
      Estaría diciendo: Si inventario[Numero del contador] tiene un ID que es igual al ID que me han pasado entonces agrega un nuevo objeto al inventario con la cantidad que tenia más la cantidad que me haz pasado, luego actualiza el inventario. (Quita el return, si quieres salir del bucle tienes que colocar break pero no te servirá en este caso).
   
   
      Luego, aún si encontró un ID o no lo encontro, igualmente agregará un nuevo objeto y luego actualiza el inventario.
   
   
      El punto es que estás utilizando el return como para salir del IF y de todo,pero no es así por lo que está siguiendo con el código abajo, para solucionarlo solo debes agregar un else al final de ese IF y meter en sus llaves el código que tienes abajo, quedando así:
   
   

         if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
            }else{
               inventarioo.Add(new ObjetoInvId(id, cantidad));
               ActualizarInventario();
      }

   
      Prueba eso y cuentanos. Creo que debería funcionar porque es lo único que noto.
   
   
      Suerte!!
   


Si hace eso se le agregaria n -x veces objetos al inventario -
 
Una solución más práctica es utilizar un lista y LINQ 

 
 

List<ItemObject> _data = new List<ItemObject>();
public void AddItem(int id, int size)
{
  ItemObject item = _data.Find(x => x.ID == id);
  if(item == null)
     item = new ItemObject(id);  
  item.size += size;
}

 
Pero si aun quiere seguir haciendolo a tu modo entonces separa las funciones de búsqueda -
 

public bool FindObject(int id, out int index)
{
for(; index < inventory.Length; index ++)
   if(inventory[index].ID == id)
      return true;
return false;
}
public void AddItem(int id)
{
int index;
if(FindObject(id, out index))
   inventory[index].cantidad++;
else
   inventory.Add(new ItemObject {ID = id, Cantidad = 1 });
}

 
Pero mientras puedas utilizar LINQ y expresiones lambda se te va a simplificar muchisimo el trabajo -

Diciembre 27, 2017, 07:39:17 AM #4 Ultima modificación: Diciembre 27, 2017, 07:40:08 AM por Biarox1166
Gracias a todos!!! Aunque debo decir que lo solucioné de esta manera:
 

public void AgrregarItem (int id, int cantidad){
        for (int i = ; i < inventarioo.Count; i++){
            if (inventarioo[i].id == id)
            {
                inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
                ActualizarInventario();
                return;
            }
        }
        inventarioo.Add(new ObjetoInvId(id, cantidad));
        ActualizarInventario();
    }

 
Osea uso el return en caso de encontrar misma id, sino no sucede, salgo del for y agrego el item. Aunque que voy a usar el metodo del if y else ya que supongo que el uso de los return no esta correctamente aplicado(si me pudieran explicar lo agradecería ya que al parecer funciona : p)  y para lo de implementar de la manera que dice @francoe1 con LINQ debo usar una librería especial o solo con crear el array y usarlo de la manera que mostras acá ya está?
 
Cita de: francoe1 date=1513995519List<ItemObject> _data = new List<ItemObject>(); public void AddItem(int id, int size) { ItemObject item = _data.Find(x => x.ID == id); if(item == null) item = new ItemObject(id); item.size += size; }
   


Disculpen si hago preguntas muy básicas pero quiero entender : p

Diciembre 27, 2017, 10:44:18 AM #5 Ultima modificación: Diciembre 28, 2017, 01:56:06 AM por UnityDevelopersXD
Hola!
 
Disculpa, lo de los IF y else como te a dicho francoe no funciona, ya que agregaría un objeto por cada vez que no encuentre uno parecido. Lo que has echo está bien también, si quieres hacerlo mas sencillo y aprovechar la lista que tienes creada no hagas uso del for, utiliza el foreach incorporado de las lists:
 

public void AgrregarItem (int id, int cantidad){
   bool EncontroParecido = false;
        ObjetoInvId ObjetoEncontrado = inventarioo.ForEach(delegate(ObjetoInvId CObjeto){
          if(CObjeto.id == id){
                inventarioo.Add(new ObjetoInvId(id, cantidad));
                ActualizarInventario();
                 EncontroParecido = true;
        }
        });   
 
        if(!EncontroParecido){
         inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
         ActualizarInventario();
        }
        
    }

 
Allí estas utlizando las propiedades de la lista, haces una busqueda con el ForEach y en cada vuelta verificas si el objeto es parecido a lo que necesitas.
 
Lo que te ha dicho francoe es solo "agregar y ya está" no debes agregar ninguna libreria necesariamente porque las funciones que ha implementado en el código son de las propias lists y vienen con los assemblies por defecto. No conocia esas funciones como LINQ y Lambda, pero si esas se refiere a las funciones que usó entonces están por defecto.
 
El return se utiliza más que todo en casos cuando el método devuelve algo (no está void), no es muy comun verlo en métodos que están vacios (void), deberías utilizarlo solo en esos casos porque mejora la lectura de tu código, en este caso tu método está vacio y devolver "nada" es un poco raro, sería mejor que utilizaras una bool frente a tu código para que verificaras si se encontro un objeto, luego si se encuentra un objeto la marcas como true, sino no hace nada, y al final del bucle hacer un if que verifique si esa bool es false, si lo es entonces crea un nuevo objeto, sino no hace nada,tal como he echo en el código de arriba. Tambien puedes utilizar la opción de francoe que queda más limpia y tambien usas las funciones de las list, te coloco esta como una alternativa a la mia si lo ves muy enrrollado.
 
Suerte!

Cita de: UnityDevelopersXD date=1514367858Hola!
   
   
      Disculpa, lo de los IF y else como te a dicho francoe no funciona, ya que agregaría un objeto por cada vez que no encuentre uno parecido. Lo que has echo está bien también, si quieres hacerlo mas sencillo y aprovechar la lista que tienes creada no hagas uso del for, utiliza el foreach incorporado de las lists:
   
   

public void AgrregarItem (int id, int cantidad){
   bool EncontroParecido = false;
        ObjetoInvId ObjetoEncontrado = inventarioo.ForEach(delegate(ObjetoInvId CObjeto){
          if(CObjeto.id == id){
                inventarioo.Add(new ObjetoInvId(id, cantidad));
                ActualizarInventario();
                 EncontroParecido = true;
        }
        });   
 
        if(!EncontroParecido){
         inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad);
         ActualizarInventario();
        }
        
    }

   
      Allí estas utlizando las propiedades de la lista, haces una busqueda con el ForEach y en cada vuelta verificas si el objeto es parecido a lo que necesitas.
   
   
      Lo que te ha dicho francoe es solo "agregar y ya está" no debes agregar ninguna libreria necesariamente porque las funciones que ha implementado en el código son de las propias lists y vienen con los assemblies por defecto. No conocia esas funciones como LINQ y Lambda, pero si esas se refiere a las funciones que usó entonces están por defecto.
   
   
      El return se utiliza más que todo en casos cuando el método devuelve algo (no está void), no es muy comun verlo en métodos que están vacios (void), deberías utilizarlo solo en esos casos porque mejora la lectura de tu código, en este caso tu método está vacio y devolver "nada" es un poco raro, sería mejor que utilizaras una bool frente a tu código para que verificaras si se encontro un objeto, luego si se encuentra un objeto la marcas como true, sino no hace nada, y al final del bucle hacer un if que verifique si esa bool es false, si lo es entonces crea un nuevo objeto, sino no hace nada,tal como he echo en el código de arriba. Tambien puedes utilizar la opción de francoe que queda más limpia y tambien usas las funciones de las list, te coloco esta como una alternativa a la mia si lo ves muy enrrollado.
   
   
      Suerte!
   


Buenisimo!! @UnityDevelopersXD El tema es que traté de implementar este codigo y me marca como error toda la parte del delegate(Cannot implicitly convert type `void' to `InventarioNuevo.ObjetoInvId') y en el condicional "!EncontroParecido" tambien hay un error ya que si no creo un for la variable i nunca es creada. Si me puedieses ayudar con eso ya no jodo más jajaja 

Diciembre 28, 2017, 01:55:30 PM #7 Ultima modificación: Diciembre 28, 2017, 01:55:47 PM por UnityDevelopersXD
Hola!
 
Jaja disculpa, edité tu código un poco rápido y se mhan pasado bastantes cosas jaja.
 
Si, se me han ido varias cosillas por acá jaja, en total quedaría así:
 

public void AgrregarItem (int id, int cantidad){
   bool EncontroParecido = false;
        /*ObjetoInvId ObjetoEncontrado = Quitamos esto porque no la vamos a asignar a ningun lado, la variable que usaremos será la que se cree adelante en el propio iterador. */inventarioo.ForEach(delegate(ObjetoInvId CObjeto){
          if(CObjeto.id == id){
         CObjeto.cantidad += cantidad;
                // Si lo de arriba no funciona entonces tienes que hacer una busqueda denuevo con esto:
         //inventarioo.Find(x => x.id == id) =
         //Pero si harás lo de arriba entonces mejor que uses directamente lo que te pasó Juanma porque es más legible y tiene mejor rendimiento que
         //hacer dos busquedas. Si te funca sin hacer el find entonces queda bien.
                ActualizarInventario();
                 EncontroParecido = true;
        }
        });   
 
        if(!EncontroParecido){
         inventarioo.Add(new ObjetoInvId(id, cantidad));
         ActualizarInventario();
        }
        
    }


 

 
Creo que así no debería tener errores, no lo he probado, pero así a vista debe ser así. Igualmente recuerda que en el condicional verificas que no hay ningun objeto igual, por lo que solo tienes que agregar uno nuevo en cualquier espacio vacio o añadir un nuevo item a la lista. Y arriba en el iterador del foreach verificas si es igual a la ID que pasas, si es así entonces solo sumas la cantidad a la que tenía.
 
Suerte!

La mejor opción es la siguiente:
 

public void AddItem(int id, int size)
{
  ItemObject item = _data.Find(x => x.ID == id); // Buscar en el inventario un objeto con el ID
  if(item == null) // Si la busqueda del ITEM no es satifactoria
  {
     item = new ItemObject(id);  // Crear un nuevo item
_data.Add(item); // Agregarlo al inventario
  }
  item.size += size; // Actualizar la cantidad independientemente de si es un nuevo item o si ya existia
}

 
@UnityDevelopersXD El código que estás presentando es un lio, no se necesita un FLAG para saber si se identificó un objeto con el ID indicado, ni siquiera para indicar la creación de un nuevo ítem, por otro lado la función AddItem no tiene que llamar a la función UpdateInventory, si por alguna razón necesitas insertar 100 objetos desde un bucle entonces llamarias 100 veces a la actualización cuando con 1 vez bastaría, el problema se arrastra desde el código original por eso lo comento.
 
 

Si franco, tienes razón, por eso lo he comentado en el código, que está opción es una alternativa a la que ha colocado el, pero que sigue siendo mejor la forma que utilizas de hacer un find, solo que puse juanma y no francoe jaja disculpa.
 
Pero si, en general es mejor lo que mencionas tu, sin embargo la alternativa que presento es totalmente funcional, solo habría que optimizarla.

Muchisimas gracias a todos en especial a @UnityDevelopersXD por la ayuda ya puse el código de francoe el tema está en que me tira error en el condicional de "item == null" ya que no lo toma y si lo convierto en bool pierde "efecto" me podrían ayudar con eso ultimo please? : p
 
 

Hola!
 
Si, en un script que yo hice anteriormente con algo parecido me pasaba así, ya que al no ser un gameobject sino un script o estruct no te lo reconoce como null, o eso creo ya que tuve que hacer otra comprobación para que funcionara.
 
En mi opinión tienes dos opciones, la primera y la más "dificil" sería añadir un bool al struct de los items, ponerla en true siempre que crees un objeto, para que puedas hacer una comprobación de, if(bool == false), ya que si sabes que siempre está en true cuando hay un item entonces sabrás que si está en false es porque no encontró nada.
 
La segunda opción y la más fácil, es que hagas en ese if la verificación de si el ID que encontró es igual al ID que le pasaste, entonces el único problema con esto es que si tienes un ID que sea cero pues puede fallar. Lo digo porque todos los int se inicializan a cero, si en esa busqueda no encuentra nada entonces creo que te devuelve esa struct pero con todo por defecto (cantidad en 0 e ID en 0), entonces podrías verificar y hacer que ninguno de tus items tengan el ID 0 y así puedes hacer lo que te dije o hacer ya directamente esto: if(ID > 0) y todo estaría listo.
 
Espero que te ayude.

Diciembre 30, 2017, 04:32:28 PM #12 Ultima modificación: Diciembre 30, 2017, 04:32:52 PM por Phantom3D
Que arte tenéis los programadores eh xD

Si ObjectItem es una estructura opta por cambiarlo a una clase, por otro lado si quieres mantener el tipo podrias hacerlo con default(T) -
 

public struct ItemObject
{
public int ID{ get; set; }
public ...
}
if(item == default(ItemObject)) // Equivalente a NULL -

 
Suerte!

Pienso que sería mucho rollo cambiarlo a una clase, de echo, como struct viene perfecto para las funciones que usa. Lo mejor sería usar el default que has dicho (No lo conocia eh, me lo guardo).

Etiquetas: