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

C# 从Unity中的另一个脚本调用IEnumerator方法并获取其返回值,c#,unity3d,C#,Unity3d,我在Unity做一个项目。我有这个档案: API.cs(没有附加到任何游戏对象) caller.cs(连接到当前场景中的游戏对象) 我的问题是:如何调用caller.cs中的函数“Login”并检索令牌的值? 我尝试过但没有成功的地方: 为脚本公共API测试创建一个变量然后test.Login(“foo@boo.com“,“#####”” 将API类设为静态,在caller.cs中对类进行序列化,然后调用方法Login(…) 编辑1: 能够解决从另一个脚本调用方法的问题,问题是我必须创建

我在Unity做一个项目。我有这个档案:

API.cs(没有附加到任何游戏对象)

caller.cs(连接到当前场景中的游戏对象)

我的问题是:如何调用caller.cs中的函数“Login”并检索令牌的值?


我尝试过但没有成功的地方:

  • 为脚本
    公共API测试创建一个变量然后
    test.Login(“foo@boo.com“,“#####””
  • 将API类设为静态,在caller.cs中对类进行序列化,然后调用方法Login(…)

编辑1:

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

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

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

在编辑器中手动拖放脚本听起来不太正确,因为您的目标是处理来自脚本。
API
脚本是一个
monobhavior
,因为它源于它。使用
AddComponent
添加
API
类,然后在登录函数上调用
startcroutine

API api = gameObject.AddComponent<API>();
StartCoroutine(api.Login("foo@boo.com", "####"));
不,你可以简单地做:

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

这是一个非常好的解决方法。非常感谢@Programmer。总之,只有一件小事:这里有一个小错误
stringtoken=(string)data[“success”][“token”]因为变量标记已被使用。只需在那里和它出现的任何地方重命名它。再次感谢你,伙计,干杯!是的。没有注意到使用变量的问题,但很高兴您解决了它。我还编辑了答案来解决这个问题。不客气!
public class API 
{

    public IEnumerator Login(string email, string psw)
    {
        ....
    }
}
API api = new API();
StartCoroutine(api.Login("foo@boo.com", "####"));
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);
}
));