从Unity中的另一个脚本调用IEnumerator方法并获取其返回值

时间:2018-10-09 00:17:50

标签: c# unity3d

我正在Unity中进行一个项目。我有这个文件:

API.cs (未附加到任何GameObject)

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using LitJson;

public class API : MonoBehaviour
{

    public IEnumerator Login(string email, string psw)
    {
        string URL = "https://####.azurewebsites.net/api/login";
        WWWForm form = new WWWForm();
        form.AddField("email", email);
        form.AddField("password", psw);

        var download = UnityWebRequest.Post(URL, form);

        // Wait until the download is done
        yield return download.SendWebRequest();

        if (download.isNetworkError || download.isHttpError)
        {
            print("Error downloading: " + download.error);
        }
        else
        {
            JsonData data = JsonMapper.ToObject(download.downloadHandler.text);
            string token = (string)data["success"]["token"];
            Debug.Log(token);
        }
    }
}

caller.cs (附加到当前场景中的GameObject)

    private void Start ()
    {
        // Something like this
        var token = API.Login("foo@boo.com", "####");
    }

我的问题是:如何在caller.cs中调用“登录”功能并检索令牌的值?


我尝试过但没有起作用的内容:

  • 为脚本public API test;创建一个变量,然后为test.Login("foo@boo.com", "####")
  • 使API类静态化,在caller.cs中初始化该类,然后调用方法Login(...)

编辑1:

能够解决从另一个脚本调用该方法的问题,问题是我必须创建一个对象并将其附加到API.cs。然后,我还必须将该对象拖放到检查器中的caller.cs的公共字段中。此外,我还必须在StartCoroutine()中添加caller.cs中的Login方法。

仍然,现在必须弄清楚如何从Login()方法中检索令牌的值。

1 个答案:

答案 0 :(得分:3)

  

能够解决从另一个调用方法的问题   脚本,问题是我必须创建一个对象并附加到   它是API.cs。然后我还不得不在公共场所拖放该对象   检查器中的caller.cs字段。

在编辑器中手动拖放脚本听起来并不正确,因为您的目标是使用from脚本。 API脚本是MonoBehaviour,因为它是从脚本派生的。使用AddComponent添加API类,然后在登录功能上调用StartCoroutine

API api = gameObject.AddComponent<API>();
StartCoroutine(api.Login("foo@boo.com", "####"));

删除MonoBehaviour,这样就不必将API脚本附加到GameObject上,而是使用new关键字创建new对象。

public class API 
{

    public IEnumerator Login(string email, string psw)
    {
        ....
    }
}

否,您可以简单地做到:

API api = new API();
StartCoroutine(api.Login("foo@boo.com", "####"));

最后,要返回该值,请添加Action作为第三个参数。

public class API
{

    public IEnumerator Login(string email, string psw, Action<string> token)
    {
        string URL = "https://####.azurewebsites.net/api/login";
        WWWForm form = new WWWForm();
        form.AddField("email", email);
        form.AddField("password", psw);

        var download = UnityWebRequest.Post(URL, form);

        // Wait until the download is done
        yield return download.SendWebRequest();

        if (download.isNetworkError || download.isHttpError)
        {
            Debug.Log("Error downloading: " + download.error);
        }
        else
        {
            JsonData data = JsonMapper.ToObject(download.downloadHandler.text);
            string tokenResult = (string)data["success"]["token"];
            Debug.Log(tokenResult);
            if (token != null)
                token(tokenResult);
        }
    }
}

要从您的非协程函数调用它:

API api = new API();
StartCoroutine(api.Login("foo@boo.com", "####", (token) =>
{
    Debug.Log("Token: " + token);
}
));