Noticias

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

Obtener imagen de xml

Iniciado por fernando, Abril 02, 2017, 10:41:24 AM

Tema anterior - Siguiente tema
Abril 02, 2017, 10:41:24 AM Ultima modificación: Abril 02, 2017, 12:30:17 PM por pioj
Buenas.
 
Tengo un xml donde guardo las rutas de unas imágenes.
 
mi aplicación crea un botón por cada ruta que tengo en el xml puesto,pero no consigo que el botón se cree con la imagen que hay en las rutas ,se pone una imagen de ? que creo que es de las que tiene unity por defecto.
 
Alguien sabría ayudarme y decirme donde esta el fallo?
 
 
 
con esto leeo el xml (funciona bien)
 

 public Datos ReadXmlTest() {
        XmlSerializer serializer = new XmlSerializer(typeof(Datos));
        StreamReader reader = new StreamReader(xmlPath);
        Datos data = (Datos)serializer.Deserialize(reader);
        reader.Close();
        return data;
    }

 
y luego tengo esto otro para generar los botones por cada elemento en el xml (funciona bien) y luego la parte de poner la imagen que funciona mal..
 

 
 
 

  void Awake() {
        string path = "C:/datos.xml";
        XmlManager xmlMng = new XmlManager(path);
        data = xmlMng.ReadXmlTest();
        foreach (var juego in data.Juegos) {
            Button newButton = Instantiate(buttonPrefab);
            newButton.transform.SetParent(layout);
            newButton.GetComponent<AppButton>();
            Sprite imageSprite = new Sprite();
            Texture2D SpriteTexture = Texture(path);
            imageSprite = Sprite.Create(SpriteTexture, new Rect(, , SpriteTexture.width, SpriteTexture.height), new Vector2(, ), 100.0f);
            newButton.image.sprite = imageSprite;
        }
    }
    public Texture2D Texture(string Path) {
        Texture2D Texture2D;
        byte[] FileData;
        if (File.Exists(Path)) {
            FileData = File.ReadAllBytes(Path);
            Texture2D = new Texture2D(1, 1);
            if (Texture2D.LoadImage(FileData))
                return Texture2D;
        }
        return null;
    }

 
 

¿Donde esta el error? 
 
- Al parecer la lógica está muy bien el unico error que estoy notando es 

Aca esta tomando un componente pero nunca haces uso de él.
 

newButton.GetComponent<AppButton>();

 
Aca no encontramos con otro, estas asignando el sprite directamente al componente "Button", por eso no se visualiza el cambio, debería realizar el cambio al componente "Image"
 

newButton.image.sprite = imageSprite;

 
Creo que eso son los errores.
 
Otra cosita por las dudas ¿La función "public Texture2D Texture(string Path)" no te está devolviendo null siempre? si es asi podrias tener un error con la ruta de la imagen.

Cita de: francoe1 date=1491139419¿Donde esta el error? 
   
   
      - Al parecer la lógica está muy bien el unico error que estoy notando es 

      Aca esta tomando un componente pero nunca haces uso de él.
   
   

newButton.GetComponent<AppButton>();

   
      Aca no encontramos con otro, estas asignando el sprite directamente al componente "Button", por eso no se visualiza el cambio, debería realizar el cambio al componente "Image"
   
   

newButton.image.sprite = imageSprite;

   
      Creo que eso son los errores.
   
   
      Otra cosita por las dudas ¿La función "public Texture2D Texture(string Path)" no te está devolviendo null siempre? si es asi podrias tener un error con la ruta de la imagen.
   


El fallo que me dices no es.Si en vede pasar el archivo xml paso la ruta de una imagen lo hace bien pero claro yo necesito que coja las rutas de los xml y lo que hace es intentar leer el xml entero como si fuera una imagen o algo asi...
 
Como puedo arreglar eso?

Esta mal todo el codigo... (Primero soluciona tu codigo y luego intenta leer el xml)
 

public Datos ReadXmlTest() {
        XmlSerializer serializer = new XmlSerializer(typeof(Datos));
        StreamReader reader = new StreamReader(xmlPath);//xmlPath supongo que es una variable global...
        Datos data = (Datos)serializer.Deserialize(reader);
        reader.Close();
        return data;
    }
void Awake() {
        string path = "C:/datos.xml";
        XmlManager xmlMng = new XmlManager(path);
        data = xmlMng.ReadXmlTest(); //Data es declarada en ReadXmlTest... aqui no tiene lugar alguno, si ya esta global la tienes dos veces declarada...
        foreach (var juego in data.Juegos) {
            Button newButton = Instantiate(buttonPrefab);
            newButton.transform.SetParent(layout); //doy por echo que layout esta en una variable global.
            newButton.GetComponent<AppButton>();
            Sprite imageSprite = new Sprite();
            Texture2D SpriteTexture = Texture(path);//Aqui le estas pasando la variable path que esta declarada arriba como string y es la ruta del archivo normal que no funcione.
            imageSprite = Sprite.Create(SpriteTexture, new Rect(, , SpriteTexture.width, SpriteTexture.height), new Vector2(, ), 100.0f);
            newButton.image.sprite = imageSprite; //esto no te puede funcionar nunca
          //la forma correcta: newButton.GetComponent<AppButton>().image.sprite... (siendo que tu clase AppButton tenga esa variable)
        }
    }
    public Texture2D Texture(string Path) {
        Texture2D Texture2D; //Un nombre no puede ser igual al nombre del Tipo de variable que usas. llamalo texture2D (con minuscula)
        byte[] FileData;
        if (File.Exists(Path)) {
            FileData = File.ReadAllBytes(Path);//Aqui simplemente das por echo que el archivo que lees es una imagen, y recoges los Bytes
            Texture2D = new Texture2D(1, 1); //Si tu textura no tiene nombre y es de 1 pixel por 1 pixel bien echo,
         
            if (Texture2D.LoadImage(FileData))
                return Texture2D;//y Aqui devuelves un Tipo.
        }
        return null;
    }

 
