在Unity中从WWW调用获取变量
本文关键字:获取 变量 调用 WWW Unity 中从 | 更新日期: 2023-09-27 18:04:26
我有一个PHP函数返回XML数据。我使用c# Unity来检索数据到字符串变量。我已经这样做了。
在Requestwww类中我有
public static text;
public IEnumerator WaitForRequest(WWW www)
{
yield return www;
// check for errors
if (www.error == null)
{ //Here I store result in a global variable
text=www.text;
Debug.Log("WWW Ok!: " + text);
}
else
{
Debug.Log("WWW Error: " + www.error);
}
}
public IEnumerator getxml(string url )
{
WWW www = new WWW(url);
if (www == null)
{
Debug.Log("www is null");
}
else {
Debug.Log("www is not null");
}
yield return StartCoroutine(WaitForRequest(www));
Debug.Log("xmltext here" + text);
}
在另一个类中,我调用getxml()来启动www请求
Request wwwcall = gameObject.AddComponent<Requestwww>();
StartCoroutine(wwwcall.getxml("http://com.example/something.php")
//Here I tried to access the xmltext variable in Requestwww class
Debug.Log("retrived var"+Requestwww.text)
//But text seems tobe null
但是看起来,当从另一个类重试时,变量Requestwww.text总是空的。我不明白。我调用协程,等待结果,然后更新全局变量,但似乎我从另一个类调用它的那一刻,它还没有被更新。我该怎么办?我花了一天的时间等待一个答案。
答案
这是因为您没有等待StartCoroutine(wwwcall.getxml("http://com.example/something.php"));
完成。如果StartCoroutine在没有yield return
的情况下被调用,它将立即返回。因此,解决方案是等待协程完成(或者摆脱协程并等待WWW完成)。你可以这样做:
-
In Update method。这样的:
public class RequestWWW { public bool IsDone { get; private set; } public string Text { get; private set; } public string Error { get; private set; } public IEnumerator GetXMLCoroutine(string url) { WWW www = new WWW(url); yield return www; IsDone = true; Error = www.error; Text = www.text; } } public class YourClass: MonoBehaviour { private RequestWWW wwwcall; private void SomeMethod() { wwwcall = new RequestWWW(); StartCoroutine(wwwcall.GetXMLCoroutine("http://ya.ru")); } public void Update() { if (wwwcall != null && wwwcall.IsDone) { Debug.Log(wwwcall.Error); Debug.Log(wwwcall.Text); wwwcall = null; } } }
-
使用回调。这样的:
public static class RequestWWW { public delegate void RequestFinishedHandler(string error, string text); public static IEnumerator GetXMLCoroutine(string url, RequestFinishedHandler onFinish) { WWW www = new WWW(url); yield return www; if (onFinish != null) onFinish(www.error, www.text); } } public class YourClass: MonoBehaviour { private void SomeMethod() { StartCoroutine(RequestWWW.GetXMLCoroutine("http://ya.ru/", RequestFinished)); } private void RequestFinished(string error, string text) { Debug.Log(error); Debug.Log(text); } }