Jump to content
UnitySpain
oridar

duda consultas en diccionario o lista

Recommended Posts

buenas a todos, a ver si me pueden orientar que no consigo que me funcione.

Estoy intentando hacer una lista o diccionario en el que he introducido 4 propiedades de tipo string.

esto es una:

public class listaMesclas {
    public string nombre;
    public string compBase;
    public string compExtra;
    public string catalizador;

    public listaMesclas(string newNombre, string newBase, string newExtra, string newCata){
        nombre = newNombre;
        compBase = newBase;
        compExtra = newExtra;
        catalizador = newCata;
    }
}

luego en otro script por otro lado hago las entradas,(solo pongo tres ahora tengo unas 20 y la idea es ir ampliando):

List<listaMesclas> Mezcla = new List<listaMesclas>();
    Mezcla.Add (new listaMesclas("semillaPlanta1","Azufre", "Carbon", "pocion1" ));
    Mezcla.Add (new listaMesclas("semillaPlanta2","Azufre", "Plata", "pocion2" ));
    Mezcla.Add (new listaMesclas("semillaPlanta3","Carbon", "Plata", "pocion3" ));

hasta aquí creo que bien.

lo que intento conseguir es poder comprobar si en un trigger tengo tres objetos con los nombre de la lista, por ejemplo Azufre, carbon, y pocion1, que me devuelva la posición o el nombre del primer valor, semillaPlanat1 en este caso, o la posición 0.

el trigger lo tengo, no se como hacer las consultas en el diccionario y dar validez a una posición si se cumplen los tres parámetros.

he estado buscando pero en tema List y Dictionary soy muy principiante, si conocen un sistema mejor también lo agradecería 

gracias de antemano por la atención .

p.d. si necesitan el script entero lo pasaría.

 

Edited by oridar
cambio titulo

Share this post


Link to post
Share on other sites

no necesitas usar diccionarios en el script imagino que lo que quires hacer es una espcie de sistema de crafting, podrias añadir lo siguiente

public class Inventario
{
	public List<string> items;
    public List<listaMescla> mezcla;
      
    void OnTriggerEnter(Collider other)
	{
      for(int n =  ; n < mezcla.Count ; n++)
      {
          if(items.Contains(mezcla[n].compBase) && items.Contains(mezcla[n].compExtra) && items.Contains(mezcla[n].catalizador))
          {
               Debug.log("El jugador posee los ingrediendes para craftear " + mezcla[n].nombre);
          }
      }
    }
}

 

Share this post


Link to post
Share on other sites

puedes usar lambda:

ListaMesclas lm = Mezcla.Find(o => o.comBase == "nombreObjeto");
//recogera de tu lista la que en comBase tenga "x objeto".
//donde 'o' es una variable de tipo ListaMesclas.
...

o como tu lo quieras usar, esta es una forma de acceso rapido a listas o diccionarios.

-> En una Lista puedes acceder desde un indice de tipo int=> lista[index].propertie...

-> En un diccionario cambia la cosa, si lo declaras con un Key de tipo string puedes acceder al diccionario de esta forma=>

Dictionary<string,string> d = new Dictionary<string,string>();
 d.Add("key1","value1");
d.Add("key2","value2");

d["key1"] = "nuevo valor";

puedes buscar referencia sobre lambda o System.Collection.Generic (es el nombre de espacio de List y Dictionary) en internet.

Un Saludo.

Share this post


Link to post
Share on other sites

La clase List implementa un método que busca en todos los elementos con las condiciones que tú definas, en otras palabras tu objeto Mezcla tiene una función que busca en todas las listaMezclaClas la que coincida con las condiciones que quieras, esto lo hace haciendo uso de un predicado, un predicado es un tipo de delegado que es como una función que creas para buscar en la lista.

Depende de lo que quieras lograr puedes buscar por elementos que tiene listaMezclaClas o puedes buscar de los 20 elementos los que tengas:

//Busca todos los elementos que contengan "Carbon"
List<listaMezclaClas> primerFiltro = Mezcla.FindAll( x=> x.compBase == "Carbon" || x.compExtra == "Carbon");
  
//Busca en los elementos que tienen carbon los elementos que contengan "Azufre"
List<listaMezclaClas> segundoFiltro = primerFiltro.FindAll ( x=> x.compBase == "Azufre" || x.compExtra == "Azufre");
  
