我正在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", "####")
编辑1:
能够解决从另一个脚本调用该方法的问题,问题是我必须创建一个对象并将其附加到API.cs。然后,我还必须将该对象拖放到检查器中的caller.cs的公共字段中。此外,我还必须在StartCoroutine()中添加caller.cs中的Login方法。
仍然,现在必须弄清楚如何从Login()方法中检索令牌的值。
答案 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);
}
));