Unity WWW在WebGL中失败

时间:2017-07-13 02:53:33

标签: c# json unity3d unity-webgl

我有一个在WebGL中运行时失败的类,但它在UNITY IDE(5.6.1f1个人(Plus)版)中工作。)代码被修剪了'下面,但产生相同的特征(作为WebGL失败并且在UNITY IDE中没有问题。)我将此指向服务URL并在测试时获得正确的响应,但Post实际上从未发生过从WebGL运行时,如果没有收到响应(甚至没有错误),它将崩溃。我想从社区获得想法(也许我需要设置一个特定的构建参数或修改代码实现?)有用的反馈将非常感激。谢谢。

-------------------- Wrapper和JSON Utility Classes ----------------

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonTest : MonoBehaviour {

    JsonCommunicationManager jsonComm;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    public void OnMouseDown()
    {

        var jsonCommunications = gameObject.AddComponent<JsonCommunicationManager>();
        string tempReturn = jsonCommunications.PostStartUpRequest("{\"userId\":1,\"id\":1}");
        Debug.Log("JSON RequestStartParms: Response :  " + tempReturn);

    }
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonCommunicationManager : MonoBehaviour
{

    private WWW wwwForm;


    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    public string PostStartUpRequest(string JsonPostMessage)
    {

        Debug.Log("Inside PostMessage:");

        string JsonReturnMessage;

        StartCoroutine(PostWWWMessage(JsonPostMessage));

        bool boolResponse = false;

        do
        {
            Debug.Log("Checking for Response ");
            try
            {
                JsonReturnMessage = wwwForm.text;
                boolResponse = true;
            }
            catch
            {
                WaitForResponse();
                Debug.Log("Inside JsonPost Message:  WAIT");
            }
        } while (!boolResponse);

        JsonReturnMessage = wwwForm.text;

        Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
        Debug.Log("Inside JsonPost Message: Messgae Response Data: " + JsonReturnMessage);
        Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
        Debug.Log("Inside JsonPost Message: Messgae Response Error: " + wwwForm.error);
        Debug.Log("Inside JsonPost Message: Messgae Response Received: ");

        return JsonReturnMessage;
    }

    //private void PostWWWMessage(string JsonPostMessage) {
    private IEnumerator PostWWWMessage(string JsonPostMessage)
    {

        Debug.Log("Inside PostWWWMessage:");
        Dictionary<string, string> headers = new Dictionary<string, string>();
        headers.Add("Content-Type", "application/json");
        byte[] postData = System.Text.Encoding.ASCII.GetBytes(JsonPostMessage.ToCharArray());
        string fullyQualifiedURL = "https://jsonplaceholder.typicode.com/posts";

        Debug.Log("Inside PostWWWMessage: Posting Message: " + JsonPostMessage);
        print("Posting start up request to: " + fullyQualifiedURL);
        print("Post Data is:                " + postData);
        print("Post Header is:              " + headers);
        wwwForm = new WWW(fullyQualifiedURL, postData, headers);

        WaitForResponse();

        yield return null;

    }

    private IEnumerator WaitForResponse()
    {
        yield return new WaitForSeconds(1);
    }



}

1 个答案:

答案 0 :(得分:2)

当您尝试在不了解协程的情况下构建完整程序时会发生这种情况。我鼓励您创建一个新项目,找到一个协程教程并研究它是如何工作的。我认为这是了解协程的最佳方式。

代码中的错误:

1 。请在协同程序的void函数中等待。这是您在WaitForResponse()函数内调用PostStartUpRequest的地方。这将等待,因为PostStartUpRequest是一个void函数。将PostStartUpRequest设为IEnumerator函数,然后等待yield return WaitForResponse();

2 。在while函数中有一个void循环,等待另一个变量状态在另一个函数中更改。 while (!boolResponse);不是一个好主意,除非你是从另一个线程做到的,但你不是。这会冻结Unity,因为你没有给其他函数运行机会。您可以通过在while循环中添加yield return null;来解决此问题,该循环在每次检查后等待帧。这允许运行其他功能。您必须将PostStartUpRequest功能更改为IEnumerator功能才能执行此操作。

do
{
    //Wait for a frame
    yield return null;
    ....
} while (!boolResponse);

你可能会遇到崩溃。

3 。当您从WaitForResponse();函数调用PostWWWMessage函数等待 1 秒时,那不应该工作因为你屈服。您必须等待WaitForResponse()功能完成等待。你通过屈服来做到这一点。

应该是yield return WaitForResponse();而不是WaitForResponse()

4 。没有正确等待WWW请求完成。 Webrequest取决于设备和互联网的速度。有时,它可能需要超过您等待的秒数。您必须提出WWW请求而不是1秒钟。

//Make request
wwwForm = new WWW(fullyQualifiedURL, postData, headers);
//Wait for request to finish
yield return wwwForm;

//Now you can safely use it:
JsonReturnMessage = wwwForm.text;

5 。在访问网络请求结果之前,请勿检查错误。

您需要在访问结果之前检查可能的错误,否则会发生任何事情,例如从服务器接收null值。

if (String.IsNullOrEmpty(wwwForm.error))
{
   //No Error. Access result
    JsonReturnMessage = wwwForm.text;
}else{
   //Error while making a request
   Debug.Log(wwwForm.error);
}

最后,我无法说明为什么你有这么多函数来处理简单的Web请求。只需使用一个功能即可。

private WWW wwwForm;

// Use this for initialization
void Start()
{
    StartCoroutine(PostWWWMessage("Test"));
}

//private void PostWWWMessage(string JsonPostMessage) {
public IEnumerator PostWWWMessage(string JsonPostMessage)
{

    Debug.Log("Inside PostWWWMessage:");
    Dictionary<string, string> headers = new Dictionary<string, string>();
    headers.Add("Content-Type", "application/json");
    byte[] postData = System.Text.Encoding.ASCII.GetBytes(JsonPostMessage.ToCharArray());
    string fullyQualifiedURL = "https://jsonplaceholder.typicode.com/posts";

    Debug.Log("Inside PostWWWMessage: Posting Message: " + JsonPostMessage);
    print("Posting start up request to: " + fullyQualifiedURL);
    print("Post Data is:                " + postData);
    print("Post Header is:              " + headers);
    wwwForm = new WWW(fullyQualifiedURL, postData, headers);
    //Wait for the request
    yield return wwwForm;

    string JsonReturnMessage;
    //Check for error
    if (String.IsNullOrEmpty(wwwForm.error))
    {
        //No Error. Access result
        JsonReturnMessage = wwwForm.text;
        Debug.Log("Received: " + JsonReturnMessage);
    }
    else
    {
        //Error while making a request
        Debug.Log(wwwForm.error);
    }
}