我可以看到这个函数的返回类型是 IEnumerator,并注意到 'request.SendWebRequest();' 返回一个任务。所以解决这个问题的第一件事是删除泛型类型,就像这样:
private IEnumerator<string> SendPostWebRequest(){....}
另一方面,您需要返回一个字符串。根据 Unity 的文档,以下代码应该适用于函数不是协程的情况:
string str = (string) SendPostWebRequest(...);
这将强制转换 IEnumerator 中产生的所有元素,并将返回其上的第一个字符串元素。
但是,这是一个协程,根据我的经验,这不起作用。我想出并且我通常使用的解决方案是使用 lambda 函数。
要解决这个问题,您需要向函数添加一个额外的参数,即一个 Action(基本上是函数引用),以便您可以从 SendPostWebRequest() 函数执行它。我听起来很困惑,但看看这段代码。这就是我通常实现这种事情的方式。
public void ExampleFunction(){
// Using lambda function
StartCoroutine(SendPostWebRequest("www.google.es", (string ReturnResult)=>
Debug.Log(ReturnResult)
));
// Using functions references
StartCoroutine(SendPostWebRequest("www.google.es", OtherResultManagementFunction));
}
private void OtherResultManagementFunction(string ReturnResult){
Debug.Log(ReturnResult);
}
private IEnumerator SendPostWebRequest(string url, Action<string> FinishDelegate)
{
WWWForm form = new WWWForm();
form.AddField("Key", "Value");
using (UnityWebRequest request = UnityWebRequest.Post(url, form))
{
yield return request.SendWebRequest();
if (!request.isNetworkError && !request.isHttpError && request.isDone)
yield return request.downloadHandler.text;
FinishDelegate("WHATEVER STRING");
}
}
泛型Action指定了封装在Action对象中的函数的返回时间。
两个协程的工作方式完全相同,但第一个使用 lambda 函数,另一个使用函数引用。如果执行,两者都将打印从 webrequest 返回的字符串(在本例中为“WHATEVER STRING”)。
希望这对你有用,在大多数情况下,这对我来说是最好的解决方案。