在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总是空的。我不明白。我调用协程,等待结果,然后更新全局变量,但似乎我从另一个类调用它的那一刻,它还没有被更新。我该怎么办?我花了一天的时间等待一个答案。

在Unity中从WWW调用获取变量

答案

这是因为您没有等待StartCoroutine(wwwcall.getxml("http://com.example/something.php"));完成。如果StartCoroutine在没有yield return的情况下被调用,它将立即返回。因此,解决方案是等待协程完成(或者摆脱协程并等待WWW完成)。你可以这样做:

  1. 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;
            }
        }
    }
    
  2. 使用回调。这样的:

    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);
        }
    }