Esta es una de Unity3d en C# pregunta. El objetivo es crear un objeto que me puede pasar en una dirección URL y recibir datos a través de GET, un objeto que iba a crear el que sería un contenedor para la WWW lógica. También me gustaría un ‘POST’ objeto demasiado, donde podría proporcionar una dirección url y un ‘Diccionario’ de pares clave-valor como el post argumentos. Sooo… al final nos gustaría algo como esto:

get_data = GET.request("http://www.someurl.com/somefile.php?somevariable=somevalue");

Y

post_data = POST.request("http://www.someurl.com/somefile.php", post)
//Where post is a Dictionary of key-value pairs of my post arguments. 

Para intentar lograr esto, yo uso el WWW objeto. Ahora, con el fin de dar la WWW objeto de tiempo para descargar, necesitamos tener esta sucediendo en el interior de un MonoBehaviour objeto y yield los resultados. Así llegué a esta, la cual trabaja:

public class main : MonoBehavior
{
    IEnumerator Start()
    {
        WWW www = new WWW("http://www.someurl.com/blah.php?action=awesome_stuff"); 
        yield return www;
        Debug.Log(www.text);
    }
}

Lo que realmente quiero es este:

public class main : MonoBehavior
{
    IEnumerator Start()
    {
        GET request = new GET("http://www.someurl.com/blah.php?action=awesome_stuff"); 
        Debug.Log(request.get_data()); //Where get_data() returns the data (which will be text) from the request.   
    }
}

Ahora tengo el script principal conectado a la única GameObject en la jerarquía (la raíz). Necesito tener la GET script vinculado a la raíz GameObject así? Puedo hacer que de forma dinámica a partir de main?

En última instancia, necesito una solución que me permite enviar fácilmente GET y POST solicitudes.

Saludos!