Aqui tienes un Xml parser: http://dev.grumpyferret.com/unity/
 
Aqui como funciona XmlSerializer: http://wiki.unity3d.com/index.php?title=Saving_and_Loading_Data:_XmlSerializer
 
Suerte!

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Cita de: kingtrase date=1491236264Esta mal todo el codigo... (Primero soluciona tu codigo y luego intenta leer el xml)
   
   

public Datos ReadXmlTest() {
        XmlSerializer serializer = new XmlSerializer(typeof(Datos));
        StreamReader reader = new StreamReader(xmlPath);//xmlPath supongo que es una variable global...
        Datos data = (Datos)serializer.Deserialize(reader);
        reader.Close();
        return data;
    }
void Awake() {
        string path = "C:/datos.xml";
        XmlManager xmlMng = new XmlManager(path);
        data = xmlMng.ReadXmlTest(); //Data es declarada en ReadXmlTest... aqui no tiene lugar alguno, si ya esta global la tienes dos veces declarada...
        foreach (var juego in data.Juegos) {
            Button newButton = Instantiate(buttonPrefab);
            newButton.transform.SetParent(layout); //doy por echo que layout esta en una variable global.
            newButton.GetComponent<AppButton>();
            Sprite imageSprite = new Sprite();
            Texture2D SpriteTexture = Texture(path);//Aqui le estas pasando la variable path que esta declarada arriba como string y es la ruta del archivo normal que no funcione.
            imageSprite = Sprite.Create(SpriteTexture, new Rect(, , SpriteTexture.width, SpriteTexture.height), new Vector2(, ), 100.0f);
            newButton.image.sprite = imageSprite; //esto no te puede funcionar nunca
          //la forma correcta: newButton.GetComponent<AppButton>().image.sprite... (siendo que tu clase AppButton tenga esa variable)
        }
    }
    public Texture2D Texture(string Path) {
        Texture2D Texture2D; //Un nombre no puede ser igual al nombre del Tipo de variable que usas. llamalo texture2D (con minuscula)
        byte[] FileData;
        if (File.Exists(Path)) {
            FileData = File.ReadAllBytes(Path);//Aqui simplemente das por echo que el archivo que lees es una imagen, y recoges los Bytes
            Texture2D = new Texture2D(1, 1); //Si tu textura no tiene nombre y es de 1 pixel por 1 pixel bien echo,
         
            if (Texture2D.LoadImage(FileData))
                return Texture2D;//y Aqui devuelves un Tipo.
        }
        return null;
    }

   
      Aqui tienes un Xml parser: http://dev.grumpyferret.com/unity/
   
   
      Aqui como funciona XmlSerializer: http://wiki.unity3d.com/index.php?title=Saving_and_Loading_Data:_XmlSerializer
   
   
      Suerte!
   


Corrigiendo esos errores ya funcionara??? Lo raro es que me dices que no puede funcionar pero yo creo que si funciona.Me Lee el xml bien y me guarda en la variable los datos del xml,las dos rutas de las imágenes y los dos.exe que tiene que ejecutar el programa.
 
El objetivo de mi programa es que por cada dato en el xml cree un botón.Ennel xml dentro de dato tengo la ruta de una imagen y de un .Exe
 
De momento me crea bien los botones,por cada dato me crea un botón me falta poner la imagen que le toca a ese botón y que al darle click ejecute el .Exe que le toca a ese botón
 
Maso menos creo que la imagen la puedo llegar a poner saber cómo puedo hacer para que ejecute el .Exe cada botón?
 
 

quieres ejecutar un .exe desde unity? no comprendo el motivo, pero te equivocas de plataforma... de todas formas si pasas el codigo completo junto al xml completo tambien igual te puedo ayudar.

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Cita de: kingtrase date=1491242427quieres ejecutar un .exe desde unity? no comprendo el motivo, pero te equivocas de plataforma... de todas formas si pasas el codigo completo junto al xml completo tambien igual te puedo ayudar.
   


La idea es tener como un menú donde tendre diferentes botones y cada botón ejecutará una cosa diferente,ya puede ser una calculadora el Google Chrome un juego hecho y compilado en unity cualquier .Exe
 
Pero necesito que los datos los lea desde un xml para que así editando el xml puedo mantener la aplicación actualizada sin tener que volver a compilar.
 
Ahora sí edito el xml y pongo otra ruta y otra img me crea otro botón y si no pongo ninguna ruta no crea ningún botón ni nada,no se si me explico.
 
Si me pasas tú correo te paso todo el proyecto
 
Muchas gracias
 
 

paco.smr1@gmail.com
 
Ya te entiendo, y si te puedo ayudar, ahi tienes mi correo :)

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Etiquetas: