c# - cref - Unidad: debe devolver el valor solo después de que termine la rutina
remarks c# (2)
Las funciones no esperan a las corutinas antes de regresar, sin embargo, podría usar una Acción para dar algún tipo de retorno.
Pon esto en tu función de Inicio
WWW www = new WWW("http://google.com");
StartCoroutine(WaitForRequest(www,(status)=>{
print(status.ToString());
}));
y agrega esto.
private IEnumerator WaitForRequest(WWW www,Action<int> callback) {
int tempInt = 0;
yield return www;
if (string.IsNullOrEmpty(www.error)) {
if(!string.IsNullOrEmpty(www.text)) {
tempInt = 3;
}
else {
tempInt=2;
}
} else {
print(www.error);
tempInt=1;
}
callback(tempInt);
}
Intente esto, aunque la función puede cambiar un valor, no devuelve un valor y solo tiene un único parámetro. Así que, en esencia, esta no es una solución para devolver su rutina; sin embargo, una vez recibida la int de la rutina, podemos justificar qué hacer con ella e incluso llamar a otras funciones desde la devolución de llamada.
StartCoroutine(WaitForRequest(www,(status)=>{
print(status.ToString());
Awake(); // we can call other functions within the callback to use other codeblocks and logic.
if(status != 0)
print("yay!");
}
));
Esto podría ser de utilidad para usted. http://answers.unity3d.com/questions/744888/returning-an-ienumerator-as-an-int.html
Estoy trabajando en un juego en la unidad y encontré un problema que no puedo resolver. Me estoy conectando a un servidor web a través de un objeto WWW estándar y estoy usando una rutina para ejecutar una solicitud POST.
El código en sí mismo funciona, pero necesito actualizar un valor de variable y devolver esa variable una vez que finaliza la rutina, lo que no puedo hacer.
public int POST(string username, string passw)
{
WWWForm form = new WWWForm();
form.AddField("usr", username);
form.AddField("pass", passw);
WWW www = new WWW(url, form);
StartCoroutine(WaitForRequest(www));
//problem is here !
return success_fail;
}
private IEnumerator WaitForRequest(WWW www)
{
yield return www;
if (www.error == null)
{
if(www.text.Contains("user exists"))
{
success_fail = 2;
}
else
{
success_fail=1;
}
} else {
success_fail=0;
}
}
La rutina actualiza el valor de ''success_fail'' con el valor relevante. Pero el ''return success_fail;'' La línea del método POST se ejecuta antes de que finalice la rutina, lo que hace que devuelva un valor falso.
Intenté usar una rutina adicional, pero sin éxito, supongamos que también tuve un error allí. ¿Cómo puedo devolver el valor ''success_fail'' solo después de que termine la rutina?
Gracias.
Solo una corutina puede esperar a otra corutina. Como debe esperar a la rutina que inició (WaitForRequest), significa que debe convertir POST para que sea una rutina y no podrá devolver int.
Parece que success_fail es una variable miembro, por lo que si está expuesto a quien inicia POST (como una rutina), no necesitará devolverlo de todos modos.
public int success_fail
IEnumerator POST(string username, string passw)
{
WWWForm form = new WWWForm();
form.AddField("usr", username);
form.AddField("pass", passw);
WWW www = new WWW(url, form);
yield return StartCoroutine(WaitForRequest(www));
}
private IEnumerator WaitForRequest(WWW www)
{
yield return www;
if (www.error == null)
{
if(www.text.Contains("user exists"))
{
success_fail = 2;
}
else
{
success_fail=1;
}
} else {
success_fail=0;
}
}
Básicamente, si desea que su código "espere", tiene que ser una rutina. No puede hacer una llamada que espere sin bloquear todo el motor (sin algún tipo de pirateo de bucles).
Este hilo proporciona una forma en la que podría devolver el int de su rutina si realmente lo necesita, pero POST aún no puede ser una llamada de bloqueo ...
http://answers.unity3d.com/questions/24640/how-do-i-return-a-value-from-a-coroutine.html