3 Comentarios

  1. 17

    Ah, lo Tengo!

    Mi problema era un malentendido de cómo MonoBehaviour y Corrutinas trabajado. La solución es muy simple.

    En el editor, haga un GameObject vacío. Lo he denominado DB. A continuación, adjuntar la siguiente secuencia de comandos es:

    using System;
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    class DB : MonoBehaviour
    {
        void Start() { }
    
        public WWW GET(string url)
        {
            WWW www = new WWW(url);
            StartCoroutine(WaitForRequest(www));
            return www;
        }
    
        public WWW POST(string url, Dictionary<string, string> post)
        {
            WWWForm form = new WWWForm();
            foreach (KeyValuePair<String, String> post_arg in post)
            {
                form.AddField(post_arg.Key, post_arg.Value);
            }
            WWW www = new WWW(url, form);
    
            StartCoroutine(WaitForRequest(www));
            return www;
        }
    
        private IEnumerator WaitForRequest(WWW www)
        {
            yield return www;
    
            //check for errors
            if (www.error == null)
            {
                Debug.Log("WWW Ok!: " + www.text);
            }
            else
            {
                Debug.Log("WWW Error: " + www.error);
            }
        }
    }

    Entonces, en la principal de su secuencia de comandos de inicio de la función, usted puede hacer esto!

    private DB db;
    void Start()
    {
        db = GameObject.Find("DB").GetComponentInChildren<DB>();
        results = db.GET("http://www.somesite.com/someAPI.php?someaction=AWESOME");
        Debug.Log(results.text);
    }

    No he probado las solicitudes POST, pero ahora toda la lógica está envuelto! Enviar solicitudes HTTP a su deseo de corazón, saludos!

    • gran problema, aunque en utilizar el método de búsqueda es que va a tener un gran éxito en el rendimiento de su juego…. tratando de encontrar un objeto de juego…. echa un vistazo agradable enlace sobre cómo trabajar con los delegados de la unifycommunity.com/wiki/…
    • Absolutamente correcto. Lo ideal sería seguir la pista de los objetos a través de la variable de referencia, y colgar en él de modo que usted sólo necesita hacer esto una vez. O si un gameobject en la escena es el uso de este contenedor, usted podría tener un público var que se le puede asignar el DB IR en el editor de Unity, entonces usted no necesita encontrar nada!
    • No creo que esto funciona en realidad. Cuando usted está haciendo: StartCoroutine(WaitForRequest(petición) de Depuración.Registro de solicitud.de texto) Si la solicitud no está hecho todavía sólo la corutina se detuvo, no la función real. La Depuración.Registro de solicitud.de texto) será llamado antes de que la solicitud ha terminado.
    • Tiberiu que es correcto. Usted necesidad de utilizar una función de devolución de llamada.
    • Es posible que este es obsoleto para la Unidad 5?
    • donde se WaitForRequest de? No puedo acceder a ella por la unidad 5.2
    • Se define a la derecha debajo de los POST de la función, con pequeños mensajes diciendo si o no la solicitud completada.

  2. 2

    Lo que OBTENER la secuencia de comandos que se está refiriendo? La clase WWW permite recuperar OBTENER datos bien, la información que usted necesita está en la propiedad text de la instanciado el objeto WWW. Aquí está la documentación:

    http://unity3d.com/support/documentation/ScriptReference/WWW-text.html
    http://unity3d.com/support/documentation/ScriptReference/WWW.html

    Todo lo que necesitas hacer es ceder el objeto WWW, como lo está haciendo ahora, y luego de leer cualquiera de las propiedades que te interesan, simple y llanamente, no hay clases extra necesario.

    Como para el envío de un POST objeto, que es lo que la WWWForm clase es para:

    http://unity3d.com/support/documentation/ScriptReference/WWWForm.html

    En definitiva, sólo tiene que crear un WWWForm objeto, agregar campos a través de AddField(), y luego simplemente la construcción de un nuevo objeto WWW con la dirección URL de POST & el ex objeto, que es. El rendimiento de la WWW objeto y una vez que se vuelve estás de datos ha sido enviado. Las respuestas son, de nuevo, en la propiedad text & errores en el campo correspondiente. Llanura, clean & simple.

    HTH!

    • Lo sentimos, el objeto es de la clase que encapsula la lógica de WWW. La ventaja de ser todo lo que necesitas hacer es proporcionar una dirección URL y recibir un resultado. No estoy seguro de si eso es posible teniendo en cuenta cómo la unidad funciona sin embargo. Voy a editar mi pregunta.
  3. 0

    Aquí es @pandemoniumsyndicate del código modificado para agregar una devolución de llamada. El código original no es completamente correcto, ya que el GET y POST funciones de salida inmediatamente después de llamar a la corutina. En ese momento es probable que el WWW solicitud aún no está completa y acceder a cualquier campo excepto (www.isDone) es inútil.

    El siguiente código define un delegado, WWWRequestFinished, que será llamado cuando la solicitud se ha terminado con el resultado de la petición y los datos recibidos, si los hubiere.

    using System;
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    public class WWWRequestor : MonoBehaviour 
    {
    Dictionary<WWW, object> mRequestData = new Dictionary<WWW, object>();
    public delegate void WWWRequestFinished(string pSuccess, string pData);
    void Start() { }
    public WWW GET(string url, WWWRequestFinished pDelegate)
    {
    WWW aWww = new WWW(url);
    mRequestData[aWww] = pDelegate;
    StartCoroutine(WaitForRequest(aWww));
    return aWww;
    }
    public WWW POST(string url, Dictionary<string, string> post, WWWRequestFinished pDelegate)
    {
    WWWForm aForm = new WWWForm();
    foreach (KeyValuePair<String, String> post_arg in post)
    {
    aForm.AddField(post_arg.Key, post_arg.Value);
    }
    WWW aWww = new WWW(url, aForm);
    mRequestData[aWww] = pDelegate;
    StartCoroutine(WaitForRequest(aWww));
    return aWww;
    }
    private IEnumerator WaitForRequest(WWW pWww)
    {
    yield return pWww;
    //check for errors
    string aSuccess = "success";
    if (pWww.error != null)
    {
    aSuccess = pWww.error;
    }
    WWWRequestFinished aDelegate = (WWWRequestFinished) mRequestData[pWww];
    aDelegate(aSuccess, pWww.text);
    mRequestData.Remove(pWww);
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here