miércoles, 19 de marzo de 2014

Unity3D scripting: Descargar datos con JSON

Este script será muy util a todo aquel que quiera conectar su videojuego con una base de datos en la nube a través de peticiones a servidor con JSON, el cual no voy a explicar en que consiste detenidamente, pero básicamente es una forma de devolvernos los datos en forma de texto desde la base de datos en la nube a nuestra aplicación.

Para ello, he usado una web de pruebas llamada http://www.jsontest.com/ a la cual se le pueden hacer peticiones de prueba con JSON y un plugin gratuito llamado SimpleJSON el cual si pinchais en el enlace no solo descargaréis el plugin necesario si no algunos ejemplos, pero precisamente uno que parece que no viene integrado es para descargar un JSON y mostrarlo así que voy a facilitar aquí un pequeño trozo de código para mostrar que fácil es descargar un JSON y extraer sus datos.

En primer lugar diré que este tutorial necesita corutinas las cuales si no sabes como funcionan puedes visitar este enlace: Tutorial de Corutinas

Dicho esto empecemos por ver el código:

using UnityEngine;
using System.Collections;
using SimpleJSON;

class PruebaJSON : MonoBehaviour
{

 void Start()
 {
  StartCoroutine(PedirDatos());
 }

 IEnumerator PedirDatos()
 {
  WWW peticion = new WWW("http://echo.jsontest.com/key/value/one/two");

  yield return peticion;

  if (peticion.error == null || peticion.error == "")
  {

   JSONNode nodo = JSON.Parse(peticion.text);

   Debug.Log("JSON Descargado: " + nodo.ToString());

   Debug.Log(nodo["one"].Value);
   Debug.Log(nodo["key"].Value);

   foreach( JSONNode n in nodo.Childs)
   {
    Debug.Log(n.Value);
   }
  } else {
   Debug.Log("WWW error: " + peticion.error);
  }
 }
}
Expuesto el código pasaré a explicar paso por paso, para comenzar tenemos que fijarnos que en las importaciones hemos importado la clase SimpleJSON

using UnityEngine;
using System.Collections;
using SimpleJSON;
Aunque podríamos hacer esto sin plugins externos, es cierto que esto nos va a facilitar muchísimo el trabajo y nos ahorrará mucho código.

 void Start()
 {
  StartCoroutine(PedirDatos());
 }
En el evento Start llamamos a nuestra corutina para pedir datos, en este caso he llamado a la corutina escribiendo la llamada a la función en vez de texto como en el tutorial previo ya que así puedo enseñar la otra manera posible de llamar a una corutina, ahora pasemos a ver paso a paso que se hace en la corutina.

WWW peticion = new WWW("http://echo.jsontest.com/key/value/one/two");
En este primer paso estamos haciendo nuestra petición a JSON, si pinchais en el enlace podréis ver que devuelve un texto, pues ese texto cal cual será depositado en nuestra variable petición de tipo WWW.

yield return peticion;
Esto nos retornaría el valor de la web que le hemos pasado previamente.

if (peticion.error == null || peticion.error == "")
Este condicional nos dirá si la petición se ha realizado con éxito, o mejor dicho, si no nos ha dado un error, por ende, se ha realizado correctamente.

JSONNode nodo = JSON.Parse(peticion.text);
Ahora, gracias a nuestra librería SimpleJSON parseamos el texto y lo tendremos en un nodo de JSON, es tan sencillo como pasarle la petición en forma de texto y el nodo guardará el resultado del parseo.

Debug.Log("JSON Descargado: " + nodo.ToString());
Esta línea la he creado para ver que es lo que ha descargado y como se ha guardado en el nodo que como podréis comprobar es idéntico si todo ha salido bien, al enlace pulsado.

Debug.Log(nodo["one"].Value);
Debug.Log(nodo["key"].Value);
Tenemos dos nodos en este caso, one y key, los cuales contienen unos valores, pues para mostrarlos he dejado el ejemplo de como mostrar valor de nodos específicos, ¿pero que pasa si quiero mostrarlos todos y son muchos? ¿Tengo que hacer cien debugs?

La respuesta es no, aquí podemos ver como mostrar el valor de todos los nodos que tengamos, sea uno o sean cientos.

foreach( JSONNode n in nodo.Childs)
{
 Debug.Log(n.Value);
}
Como podréis ver dará el mismo resultado que lo anterior ya que solo tenemos esos dos nodos, pero en caso de tener doscientos pues mostrará doscientos valores, simplemente quería mostrar como recorrer todo el JSON.

} else {
 Debug.Log("WWW error: " + peticion.error);
}
Y por último aquí nos mostrará el error en caso de que no hayamos podido descargar los datos, espero que os sea de utilidad y haya quedado lo mas claro posible.

5 comentarios:

  1. Mas que una duda con el Codigo, es mas bien con JSON, cual es la utilildad, como se usa, para que sirve JSON en un videojuego?
    Anteriormente tenia unos archivos XML de unos ejemplo, propiedades de unos objetos, por ejemplo Armas, con las caracteisticas de ataque, slot, price, name, ...
    Es exactamente que hacer un archivo XML?

    Gracias!

    ResponderEliminar
    Respuestas
    1. Realmente la utilidad de JSON y de los XML son exáctamente la misma, puedes usarlo para guardar datos como un savedata, puedes, como en el ejemplo, descargar datos de internet, por ejemplo para un videojuego online, que tenga chat o que descargue ciertos datos de internet como guardar tu partida en un servidor, etc...

      Aunque me has dado una idea, que a pesar de tener la mísma utilidad, si que tienen ciertas diferencias y muy pronto las explicaré, ¡gracias a ti por aportar la idea aunque fuese indirectamente!

      Eliminar
  2. Muchas gracias, muy bueno el Tutorial. Pero creo que el servicio está caido o a mi no me funciona xD

    ResponderEliminar
    Respuestas
    1. Es tan sencillo como entrar en la web http://echo.jsontest.com/key/value/one/two y comprobar que datos devuelve, ciertamente esta web que usé para los test ya no me funciona, pero podrías probarlo con cualquier otra web de test de json o un servicio propio que te puedas crear.

      ¡Gracias por informar del error!

      Eliminar
  3. como podria editar los datos desde el mismo unity y guardarlos otra vez en la pagina que los he descargado?

    ResponderEliminar