//Puedes hacerlo una última vez con la opción "PocionX"

De esta forma puedes crear en tu trigger una función que busca los objetos que tienes y si con los objetos que tienes hay alguna opción o más de una posible simplemente la devuelve, el problema es que si tienes muchos objetos diferentes puedes tener muchas combinaciones, por esto estaría bien que comenzaras por el más restrictivo, por ejemplo si tienes 10 compBase pero solo 4 pociones, busca siempre primero las pociones que tengas.

Igual hay otra forma menos complicada de hacerlo pero así es como yo lo haría. Suerte!

 

Share this post


Link to post
Share on other sites
On 26/5/2017 at 17:10, juanma_teso said:

La clase List implementa un método que busca en todos los elementos con las condiciones que tú definas, en otras palabras tu objeto Mezcla tiene una función que busca en todas las listaMezclaClas la que coincida con las condiciones que quieras, esto lo hace haciendo uso de un predicado, un predicado es un tipo de delegado que es como una función que creas para buscar en la lista.

Depende de lo que quieras lograr puedes buscar por elementos que tiene listaMezclaClas o puedes buscar de los 20 elementos los que tengas:


//Busca todos los elementos que contengan "Carbon"
List<listaMezclaClas> primerFiltro = Mezcla.FindAll( x=> x.compBase == "Carbon" || x.compExtra == "Carbon");
  
//Busca en los elementos que tienen carbon los elementos que contengan "Azufre"
List<listaMezclaClas> segundoFiltro = primerFiltro.FindAll ( x=> x.compBase == "Azufre" || x.compExtra == "Azufre");
  
//Puedes hacerlo una última vez con la opción "PocionX"

De esta forma puedes crear en tu trigger una función que busca los objetos que tienes y si con los objetos que tienes hay alguna opción o más de una posible simplemente la devuelve, el problema es que si tienes muchos objetos diferentes puedes tener muchas combinaciones, por esto estaría bien que comenzaras por el más restrictivo, por ejemplo si tienes 10 compBase pero solo 4 pociones, busca siempre primero las pociones que tengas.

Igual hay otra forma menos complicada de hacerlo pero así es como yo lo haría. Suerte!

 

gracias por tu respuesta, ya encontre un sistema parecido, pero m elo guardo como alternativa, gracias de verdad.

On 26/5/2017 at 17:00, kingtrase said:

puedes usar lambda:


ListaMesclas lm = Mezcla.Find(o => o.comBase == "nombreObjeto");
//recogera de tu lista la que en comBase tenga "x objeto".
//donde 'o' es una variable de tipo ListaMesclas.
...

o como tu lo quieras usar, esta es una forma de acceso rapido a listas o diccionarios.

-> En una Lista puedes acceder desde un indice de tipo int=> lista[index].propertie...

-> En un diccionario cambia la cosa, si lo declaras con un Key de tipo string puedes acceder al diccionario de esta forma=>


Dictionary<string,string> d = new Dictionary<string,string>();
 d.Add("key1","value1");
d.Add("key2","value2");

d["key1"] = "nuevo valor";

puedes buscar referencia sobre lambda o System.Collection.Generic (es el nombre de espacio de List y Dictionary) en internet.

Un Saludo.

si, encontre algo parecido, gracias por el comentario.

On 26/5/2017 at 4:36, James Roman said:

no necesitas usar diccionarios en el script imagino que lo que quires hacer es una espcie de sistema de crafting, podrias añadir lo siguiente


public class Inventario
{
	public List<string> items;
    public List<listaMescla> mezcla;
      
    void OnTriggerEnter(Collider other)
	{
      for(int n =  ; n < mezcla.Count ; n++)
      {
          if(items.Contains(mezcla[n].compBase) && items.Contains(mezcla[n].compExtra) && items.Contains(mezcla[n].catalizador))
          {
               Debug.log("El jugador posee los ingrediendes para craftear " + mezcla[n].nombre);
          }
      }
    }
}

 

gracias por tu respuesta, encontre otro sistema mas principiante, jajaja, pero me inetresa este sistema, loq ue no me queda claro es como declaras que un objeto tiene x xompoennets, seria en listamezca tal como lo tenia?

gracias.

 

Share this post


Link to post
Share on other sites

×
×
  • Create New...