C# 从Unity中的另一个脚本调用IEnumerator方法并获取其返回值
我在Unity做一个项目。我有这个档案: API.cs(没有附加到任何游戏对象) caller.cs(连接到当前场景中的游戏对象) 我的问题是:如何调用caller.cs中的函数“Login”并检索令牌的值?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: 能够解决从另一个脚本调用方法的问题,问题是我必须创建
我尝试过但没有成功的地方:
- 为脚本
公共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);
}
));